Action Goal:\n\nActions Required:\n\nMaterials Needed:\n\nTime Estimate:\n\nAdd Due Date & Progress Reports: <<newReminder>>
Action Goal:\n\nActions Required:\n\nMaterials Needed:\n\nTime Estimate:\n\nAdd Due Date & Progress Reports: <<newReminder>>
\n<<gtdActionList>>
Tasks to be done while I am at my computer:\n\n<<gtdActionList>>
<<gtdActionList>>
Default description for new context (which you can change by editing the [[NewContextTemplate]]). You can edit this description as you like, but be sure to include the {{{gtdActionList}}} macro somewhere to see the active actions.\n\n<<gtdActionList>>
<<newerTiddler button:"Dump Brain" name:"New Dump" tags:"@inbox action">> \nAll that stuff I need to put into a project and/or context\n!Actions\n<<gtdActionList>>\n!Non-Actions\n<<tiddlerList tags:"@inbox,-action">>
Just my written thoughts\n!Actions\n<<gtdActionList>>\n!Non-Actions\n<<tiddlerList tags:"@journal,-action">>
Default description for new context (which you can change by editing the [[NewContextTemplate]]). You can edit this description as you like, but be sure to include the {{{gtdActionList}}} macro somewhere to see the active actions.\n\n<<gtdActionList>>
\n<<gtdActionList>>
Stuff to do at or for work\n!Actions\n<<gtdActionList>>\n!Non-Actions\n<<tiddlerList tags:"@inbox,-action">>
!Welcome to your ''tiddlyspot.com'' ~TiddlyWiki!\n''[[tiddlyspot.com|http://tiddlyspot.com]]'' gives you an instant [[TiddlyWiki|http://tiddlywiki.com]] hosted on our ''tiddlyspot.com'' servers.\n\nWant to work online? No problem, you can go to your ''tiddlyspot.com'' URL (which is http://tiddlyspot.com/BrainDump/index.html ) and start editing. Click "save to web" and your changes are saved directly to your ''tiddlyspot.com'' home -- no messing about with local files or ftp.\n\nWant to work offline? No problem, your ''tiddlyspot.com'' ~TiddlyWiki is a real, fully functioning ~TiddlyWiki that you can save onto your hard drive or USB stick. Use the link below to save to your local computer. As you make changes, use the "save to disk" button to save to your local file. Whenever you're ready to sync up again, just click "save to web".\n\n!To save online\nEnter the upload password provided when you created your ~TiddlyWiki. Then click the "save to web" button below (or in the right side column) to save your ~TiddlyWiki.\nUpload Password: <<option pasUploadPassword>>\n<<upload http://tiddlyspot.com/BrainDump/store.php index.html . . BrainDump>>\n\n!To save offline\nTo take this ~TiddlyWiki offline, right click on this link: http://tiddlyspot.com/BrainDump/index.html and choose "save as.."\n\n!Learn more about ~TiddlyWiki\nFind out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki.\n\nThe [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]] is an excellent place to ask questions and get help.\n\n!Enjoy!\nWe hope you like using your ''tiddlyspot.com'' ~TiddlyWiki. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments.\n\n----
<<gtdActionList @>>
Agressive thinking is a system in which one always assumes 'yes', until told 'no'. A perfect example of this is a teenage male making out with a girl, always pushing his partners boundries.
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Ken Girard]], [[Jason Gish]], [[Tim Metza]], [[Cayce Duda]] & [[Tiana Duda]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<<reminder firstyear:1963 month:10 day:23 title:"Alesia's Birthday" >> \n<<reminder firstyear:1996 month:9 day:19 title:"Alesia & Ken's first met" >>\n<data>{"firstname":"Alesia","lastname":"Clardy","cellphone":"314-322-6372","workphone":"314-387-5066","homephone":"636-255-0665","imhandle":"ldyalia (aim)","website":"http://www.focusedattention.com","address":"3204 Town & Country Lane","city":"St. Charles","state":"MO","zip":"63301","country":"USA","e-mail1":"ldyalia","e-mail2":"gmail.com"}</data>\n
Details go here\n\n<<reminder date:17 month:7 year:2006 title:"Alesia leaves for training">>\n<<reminder date:31 month:7 year:2006 title:"Alesia gets back">>
Cincinnati Room \n\n<<reminder date:21 month:07 year:2006 title:"11:00am - Cincinnati Room">>
/***\n|''Name:''|AlternateBackupPlugin|\n|''Version:''|1.0.2 (6-Mar-2006)|\n|''Source:''||\n|''Author:''|Kyle Hale|\n|''Type:''|Plugin|\n!Description\nHijacks core backupPath function, replacing the datetime naming system\nwith a rotating set of backups, whose number is limited by the user.\n\n!File last saved\nLast saved: <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n\n!Issues/Todos\n* Possible to insert an option into the AdvancedOptions Tiddler? That'd\nmake editing the number of backups that much easier.\n\n!Revision History\n* 1.0.2 (6-Mar-2006)\n** Fixed variables to so they carry over\n* 1.0.1 (3-Mar-2006)\n** Wrote code, totally stole [[Simon|SimonBaird]]'s documentation\nsystem\n\n!Code\n***/\n//{{{\nif (!config.options.txtMaxBackups) config.options.txtMaxBackups="10";\nif (!config.options.txtCurrentBackup)\nconfig.options.txtCurrentBackup="1"; \n\ngetBackupPath = function(localPath)\n{\n var backSlash = true;\n var dirPathPos = localPath.lastIndexOf("\s\s");\n if(dirPathPos == -1)\n {\n dirPathPos = localPath.lastIndexOf("/");\n backSlash = false;\n }\n var backupFolder = config.options.txtBackupFolder;\n if(!backupFolder || backupFolder == "")\n backupFolder = ".";\n var backupPath = localPath.substr(0,dirPathPos) + (backSlash ? "\s\s" :\n"/") + backupFolder + localPath.substr(dirPathPos);\n backupNum = config.options["txtCurrentBackup"];\n backupNum++;\n if (backupNum>config.options["txtMaxBackups"]) {\n backupNum=1;\n }\n backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + "." +backupNum + ".html";\n config.options["txtCurrentBackup"]=backupNum;\n saveOptionCookie("txtCurrentBackup");\n return backupPath;\n}\n//}}}\n\n
To make this system operate more efficiently, you should periodically archive completed projects and actions. When a project or action is archived, it is merely tagged in a special way to get it "out of sight", but all the information in the project and action tiddlers is preserved. This is important if you need to go back and find something. Click one of these buttons to view the current <<tag project-archive>> or <<tag action-archive>>.\n\n** Click <<gtdArchive archive>> if you would like to archive all completed projects and actions now.\n** Click <<gtdArchive unarchive>> if you would like to unarchive all previously archived projects and actions now.\n\nIf you are sure that you do not want to retain archived projects and actions, you can purge them completely from the system. //Once these archived items are removed, the only way they can be put back in is through manual importing or copy/paste.// ''For your safety, your file will be saved and a backup file will be automatically generated before an archive purge is performed.''\n\n** Click <<gtdArchive purge>> if you would like to purge your archive now.
|Name |Kim Fritts |\n|Company |Ash & Griffin Pottery |\n|E-mail |kafritts@earthlink.net |\n|Website |http://www.ashandgriffin.com |\n|Home Phone | |\n|Cell Phone | |\n|Work Phone |(314) 423-9439 |\n|Address |8737 Olden Avenue |\n|Address2 | |\n|City ST |St. Louis, MO |\n|Zipcode |63114 |\n|Notes | |\n|Other notes | |\n\n<<formTiddler [[MerchantFormTemplate]]>><data>{"companyname":"Ash & Griffin Pottery","boothname":"Ash & Griffin Pottery","contactname":"Kim Fritts","email":"kafritts@earthlink.net","phone":"314-423-9439","address":"8737 Olden Ave","city":"St. Louis","state":"MO","zip":"63114","webpage":"http://www.ashandgriffin.com","notes":"Returning Merchant","product":"Pottery (Normally makes the suvoiner mugs)"}</data>
\n|Home Phone: | |\n|Cell Phone: | |\n|Work Phone: | |\n|E-mail: | <<email krysta_jade64 at yahoo dot com>>|\n|IM Handle: | |\n|Website: | http://www.livejournal.com/users/scwmorbidangel/|\n|Address: | |\n|City, State, Zip: | St. Charles, MO|\n\nBirthdate: <<reminder month:4 day:29 title="AshleyHill B-Day">>\n\n!Details:\nRed Head. Underage. Flirt. \n\nSee: \n
http://www.cfcl.com/vlb/Me/aspects.php\n\nThis along with [[MY PERSONAL VALUES]] & [[MY TALENTS]] are things I am working on creating my own copies of. Someday it will get completed (maybe). \n\n# do one for me\n# show to frank as an idea of something to send out before hand to sites. SOmething to help get them in the mood of thinking about themselves.
<<newReminder>>\n\n<<reminder year:2006 month:7 day:24 title:"am8-8pm Band Camp" >>\n<<reminder year:2006 month:7 day:25 title:"am8-8pm Band Camp" >>\n<<reminder year:2006 month:7 day:26 title:"am8-8pm Band Camp" >>\n<<reminder year:2006 month:7 day:27 title:"am8-8pm Band Camp" >>\n<<reminder year:2006 month:7 day:28 title:"am8-8pm Band Camp" >>\n<<reminder year:2006 month:7 day:31 title:"am8-12pm Band Camp" >>\n<<reminder year:2006 month:8 day:1 title:"am8-12pm Band Camp" >>\n<<reminder year:2006 month:8 day:2 title:"am8-12pm Band Camp" >>\n<<reminder year:2006 month:8 day:3 title:"am8-12pm Band Camp" >>\n<<reminder year:2006 month:8 day:3 title:"pm7 Parent Preview" >>
<<showReminders tag:"MarchingBand" format:"|DATE|DIFF|TITLE|TIDDLER|">>
Home Phone: \nCell Phone: 636-566-6654\nWork Phone: 314-387-5039\nE-mail: <<email BJHoward at magellanhealth dot com>>\nIM Handle: \nWebsite: \nAddress: \nCity, State, Zip: \n\nBirthdate: \n
Bud Lt (6pack), Woodchuck (6pack)
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Jamie Blanke]]\n\nBirthdate, Anniversaries & Such:\n<<newReminder>>\n<<reminder month:3 day:11 title:"BillBlanke B-day">>\n<data>{"firstname":"Bill","lastname":"Blanke","website":"http://www.livejournal.com/users/hippy_king/","address":"2606 Red Cedar Parc Ct.","city":"O'Fallon","state":"MO","zip":"63366","homephone":"816-455-3388","notes":"Bill has no bellybutton.\snHe is the King of the Fairies at the St. Louis RenFaire."}</data>\n
<<tiddlerList tags:"book,personal" group:"tiddler.title.substr(0,1)">>
/***\n|''Name:''|BreadcrumbsPlugin|\n|''Description:''||\n|''Version:''|1.4.0|\n|''Date:''|Aug 02, 2006|\n|''Source:''|http://sourceforge.net/project/showfiles.php?group_id=150646|\n|''Author:''|Alan Hecht (with 2.0 update from 'jack' and revisions by Bram Chen)|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.5+; InternetExplorer 6.0|\n\n!Revision History:\n__TiddlyTools variant:__\n1.4.0.1(TT) 2006.08.04 - change spaces to tabs\n1.4.0.0(TT) 2006.08.04 - modified from 1.4.0 distro:\n<<<\nin refreshCrumbs(), set {{{display:none/block}}} instead of {{{visibility:hidden/visible}}}\nin restartHome(), check for valid crumbArea before setting style\ngeneral code cleanup/reformat using tabs to indent\n<<<\n|''Version''|''Date''|''Note''|\n|1.4.0|Aug 02, 2006|Fixed bug, the redefined onClickTiddlerLink_orig_breadCrumbs works incorrectly on IE|\n|1.3.0|Jul 20, 2006|Runs compatibly with TW 2.1.0 (rev #403+)|\n|1.2.0|Feb 07, 2006|change global array breadCrumbs to config.breadCrumbs by Eric's suggestion|\n|1.1.0|Feb 04, 2006|JSLint checked|\n|1.0.0|Feb 01, 2006|TW2 ready and code Cleaned-up|\n\n!Code section:\n***/\n//{{{\nversion.extensions.breadCrumbs = {major: 1, minor: 4, revision: 0, date: new Date("Aug 02, 2006")};\nconfig.breadCrumbs = [];\n\nwindow.onClickTiddlerLink_orig_breadCrumbs = window.onClickTiddlerLink;\nwindow.onClickTiddlerLink = function(e){\n if (!e) var e = window.event;\n window.onClickTiddlerLink_orig_breadCrumbs(e);\n addCrumb(e);\n return false;\n}\n\nfunction addCrumb(e){\n if (!e) var e = window.event;\n var thisCrumb = "[[" + resolveTarget(e).getAttribute("tiddlyLink") + "]]";\n var ind = config.breadCrumbs.find(thisCrumb);\n if(ind === null)\n config.breadCrumbs.push(thisCrumb);\n else\n config.breadCrumbs.length = ind++;\n refreshCrumbs();\n return false;\n}\n\nfunction refreshCrumbs(){\n var crumbArea = document.getElementById("breadCrumbs");\n if (!crumbArea) {\n var crumbArea = document.createElement("div");\n crumbArea.id = "breadCrumbs";\n crumbArea.style.display= "none"; // ELS changed from: crumbArea.style.visibility= "hidden";\n var targetArea = document.getElementById("tiddlerDisplay");\n targetArea.parentNode.insertBefore(crumbArea,targetArea);\n }\n crumbArea.style.display = "block"; // ELS changed from: crumbArea.style.visibility = "visible";\n removeChildren(crumbArea);\n createTiddlyButton(crumbArea,"Home",null,restartHome);\n wikify(" | " + config.breadCrumbs.join(' > '),crumbArea) // ELS: changed || to |\n}\n\nfunction restartHome(){\n story.closeAllTiddlers();\n restart();\n config.breadCrumbs = [];\n var crumbArea = document.getElementById("breadCrumbs");\n if (crumbArea) // ELS: added check to make sure crumbArea exists\n crumbArea.style.display = "none"; // ELS changed from: crumbArea.style.visibility = "hidden";\n}\n//}}}
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Misty Gates]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n+++[Picture]\n<html>\n<img src="http://no-sin.com/images/Conflation/Conflation2005/thumbnails/dscn0839.jpg" width="100" height="130" alt="Brian Gates" />\n</html>\n===\n<data>{"firstname":"Brian","homephone":"816-531-6121","lastname":"Gates","cellphone":"816-305-7773","imhandle":"generalbysybody (aim)","state":"MO","city":"Kansas City","country":"USA","website":"http://generalbusybody.livejournal.com/"}</data>\n<<reminder month:10 day:5 title:"Brian Gates' Birthday" >>
Add a new one every month\n{{{<<tasksum start here>>\n<<taskadder>>\n<<tasksum end>>}}}\n\n!!!Catagories\nCable & Internet\nElectric\nPhone\nNatural Gas\nWater (on even months)\nSavings\nOurBooth\n<<tiddlerList tags:"budget">>\n\n\n\n
$1368.40\n<<tasksum start here>>\n<<task 150 226.38 226.38>> Cable & Internet\n<<task 150 126.16 126.16>> Electric\n<<task 65 67.38 67.38>> Phone\n<<task 150 150 150>> Natural Gas\n<<task 80 111.53 111.53>> Water (on even months)\n<<task 40 40 21>> Savings\n<<task 200 200 25>> OurBooth\n<<taskadder>>\n<<tasksum end>>
I'll admit I am burnt out at my job. Too many years doing the same thing, correcting the same problems caused by the same people. The only time I don't feel lifeless is when there is a crisis and I have to do something different to solve the issue.\n\nI support about 50 people, who conect me to about 1,000 more, all whom are my ''customers''. None of these folks ever seems to think I am a customer. I am just a flunky doing my job, unnoticed except when I mess up, or when someone else messes up and I get stuck fixing it. Then they say thanks, and make the same mistake again in about a month. \n\nOh, and did I mention that I and my two peers are the lowest paid people in my department (by about $6k a year), and only get a single cube while every other person gets a double? Not that there is a lack of room here as we have about 10 empty cubes in the area....3 of them next to me. Nope, this in no way tells others "He's an underling".\n\nAnd now back to the grind.
<<forEachTiddler\n where \n 'tiddler.tags.contains("buy")'\n sortBy \n '(tiddler.title.toLowerCase())'\n write "'[['+tiddler.title + ']] - ' +\n store.getTiddlerText(tiddler.title).substr(0,40) + '\sn' " \n>>\n
Phoenix Room, 3rd floor South\n<<reminder month:7 date:12 year:2006 title:"pm2:30-3:30pm CBOR Training">>
/***\n''Name:'' Calendar plugin\n''Author:'' SteveRumsby\n\n// // updated by Jeremy Sheeley to add cacheing for reminders\n// // see http://www.geocities.com/allredfaq/reminderMacros.html\n\n''Configuration:''\n\n|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|\n|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|\n\n''Syntax:'' \n|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|\n|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|\n|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|\n|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|\n|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|\n|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|\n\n***/\n// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.\n\n// // ''Changes by ELS 2005.10.30:''\n// // config.macros.calendar.handler()\n// // ^^use "tbody" element for IE compatibility^^\n// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^\n// // createCalendarDays()\n// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^\n// // calendar stylesheet definition\n// // ^^use .calendar class-specific selectors, add text centering and margin settings^^\n\n//{{{\nconfig.macros.calendar = {};\n\nconfig.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];\nconfig.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];\n\nconfig.macros.calendar.weekendbg = "#c0c0c0";\nconfig.macros.calendar.monthbg = "#e0e0e0";\nconfig.macros.calendar.holidaybg = "#ffc0c0";\n\n//}}}\n// //''Code section:''\n// (you should not need to alter anything below here)//\n//{{{\nif(config.options.txtCalFirstDay == undefined)\n config.options.txtCalFirstDay = 0;\nif(config.options.txtCalStartOfWeekend == undefined)\n config.options.txtCalStartOfWeekend = 5;\n\nconfig.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>> \n\nversion.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};\nconfig.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconfig.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead\n//}}}\n\n// //Is the given date a holiday?\n//{{{\nfunction calendarIsHoliday(date)\n{\n var longHoliday = date.formatString("0DD/0MM/YYYY");\n var shortHoliday = date.formatString("0DD/0MM");\n\n for(var i = 0; i < config.macros.calendar.holidays.length; i++) {\n if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {\n return true;\n }\n }\n return false;\n}\n//}}}\n\n// //The main entry point - the macro handler.\n// //Decide what sort of calendar we are creating (month or year, and which month or year)\n// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.\n// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//\n// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//\n// ELS 2006.05.29: add journalDateFmt handling//\n//{{{\nconfig.macros.calendar.handler = function(place,macroName,params)\n{\n var calendar = createTiddlyElement(place, "table", null, "calendar", null);\n var tbody = createTiddlyElement(calendar, "tbody", null, null, null);\n var today = new Date();\n var year = today.getYear();\n if (year<1900) year+=1900;\n \n // get format for journal link by reading from SideBarOptions (ELS 5/29/06 - based on suggestion by Martin Budden)\n var text = store.getTiddlerText("SideBarOptions");\n this.journalDateFmt = "DD-MMM-YYYY";\n var re = new RegExp("<<(?:newJournal)([^>]*)>>","mg"); var fm = re.exec(text);\n if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }\n\n if (params[0] == "thismonth")\n {\n cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, today.getMonth());\n } \n else if (params[0] == "lastmonth") {\n var month = today.getMonth()-1; if (month==-1) { month=11; year--; }\n cacheReminders(new Date(year, month, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, month);\n }\n else if (params[0] == "nextmonth") {\n var month = today.getMonth()+1; if (month>11) { month=0; year++; }\n cacheReminders(new Date(year, month, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, month);\n }\n else {\n if (params[0]) year = params[0];\n if(params[1])\n {\n cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);\n createCalendarOneMonth(tbody, year, params[1]-1);\n }\n else\n {\n cacheReminders(new Date(year, 0, 1, 0, 0), 366);\n createCalendarYear(tbody, year);\n }\n }\n window.reminderCacheForCalendar = null;\n}\n//}}}\n//{{{\n//This global variable is used to store reminders that have been cached\n//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.\nwindow.reminderCacheForCalendar = null;\n//}}}\n//{{{\nfunction cacheReminders(date, leadtime)\n{\n if (window.findTiddlersWithReminders == null)\n return;\n window.reminderCacheForCalendar = {};\n var leadtimeHash = [];\n leadtimeHash [0] = 0;\n leadtimeHash [1] = leadtime;\n var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);\n for(var i = 0; i < t.length; i++) {\n //just tag it in the cache, so that when we're drawing days, we can bold this one.\n window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"]; \n }\n}\n//}}}\n//{{{\nfunction createCalendarOneMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);\n row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonth(calendar, year, mon)\n{\n var row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);\n row = createTiddlyElement(calendar, "tr", null, null, null);\n createCalendarDayHeader(row, 1);\n createCalendarDayRowsSingle(calendar, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarYear(calendar, year)\n{\n var row;\n row = createTiddlyElement(calendar, "tr", null, null, null);\n var back = createTiddlyElement(row, "td", null, null, null);\n var backHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year-1);\n };\n createTiddlyButton(back, "<", "Previous year", backHandler);\n back.align = "center";\n\n var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);\n yearHeader.align = "center";\n yearHeader.setAttribute("colSpan", 19);\n\n var fwd = createTiddlyElement(row, "td", null, null, null);\n var fwdHandler = function() {\n removeChildren(calendar);\n createCalendarYear(calendar, year+1);\n };\n createTiddlyButton(fwd, ">", "Next year", fwdHandler);\n fwd.align = "center";\n\n createCalendarMonthRow(calendar, year, 0);\n createCalendarMonthRow(calendar, year, 3);\n createCalendarMonthRow(calendar, year, 6);\n createCalendarMonthRow(calendar, year, 9);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthRow(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);\n createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDayHeader(row, 3);\n createCalendarDayRows(cal, year, mon);\n}\n//}}}\n\n//{{{\nfunction createCalendarMonthHeader(cal, row, name, nav, year, mon)\n{\n var month;\n if(nav) {\n var back = createTiddlyElement(row, "td", null, null, null);\n back.align = "center";\n back.style.background = config.macros.calendar.monthbg;\n\n/*\n back.setAttribute("colSpan", 2);\n\n var backYearHandler = function() {\n var newyear = year-1;\n removeChildren(cal);\n cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, mon);\n };\n createTiddlyButton(back, "<<", "Previous year", backYearHandler);\n*/\n var backMonHandler = function() {\n var newyear = year;\n var newmon = mon-1;\n if(newmon == -1) { newmon = 11; newyear = newyear-1;}\n removeChildren(cal);\n cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(back, "<", "Previous month", backMonHandler);\n\n\n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n// month.setAttribute("colSpan", 3);\n month.setAttribute("colSpan", 5);\n\n var fwd = createTiddlyElement(row, "td", null, null, null);\n fwd.align = "center";\n fwd.style.background = config.macros.calendar.monthbg; \n\n// fwd.setAttribute("colSpan", 2);\n var fwdMonHandler = function() {\n var newyear = year;\n var newmon = mon+1;\n if(newmon == 12) { newmon = 0; newyear = newyear+1;}\n removeChildren(cal);\n cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, newmon);\n };\n createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);\n/*\n var fwdYear = createTiddlyElement(row, "td", null, null, null);\n var fwdYearHandler = function() {\n var newyear = year+1;\n removeChildren(cal);\n cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);\n createCalendarOneMonth(cal, newyear, mon);\n };\n createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);\n*/\n } else {\n month = createTiddlyElement(row, "td", null, "calendarMonthname", name)\n month.setAttribute("colSpan", 7);\n }\n month.align = "center";\n month.style.background = config.macros.calendar.monthbg;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayHeader(row, num)\n{\n var cell;\n for(var i = 0; i < num; i++) {\n for(var j = 0; j < 7; j++) {\n var d = j + (config.options.txtCalFirstDay - 0);\n if(d > 6) d = d - 7;\n cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);\n\n if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))\n cell.style.background = config.macros.calendar.weekendbg;\n }\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDays(row, col, first, max, year, mon)\n{\n var i;\n for(i = 0; i < col; i++) {\n createTiddlyElement(row, "td", null, null, null);\n }\n var day = first;\n for(i = col; i < 7; i++) {\n var d = i + (config.options.txtCalFirstDay - 0);\n if(d > 6) d = d - 7;\n var daycell = createTiddlyElement(row, "td", null, null, null);\n var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);\n\n if(day > 0 && day <= max) {\n var celldate = new Date(year, mon, day);\n // ELS 2005.10.30: use <<date>> macro's showDate() function to create popup\n if (window.showDate) {\n showDate(daycell,celldate,"popup","DD",config.macros.calendar.journalDateFmt,true, isaWeekend); // ELS 5/29/06 - use journalDateFmt \n } else {\n if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;\n var title = celldate.formatString(config.macros.calendar.tiddlerformat);\n if(calendarIsHoliday(celldate)) {\n daycell.style.background = config.macros.calendar.holidaybg;\n }\n if(window.findTiddlersWithReminders == null) {\n var link = createTiddlyLink(daycell, title, false);\n link.appendChild(document.createTextNode(day));\n } else {\n var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);\n }\n }\n }\n day++;\n }\n}\n//}}}\n\n// //We've clicked on a day in a calendar - create a suitable pop-up of options.\n// //The pop-up should contain:\n// // * a link to create a new entry for that date\n// // * a link to create a new reminder for that date\n// // * an <hr>\n// // * the list of reminders for that date\n//{{{\nfunction onClickCalendarDate(e)\n{\n var button = this;\n var date = button.getAttribute("title");\n var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));\n\n date = dat.formatString(config.macros.calendar.tiddlerformat);\n var popup = createTiddlerPopup(this);\n popup.appendChild(document.createTextNode(date));\n var newReminder = function() {\n var t = store.getTiddlers(date);\n displayTiddler(null, date, 2, null, null, false, false);\n if(t) {\n document.getElementById("editorBody" + date).value += "\sn<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n } else {\n document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +\n " month:" + (dat.getMonth()+1) +\n " year:" + (dat.getYear()+1900) + " title: >>";\n }\n };\n var link = createTiddlyButton(popup, "New reminder", null, newReminder); \n popup.appendChild(document.createElement("hr"));\n\n var t = findTiddlersWithReminders(dat, [0,14], null, 1);\n for(var i = 0; i < t.length; i++) {\n link = createTiddlyLink(popup, t[i].tiddler, false);\n link.appendChild(document.createTextNode(t[i].tiddler));\n }\n}\n//}}}\n\n//{{{\nfunction calendarMaxDays(year, mon)\n{\n var max = config.macros.calendar.monthdays[mon];\n if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {\n max++;\n }\n return max;\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRows(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first1 < 0) first1 = first1 + 7;\n var day1 = -first1 + 1;\n var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first2 < 0) first2 = first2 + 7;\n var day2 = -first2 + 1;\n var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first3 < 0) first3 = first3 + 7;\n var day3 = -first3 + 1;\n\n var max1 = calendarMaxDays(year, mon);\n var max2 = calendarMaxDays(year, mon+1);\n var max3 = calendarMaxDays(year, mon+2);\n\n while(day1 <= max1 || day2 <= max2 || day3 <= max3) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;\n createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;\n }\n}\n//}}}\n\n//{{{\nfunction createCalendarDayRowsSingle(cal, year, mon)\n{\n var row = createTiddlyElement(cal, "tr", null, null, null);\n\n var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);\n if(first1 < 0) first1 = first1+ 7;\n var day1 = -first1 + 1;\n var max1 = calendarMaxDays(year, mon);\n\n while(day1 <= max1) {\n row = createTiddlyElement(cal, "tr", null, null, null);\n createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;\n }\n}\n//}}}\n\n// //ELS 2005.10.30: added styles\n//{{{\nsetStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");\n//}}}\n
4 750ml online
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Alesia Clardy]], [[Ken Girard]], [[Jason Gish]], [[Tim Metza]] & [[Tiana Duda]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<<reminder month:6 day:10 title:"[[Cayce Duda]]'s Birthday" firstyear:1992>>\n<data>{"address":"3204 Town & Country Lane","city":"St. Charles","state":"MO","firstname":"Cayce","lastname":"Duda","e-mail":"Kelagon@hotmail.com","homephone":"636-255-0665","imhandle":"kelagon (msn)","website":"http://www.xanga.com/kelagon | http://www.no-sin.com/cayce.htm","country":"USA","zip":"63301","cellphone":"314-283-7138"}</data>
/***\n''CheckboxPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#CheckboxPlugin \nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nAdd checkboxes to your tiddler content. Checkbox states can be preserved in the document by either automatically modifying the tiddler content or setting/removing tags on specified tiddlers, or they may be saved as local cookies by assigning an optional 'chkID' to the checkbox. Add custom javascript for programmatic initialization and onClick handling for any checkbox. Also provides access to checkbox DOM element data and tracks the checkbox state in TiddlyWiki's config.options[] internal data.\n\n!!!!!Usage\n<<<\nThe checkbox syntax, including all optional parameters, is contained inside a matched set of [ and ] brackets.\n{{{ [x=id(title:tag){init_script}{onclick_script}] }}}\n\nAn alternative syntax lets you place the optional parameters ''outside'' the [ and ] brackets, and is provided for backward-compatibility with existing content that may include checkbox definitions based on earlier releases of this plugin:\n{{{ [x]=id(title:tag){init_script}{onclick_script} }}}\n\n//{{{\n[ ]or[_] and [x]or[X]\n//}}}\nSimple checkboxes. The current unchecked/checked state is indicated by the character between the {{{[}}} and {{{]}}} brackets ("_" means unchecked, "X" means checked). When you click on a checkbox, the current state is retained by directly modifying the tiddler content to place the corresponding "_" or "X" character in between the brackets\n//{{{\n[x=id]\n//}}}\nAssign an optional ID to the checkbox so you can use {{{document.getElementByID("id")}}} to manipulate the checkbox DOM element, as well as tracking the current checkbox state in {{{config.options["id"]}}}. If the ID starts with "chk" the checkbox state will also be saved in a cookie, so it can be automatically restored whenever the checkbox is re-rendered (overrides any default {{{[x]}}} or {{{[_]}}} value). If a cookie value is kept, the "_" or "X" character in the tiddler content remains unchanged, and is only applied as the default when a cookie-based value is not currently defined.\n//{{{\n[x(title:tag)]\n//}}}\nInitializes and tracks the current checkbox state by setting or removing ("TogglyTagging") a particular tag value from a specified tiddler. If you omit the tiddler title (and the ":" separator), the specified tag is assigned to the current tiddler. If you omit the tag value, as in {{{(title:)}}}, the default tag, {{{checked}}}, is assumed. Omitting both the title and tag, {{{()}}}, tracks the checkbox state by setting the "checked" tag on the current tiddler. When tag tracking is used, the "_" or "X" character in the tiddler content remains unchanged, and is not used to set or track the checkbox state. If a tiddler title named in the tag does not exist, the checkbox state defaults to //unselected//. When the checkbox is subsequently changed to //selected//, it will automatically (and silently) create the missing tiddler and then add the tag to it.\n//{{{\n[x{javascript}{javascript}]\n//}}}\nYou can define optional javascript code segments to add custom initialization and/or 'onClick' handling to a checkbox. The current checkbox state (and it's other DOM attributes) can be set or read from within these code segments by reference to the default context-object, 'this'.\n\nThe first code segment will be executed when the checkbox is initially displayed, so that you can programmatically determine it's starting checked/unchecked state. The second code segment (if present) is executed whenever the checkbox is clicked, so that you can perform programmed responses or intercept and override the checkbox state based on complex logic using the TW core API or custom functions defined in plugins (e.g. testing a particular tiddler title to see if certain tags are set or setting some tags when the checkbox is clicked).\n\nNote: if you want to use the default checkbox initialization processing with a custom onclick function, use this syntax: {{{ [x=id{}{javascript}] }}} \n<<<\n!!!!!Examples<html><a name="Examples"/></html>\n<<<\n//{{{\n[X] label\n[_] label\n//}}}\nchecked and unchecked static default values\n[X] label\n[_] label\n\n//{{{\n[_=demo] label\n//}}}\ndocument-based value (id='demo', no cookie)\n[_=demo] label\n\n//{{{\n[_=chkDemo] label\n//}}}\ncookie-based value (id='chkDemo')\n[_=chkDemo] label\n\n//{{{\n[_(CheckboxPlugin:demotag)] toggle 'demotag'\n//}}}\ntag-based value (TogglyTagging)\n[_(CheckboxPlugin:demotag)] toggle 'demotag'\ncurrent tags: <script>return store.getTiddler(story.findContainingTiddler(place).id.substr(7)).tags.toString();</script>\n\n//{{{\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n//}}}\ncustom init and onClick functions\n[X{this.checked=true}{alert(this.checked?"on":"off")}] message box with checkbox state\n\nRetrieving option values:\nconfig.options['demo']=<script>return config.options['demo']?"true":"false";</script>\nconfig.options['chkDemo']=<script>return config.options['chkDemo']?"true":"false";</script>\n\n!!!!!Installation\nimport (or copy/paste) the following tiddlers into your document:\n''CheckboxPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n2006.02.23 - 2.0.4\nwhen toggling tags, force refresh of the tiddler containing the checkbox.\n\n2006.02.23 - 2.0.3\nwhen toggling tags, force refresh of the 'tagged tiddler' so that tag-related tiddler content (such as "to-do" lists) can be re-rendered.\n\n2006.02.23 - 2.0.2\nwhen using tag-based storage, allow use [[ and ]] to quote tiddler or tag names that contain spaces:\n"""[x([[Tiddler with spaces]]:[[tag with spaces]])]"""\n\n2006.01.10 - 2.0.1\nwhen toggling tags, force refresh of the 'tagging tiddler'. For example, if you toggle the "systemConfig" tag on a plugin, the corresponding "systemConfig" TIDDLER will be automatically refreshed (if currently displayed), so that the 'tagged' list in that tiddler will remain up-to-date.\n\n2006.01.04 - 2.0.0\nupdate for ~TW2.0\n\n2005.12.27 - 1.1.2\nFix lookAhead regExp handling for """[x=id]""", which had been including the "]" in the extracted ID. \nAdded check for "chk" prefix on ID before calling saveOptionCookie()\n\n2005.12.26 - 1.1.2\nCorrected use of toUpperCase() in tiddler re-write code when comparing """[X]""" in tiddler content with checkbox state. Fixes a problem where simple checkboxes could be set, but never cleared.\n\n2005.12.26 - 1.1.0\nRevise syntax so all optional parameters are included INSIDE the [ and ] brackets. Backward compatibility with older syntax is supported, so content changes are not required when upgrading to the current version of this plugin. Based on a suggestion by GeoffSlocock\n\n2005.12.25 - 1.0.0\nadded support for tracking checkbox state using tags ("TogglyTagging")\nRevised version number for official post-beta release.\n\n2005.12.08 - 0.9.3\nsupport separate 'init' and 'onclick' function definitions.\n\n2005.12.08 - 0.9.2\nclean up lookahead pattern\n\n2005.12.07 - 0.9.1\nonly update tiddler source content if checkbox state is actually different. Eliminates unnecessary tiddler changes (and 'unsaved changes' warnings)\n\n2005.12.07 - 0.9.0\ninitial BETA release\n<<<\n!!!!!Credits\n<<<\nThis feature was created by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.CheckboxPlugin = {major: 2, minor: 0, revision:4 , date: new Date(2006,2,23)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "checkbox",\n match: "\s\s[[xX_ ][\s\s]\s\s=\s\s(\s\s{]",\n lookahead: "\s\s[([xX_ ])(\s\s])?(=[^\s\ss\s\s(\s\s]{]+)?(\s\s([^\s\s)]*\s\s))?({[^}]*})?({[^}]*})?(\s\s])?",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // get params\n var checked=lookaheadMatch[1];\n var id=lookaheadMatch[3];\n var tag=lookaheadMatch[4];\n var fn_init=lookaheadMatch[5];\n var fn_click=lookaheadMatch[6];\n // create checkbox element\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onClickCheckbox;\n c.srcpos=w.matchStart+1; // remember location of "X"\n w.output.appendChild(c);\n // set default state\n c.checked=(checked.toUpperCase()=="X");\n // get/set state by ID\n if (id) {\n c.id=id.substr(1); // trim off leading "="\n if (config.options[c.id]!=undefined)\n c.checked=config.options[c.id];\n else\n config.options[c.id]=c.checked;\n }\n // get/set state by tag\n if (tag) {\n c.tiddler=story.findContainingTiddler(w.output).id.substr(7);\n c.tag=tag.substr(1,tag.length-2).trim(); // trim off parentheses\n var pos=c.tag.indexOf(":");\n if (pos==0) { c.tag=tag.substr(1); }\n if (pos>0) { c.tiddler=c.tag.substr(0,pos).replace(/\s[\s[/g,"").replace(/\s]\s]/g,""); c.tag=c.tag.substr(pos+1); }\n c.tag.replace(/\s[\s[/g,"").replace(/\s]\s]/g,"");\n if (!c.tag.length) c.tag="checked";\n var t=store.getTiddler(c.tiddler);\n c.checked = (t && t.tags)?(t.tags.find(c.tag)!=null):false;\n }\n if (fn_init) c.fn_init=fn_init.trim().substr(1,fn_init.length-2); // trim off surrounding { and } delimiters\n if (fn_click) c.fn_click=fn_click.trim().substr(1,fn_click.length-2);\n c.onclick(); // compute initial state and save in tiddler/config/cookie\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n }\n)\n//}}}\n\n//{{{\nfunction onClickCheckbox()\n{\n if (this.fn_init)\n // custom function hook to set initial state (run only once)\n { try { eval(this.fn_init); this.fn_init=null; } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }\n else if (this.fn_click)\n // custom function hook to override or react to changes in checkbox state\n { try { eval(this.fn_click) } catch(e) { displayMessage("Checkbox click error: "+e.toString()); } }\n if (this.id)\n // save state in config AND cookie (only when ID starts with 'chk')\n { config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }\n if ((!this.id || this.id.substr(0,3)!="chk") && !this.tag) {\n // save state in tiddler content only if not using cookie or tag tracking\n var t=store.getTiddler(story.findContainingTiddler(this).id.substr(7));\n if (this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed\n t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);\n store.setDirty(true);\n }\n }\n if (this.tag) {\n var t=store.getTiddler(this.tiddler);\n if (!t) { t=(new Tiddler()); t.set(this.tiddler,"",config.options.txtUserName,(new Date()),null); store.addTiddler(t); } \n var tagged=(t.tags && t.tags.find(this.tag)!=null);\n if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }\n if (!this.checked && tagged) { t.tags.splice(t.tags.find(this.tag),1); store.setDirty(true); }\n // if tag state has been changed, force a display update\n if (this.checked!=tagged) {\n story.refreshTiddler(this.tiddler,null,true); // the TAGGED tiddler\n story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler\n if (t=store.getTiddler(story.findContainingTiddler(this).id.substr(7)))\n if (t.title!=this.tiddler) story.refreshTiddler(t.title,null,true); // the tiddler CONTAINING the checkbox\n }\n }\n return true;\n}\n//}}}
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Rob Nichols]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>><data>{"cellphone":"773-415-1486","firstname":"Chris","lastname":"Gregory","city":"Chicago","state":"IL","country":"USA"}</data>
Original at: http://www.signsforfaith.com/value.asp\n\n!!!When looking for a new church sign, many churches have the same questions:\n"Should we spend the money on a new church sign?"\n"Isn't our sign good enough the way it is?"\n"Nobody really pays attention to a sign anyway, right?" \n \nMany churches understand the intrinsic need for a new church sign, but don't realize the true value it provides them.\n\nA church sign is an investment in the future growth of the church. A church sign does not merely sit out front of a church to look pretty... it has the all important job of greeting new visitors... inspiring the passing public... and creating a great first impression of the church to all who go by. \n\n!A Signs for Faith sign has an amazing return on investment... \n \nA truly effective sign brings in new members who then contribute to the growth and financial well-being of the church through regular monetary contributions. In a recent study done by the Barna Research Group the average per capita amount given to churches in 2001 was $769. If your Signs for Faith church sign only brings in one family per month, here is the potential return on your investment from the new sign. \n\nAssuming the sign brings in only one family a month and each family contributes $15.38 per week, the total amount the church receives by the end of the year is $5168.\n\nAfter 10 years of service, the sign will bring in 120 new families and over $466,000 in contributions to the church.\n----\nSo get a church sign and ring in the cash... seems that is all that you are to the church.
Details go here\n\n<<reminder date:11 month:10 year:2006 title:"8pm - Circus Del Soleil">>
/***\n|Name|CollapseTiddlersPlugin|\n|Created by|Bradley Meck|\n|Location|http://gensoft.revhost.net/Collapse.html|\n\n!History\n* ELS 2/24/2006: added fallback to "CollapsedTemplate if "WebCollapsedTemplate" is not found\n* ELS 2/6/2006: added check for 'readOnly' flag to use alternative "WebCollapsedTemplate"\n\n***/\n\n//{{{\n\nversion.extensions.ExtensionsPlugin = {\n major: 0, minor: 0, revision: 0,\n date: new Date(2006, 2, 24), \n type: 'macro',\n source: "http://gensoft.revhost.net/Collapse.html"\n};\n\nconfig.commands.collapseTiddler = {\n text: "fold",\n tooltip: "Collapse this tiddler",\n handler: function(event, src, title) {\n var e = story.findContainingTiddler(src);\n if(e.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\n var t = (readOnly && store.tiddlerExists("WebCollapsedTemplate")) ? "WebCollapsedTemplate" : "CollapsedTemplate";\n if (! store.tiddlerExists(t)) {\n alert("Can't find 'CollapsedTemplate'");\n return;\n }\n if(e.getAttribute("template") != t ){\n e.setAttribute("oldTemplate", e.getAttribute("template"));\n story.displayTiddler(null, title, t);\n }\n }\n }\n}\n\nconfig.commands.expandTiddler = {\n text: "unfold",\n tooltip: "Expand this tiddler",\n handler: function(event,src,title) {\n var e = story.findContainingTiddler(src);\n story.displayTiddler(null,title,e.getAttribute("oldTemplate"));\n }\n}\n\nconfig.macros.collapseAll = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyButton(place,"Collapse All","",function(){\n story.forEachTiddler(function(title,tiddler){\n if(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE])\n var t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\n if (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\n story.displayTiddler(null,title,t);\n })\n })\n }\n}\n\nconfig.macros.expandAll = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyButton(place,"Expand All","",function(){\n story.forEachTiddler(function(title,tiddler){\n var t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\n if (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\n if(tiddler.getAttribute("template") == t) story.displayTiddler(null,title,tiddler.getAttribute("oldTemplate"));\n })\n })\n }\n}\n\nconfig.commands.collapseOthers = {\n text: "focus",\n tooltip: "Expand this tiddler and collapse all others",\n handler: function(event,src,title) {\n var e = story.findContainingTiddler(src);\n story.forEachTiddler(function(title,tiddler){\n if(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\n var t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\n if (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\n if (e==tiddler) t=e.getAttribute("oldTemplate");\n //////////\n // ELS 2006.02.22 - removed this line. if t==null, then the *current* view template, not the default "ViewTemplate", will be used.\n // if (!t||!t.length) t=!readOnly?"ViewTemplate":"WebViewTemplate";\n //////////\n story.displayTiddler(null,title,t);\n }\n })\n }\n} \n\n//}}}\n
<div><div class='toolbar' macro='toolbar references jump collapseOthers closeOthers expandTiddler -closeTiddler'></div>\n<div class='title' macro='view title'></div></div>
<<newReminder>>\n\n<<reminder year:2006 month:9 day:9 title:"Mozingo Drumline Festival" >>\n<<reminder year:2006 month:9 day:30 title:"Sullivan Marching Festival" >>\n<<reminder year:2006 month:10 day:7 title:"Washington Marching Festival" >>\n<<reminder year:2006 month:10 day:13 title:"Homecoming Parade" >>\n<<reminder year:2006 month:10 day:21 title:"Central Rebel Invitational (Park Hills)" >>\n<<reminder year:2006 month:10 day:28 title:"Greater St. Louis Compatition" >>\n
config.options.chkHttpReadOnly = false;\n
These configuration options enable you to customize the default behaviour of this wiki. They are saved locally as cookies, just like other TiddlyWiki configuration options.\n\nThis is the tag used for the "reference" context, used to identify tiddlers that show up in the [[Reference]] list: \n<<option txtGTDReferenceContext>>\n\nThis is the tag used for the "someday-maybe" context, used to identify tiddlers that show up in the [[Someday-Maybe]] list:\n<<option txtGTDSomedayContext>>\n\nThis is the tag used for the "unfiled" context, used to tag actions when the context is not known (such as a deleted context):\n<<option txtGTDUnfiledContext>>\n\nThis value, if specified, is the number of days to keep completed actions in context and review action lists (leave blank to show all unarchived, completed actions):\n<<option txtGTDActionAging>>\n\n<<option chkGTDFancyStyle>> Use this checkbox to enable or disable the extended (fancy) GTD style specified by the GTDTWStyleSheet (you will need to reload the page to see your change)
<html>\n<style>\n.rolodex table {\nborder: 0px solid;\nbackground-color:#FFFF99;\n}\n\n.rolodex tr, .rolodex td {\nborder: 0px solid;\n}\n</style>\n<span class="rolodex">\n <table>\n <tr>\n <td align="right"><b>Firstname:</b></td>\n <td colspan="3"><input name=firstname type=text style="width:95%" /></td></tr>\n <tr>\n <td align="right"><b>Lastname:</b></td>\n <td colspan="3"><input name=lastname type=text style="width:95%" /></td></tr>\n <tr>\n <td align="right"><b>E-mail:</b></td>\n <td><input name=e-mail1 type=text style="width:95%" /></td>\n <td align="right"><b>@</b></td>\n <td><input name=e-mail2 type=text style="width:95%" /></td> </tr>\n <tr>\n <td align="right"><b>Cell Phone:</b></td>\n <td ><input name=cellphone type=text style="width:95%" />\n <td align="right"><b>Work Phone:</b></td>\n <td ><input name=workphone type=text style="width:95%" /></td></tr>\n <tr>\n <td align="right"><b>Home Phone:</b></td>\n <td ><input name=homephone type=text style="width:95%" /></td>\n <td align="right"><b>IM Handle:</b></td>\n <td ><input name=imhandle type=text style="width:95%" /></tr>\n <tr>\n <td align="right"><b>Website:</b></td>\n <td colspan="3"><input name=website type=text style="width:95%" /></td></tr>\n <tr>\n <td align="right" valign="top"><b>Address:</b></td>\n <td colspan="3"><textarea name=address rows="2" cols="40" style="width:95%" ></textarea></td></tr>\n <tr>\n <td align="right"><b>City:</b></td>\n <td><input name=city type=text style="width:95%" /></td>\n <td align="right"><b>State/ Province:</b></td>\n <td width="35%"><input name=state type=text style="width:95%" /></td>\n</tr>\n<tr> \n <td align="right"><b>ZIP/Postal Code:</b></td>\n <td width="35%"><input name=zip type=text style="width:95%" /></td>\n <td align="right"><b>Country:</b></td>\n <td><input name=country type=text style="width:95%" /></td></tr>\n <tr>\n <td colspan="4"><sub><b>Notes</b></sub><br>\n <textarea name=notes rows="4" cols="40" style="width:95%"></textarea></td>\n</tr>\n</table>\n</span>\n</html>
|Name |E-mail |Cell |Home |\n<<forEachTiddler\n where\n 'tiddler.tags.contains("convention") && tiddler.tags.contains("contact")' \n sortBy 'tiddler.title'\n write \n '"|[["+tiddler.title+"]]|<<email "+tiddler.data("e-mail")+"$)) | "+ tiddler.data("cellphone") + "| "+tiddler.data("homephone")+" |\sn"'\n>>\n
I need to turn this into the base for the [[OfficeRomance Translator]]\n\n"I'm glad you pinged Slashdot about this messaging challenge so we could touch base and send a heads up. This kind of meme is gaining mind-share. The metrics are showing more than just a blip, it's a sea-change!\n\nMoving forward, I think it's clear that we need to leverage our wins and make them part of the overall story. I know that we can wrestle this problem to the ground and dominate several emerging ecosystems if we prioritise and deliver best-practices through the channel. Execution is key.\n\nI really need your front-end alignment on this! Can you get your people on board?"\n\nStolen from [[/.|http://ask.slashdot.org/article.pl?sid=06/04/11/170215]]
The reason I can't seem to get ahead in the corporate world is that I do not speak like this. Maybe I am just to honest?\n|!Corp Speak|!Me|\n|Compose memos|Type a memo|\n|Coordinate events|Set up a meeting|\n|Prioritize communications|Sort mail|\n|Manage customer relations|Call an angry customer|\n|Troubleshoot computer issues|Help someone who can't print from the computer|\n|Make purchasing decisions|Order supplies|\n\nMenial language may limit how others perceive an administrative assistant's abilities. \n\nThis may appear to be mere wordsmithing or a semantic game, but communicating your level of responsibility is critical to your success. Administrators who hear an assistant refer to decision making, trouble-shooting, or prioritizing are more likely to entrust that assistant with increased levels of responsibility. Don't allow ignorance or misunderstanding of your abilities to limit your contribution to the organization (Or your paycheck). \n
1 box
W are doing our goals for the year which will later on be the basis for handing out raises. Seem's that my raises will be mostly built upon the actions of the team, rather then if I persoanlly do a good job or not. I put together my goals which will count for 20% of getting my raise, the other 80% is department goals involving 9 other people. Damn, I hope they do a good job. I guess the nice part is that if I don't get a raise, neither do they.\n\n*20% of it is based upon the resualts of a survey sent out to customers, many of whom I will have never interacted with.\n*10% is based upon how many employees in the company take a certain survey. Guess I will spend the time it is open walking from desk to desk demanding that folks take the survey. 10% could mean $0.10-$0.15 an hour difference.\n*20% is to be based upon a 'Standard' to be developed by a committiee that hasn't even been choosen yet!\n\nDoes any one understand this logic?
/***\n|''Name:''|DataTiddlerPlugin|\n|''Version:''|1.0.4 (2006-02-05)|\n|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nEnhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).\n\nSuch tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. \n\n''//Example: "Table with all December Expenses"//''\n{{{\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\n}}}\n//(This assumes that expenses are stored in tiddlers tagged with "expense".)//\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\nFor other examples see DataTiddlerExamples.\n\n\n\n\n''Access and Modify Tiddler Data''\n\nYou can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. \n\nThese values can be accessed and modified through the following Tiddler methods:\n|!Method|!Example|!Description|\n|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n\nAlternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.\n|!Method|!Description|\n|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n//(For details on the various functions see the detailed comments in the source code.)//\n\n\n''Data Representation in a Tiddler''\n\nThe data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. \n\n//''Data Section Example:''//\n{{{\n<data>{"isVIP":true,"user":"John Brown","age":34}</data>\n}}}\n\nThe data section is not displayed when viewing the tiddler (see also "The showData Macro").\n\nBeside the data section a tiddler may have all kind of other content.\n\nTypically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.\n\n\n''Saving Changes''\n\nThe "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.\n\n\n''Notifications''\n\nNo notifications are sent when a tiddler's data value is changed through the "setData" methods. \n\n''Escape Data Section''\nIn case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.\n\n\n''The showData Macro''\n\nBy default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:\n\n''Syntax:'' \n|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|\n|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|\n|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\n\n!Revision history\n* v1.0.4 (2006-02-05)\n** Bugfix: showData fails in TiddlyWiki 2.0\n* v1.0.3 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.2 (2005-12-22)\n** Enhancements:\n*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.\n*** Improved (JSON) error messages.\n** Bugs fixed: \n*** References are not updated when using the DataTiddler.\n*** Changes to compound objects are not always saved.\n*** "~</data>" is not rendered correctly (expected "</data>")\n* v1.0.1 (2005-12-13)\n** Features: \n*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed\n** Bugs fixed: \n*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)\n* v1.0.0 (2005-12-12)\n** initial version\n\n!Code\n***/\n//{{{\n//============================================================================\n//============================================================================\n// DataTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Ensure that the DataTiddler Plugin is only installed once.\n//\nif (!version.extensions.DataTiddlerPlugin) {\n\n\n\nversion.extensions.DataTiddlerPlugin = {\n major: 1, minor: 0, revision: 4,\n date: new Date(2006, 2, 5), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } \n\n//============================================================================\n// DataTiddler Class\n//============================================================================\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nfunction DataTiddler() {\n}\n\nDataTiddler = {\n // Function to stringify a JavaScript value, producing the text for the data section content.\n // (Must match the implementation of DataTiddler.parse.)\n //\n stringify : null,\n \n\n // Function to parse the text for the data section content, producing a JavaScript value.\n // (Must match the implementation of DataTiddler.stringify.)\n //\n parse : null\n};\n\n// Ensure access for IE\nwindow.DataTiddler = DataTiddler;\n\n// ---------------------------------------------------------------------------\n// Data Accessor and Mutator\n// ---------------------------------------------------------------------------\n\n\n// Returns the value of the given data field of the tiddler.\n// When no such field is defined or its value is undefined\n// the defaultValue is returned.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.getData = function(tiddler, field, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataValue(t, field, defaultValue);\n}\n\n\n// Sets the value of the given data field of the tiddler to\n// the value. When the value is equal to the defaultValue\n// no value is set (and the field is removed)\n//\n// Changing data of a tiddler will not trigger notifications.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.setData = function(tiddler, field, value, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler+ "("+t+")";\n }\n\n DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);\n}\n\n\n// Returns the data object of the tiddler, with a property for every field.\n//\n// The properties of the returned data object may only be read and\n// not be modified. To modify the data use DataTiddler.setData(...) \n// or the corresponding Tiddler method.\n//\n// If no data section is defined a new (empty) object is returned.\n//\n// @param tiddler either a tiddler name or a Tiddler\n//\nDataTiddler.getDataObject = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataObject(t);\n}\n\n// Returns the text of the content of the data section of the tiddler.\n//\n// When no data section is defined for the tiddler null is returned \n//\n// @param tiddler either a tiddler name or a Tiddler\n// @return [may be null]\n//\nDataTiddler.getDataText = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.readDataSectionText(t);\n}\n\n\n// ---------------------------------------------------------------------------\n// Internal helper methods (must not be used by code from outside this plugin)\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// The original JSONError is not very user friendly, \n// especially it does not define a toString() method\n// Therefore we extend it here.\n//\nDataTiddler.extendJSONError = function(ex) {\n if (ex.name == 'JSONError') {\n ex.toString = function() {\n return ex.name + ": "+ex.message+" ("+ex.text+")";\n }\n }\n return ex;\n}\n\n// Internal.\n//\n// @param t a Tiddler\n//\nDataTiddler.getTiddlerDataObject = function(t) {\n if (t.dataObject == undefined) {\n var data = DataTiddler.readData(t);\n t.dataObject = (data) ? data : {};\n }\n \n return t.dataObject;\n}\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {\n var value = DataTiddler.getTiddlerDataObject(tiddler)[field];\n return (value == undefined) ? defaultValue : value;\n}\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n var oldValue = data[field];\n \n if (value == defaultValue) {\n if (oldValue != undefined) {\n delete data[field];\n DataTiddler.save(tiddler);\n }\n return;\n }\n data[field] = value;\n DataTiddler.save(tiddler);\n}\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns its text\n// (as a String).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readDataSectionText = function(tiddler) {\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n if (matches == null || !matches[2]) {\n return null;\n }\n return matches[2];\n}\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns it\n// (as an internalized object).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readData = function(tiddler) {\n var text = DataTiddler.readDataSectionText(tiddler);\n try {\n return text ? DataTiddler.parse(text) : null;\n } catch(ex) {\n throw DataTiddler.extendJSONError(ex);\n }\n}\n\n// Internal.\n// \n// Returns the serialized text of the data of the given tiddler, as it\n// should be stored in the data section.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getDataTextOfTiddler = function(tiddler) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n return DataTiddler.stringify(data);\n}\n\n\n// Internal.\n// \nDataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {\n var index = s.indexOf(subString, startIndex);\n while ((index > 0) && (s[index-1] == '~')) { \n index = s.indexOf(subString, index+1);\n }\n return index;\n}\n\n// Internal.\n//\nDataTiddler.getDataSectionInfo = function(text) {\n // Special care must be taken to handle "<data>" and "</data>" texts inside\n // a data section. \n // Also take care not to use an escaped <data> (i.e. "~<data>") as the start \n // of a data section. (Same for </data>)\n\n // NOTE: we are explicitly searching for a data section that contains a JSON\n // string, i.e. framed with braces. This way we are little bit more robust in\n // case the tiddler contains unescaped texts "<data>" or "</data>". This must\n // be changed when using a different stringifier.\n\n var startTagText = "<data>{";\n var endTagText = "}</data>";\n\n var startPos = 0;\n\n // Find the first not escaped "<data>".\n var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);\n if (startDataTagIndex < 0) {\n return null;\n }\n\n // Find the *last* not escaped "</data>".\n var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);\n if (endDataTagIndex < 0) {\n return null;\n }\n var nextEndDataTagIndex;\n while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {\n endDataTagIndex = nextEndDataTagIndex;\n };\n\n return {\n prefixEnd: startDataTagIndex, \n dataStart: startDataTagIndex+(startTagText.length)-1, \n dataEnd: endDataTagIndex, \n suffixStart: endDataTagIndex+(endTagText.length)\n };\n}\n\n// Internal.\n// \n// Returns the "matches" of a content of a DataTiddler on the\n// "data" regular expression. Return null when no data is defined\n// in the tiddler content.\n//\n// Group 1: text before data section (prefix)\n// Group 2: content of data section\n// Group 3: text behind data section (suffix)\n//\n// @param tiddler a Tiddler\n// @return [may be null] null when the tiddler contains no data section, otherwise see above.\n//\nDataTiddler.getDataTiddlerMatches = function(tiddler) {\n var text = tiddler.text;\n var info = DataTiddler.getDataSectionInfo(text);\n if (!info) {\n return null;\n }\n\n var prefix = text.substr(0,info.prefixEnd);\n var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);\n var suffix = text.substr(info.suffixStart);\n \n return [text, prefix, data, suffix];\n}\n\n\n// Internal.\n//\n// Saves the data in a <data> block of the given tiddler (as a minor change). \n//\n// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. \n// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.\n//\n// Notifications are not send. \n//\n// This method should only be called when the data really has changed. \n//\n// @param tiddler\n// the tiddler to be saved.\n//\nDataTiddler.save = function(tiddler) {\n\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n\n var prefix;\n var suffix;\n if (matches == null) {\n prefix = tiddler.text;\n suffix = "";\n } else {\n prefix = matches[1];\n suffix = matches[3];\n }\n\n var dataText = DataTiddler.getDataTextOfTiddler(tiddler);\n var newText = \n (dataText != null) \n ? prefix + "<data>" + dataText + "</data>" + suffix\n : prefix + suffix;\n if (newText != tiddler.text) {\n // make the change in the tiddlers text\n \n // ... see DataTiddler.MyTiddlerChangedFunction\n tiddler.isDataTiddlerChange = true;\n \n // ... do the action change\n tiddler.set(\n tiddler.title,\n newText,\n config.options.txtUserName, \n config.options.chkForceMinorUpdate? undefined : new Date(),\n tiddler.tags);\n\n // ... see DataTiddler.MyTiddlerChangedFunction\n delete tiddler.isDataTiddlerChange;\n\n // Mark the store as dirty.\n store.dirty = true;\n \n // AutoSave if option is selected\n if(config.options.chkAutoSave) {\n saveChanges();\n }\n }\n}\n\n// Internal.\n//\nDataTiddler.MyTiddlerChangedFunction = function() {\n // Remove the data object from the tiddler when the tiddler is changed\n // by code other than DataTiddler code. \n //\n // This is necessary since the data object is just a "cached version" \n // of the data defined in the data section of the tiddler and the \n // "external" change may have changed the content of the data section.\n // Thus we are not sure if the data object reflects the data section \n // contents. \n // \n // By deleting the data object we ensure that the data object is \n // reconstructed the next time it is needed, with the data defined by\n // the data section in the tiddler's text.\n \n // To indicate that a change is a "DataTiddler change" a temporary\n // property "isDataTiddlerChange" is added to the tiddler.\n if (this.dataObject && !this.isDataTiddlerChange) {\n delete this.dataObject;\n }\n \n // call the original code.\n DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);\n}\n\n\n//============================================================================\n// Formatters\n//============================================================================\n\n// This formatter ensures that "~<data>" is rendered as "<data>". This is used to \n// escape the "<data>" of a data section, just in case someone really wants to use\n// "<data>" as a text in a tiddler and not start a data section.\n//\n// Same for </data>.\n//\nconfig.formatters.push( {\n name: "data-escape",\n match: "~<\s\s/?data>",\n\n handler: function(w) {\n w.outputText(w.output,w.matchStart + 1,w.nextMatch);\n }\n} )\n\n\n// This formatter ensures that <data>...</data> sections are not rendered.\n//\nconfig.formatters.push( {\n name: "data",\n match: "<data>",\n\n handler: function(w) {\n var info = DataTiddler.getDataSectionInfo(w.source);\n if (info && info.prefixEnd == w.matchStart) {\n w.nextMatch = info.suffixStart;\n } else {\n w.outputText(w.output,w.matchStart,w.nextMatch);\n }\n }\n} )\n\n\n//============================================================================\n// Tiddler Class Extension\n//============================================================================\n\n// "Hijack" the changed method ---------------------------------------------------\n\nDataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;\nTiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;\n\n// Define accessor methods -------------------------------------------------------\n\n// Returns the value of the given data field of the tiddler. When no such field \n// is defined or its value is undefined the defaultValue is returned.\n//\n// When field is undefined (or null) the data object is returned. (See \n// DataTiddler.getDataObject.)\n//\n// @param field [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n// @return [may be null, undefined]\n//\nTiddler.prototype.data = function(field, defaultValue) {\n return (field) \n ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)\n : DataTiddler.getTiddlerDataObject(this);\n}\n\n// Sets the value of the given data field of the tiddler to the value. When the \n// value is equal to the defaultValue no value is set (and the field is removed).\n//\n// @param value [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n//\nTiddler.prototype.setData = function(field, value, defaultValue) {\n DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);\n}\n\n\n//============================================================================\n// showData Macro\n//============================================================================\n\nconfig.macros.showData = {\n // Standard Properties\n label: "showData",\n prompt: "Display the values stored in the data section of the tiddler"\n}\n\nconfig.macros.showData.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the optional "JSON"\n var showInJSONFormat = false;\n if ((i < params.length) && params[i] == "JSON") {\n i++;\n showInJSONFormat = true;\n }\n \n var tiddlerName = story.findContainingTiddler(place).id.substr(7);\n if (i < params.length) {\n tiddlerName = params[i]\n i++;\n }\n\n // --- Processing ------------------------------------------\n try {\n if (showInJSONFormat) {\n this.renderDataInJSONFormat(place, tiddlerName);\n } else {\n this.renderDataAsTable(place, tiddlerName);\n }\n } catch (e) {\n this.createErrorElement(place, e);\n }\n}\n\nconfig.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {\n var text = DataTiddler.getDataText(tiddlerName);\n if (text) {\n createTiddlyElement(place,"pre",null,null,text);\n }\n}\n\nconfig.macros.showData.renderDataAsTable = function(place,tiddlerName) {\n var text = "|!Name|!Value|\sn";\n var data = DataTiddler.getDataObject(tiddlerName);\n if (data) {\n for (var i in data) {\n var value = data[i];\n text += "|"+i+"|"+DataTiddler.stringify(value)+"|\sn";\n }\n }\n \n wikify(text, place);\n}\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.showData.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);\n}\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".showDataError{color: #ffffff;background-color: #880000;}",\n "showData");\n\n\n} // of "install only once"\n//}}}\n\n\n\n/***\n!JSON Code, used to serialize the data\n//(embedded in the plugin tiddler to make it selfcontained)//\n***/\n//{{{\n/*\nCopyright (c) 2005 JSON.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe Software shall be used for Good, not Evil.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/*\n The global object JSON contains two methods.\n\n JSON.stringify(value) takes a JavaScript value and produces a JSON text.\n The value must not be cyclical.\n\n JSON.parse(text) takes a JSON text and produces a JavaScript value. It will\n throw a 'JSONError' exception if there is an error.\n*/\nvar JSON = {\n copyright: '(c)2005 JSON.org',\n license: 'http://www.crockford.com/JSON/license.html',\n/*\n Stringify a JavaScript value, producing a JSON text.\n*/\n stringify: function (v) {\n var a = [];\n\n/*\n Emit a string.\n*/\n function e(s) {\n a[a.length] = s;\n }\n\n/*\n Convert a value.\n*/\n function g(x) {\n var c, i, l, v;\n\n switch (typeof x) {\n case 'object':\n if (x) {\n if (x instanceof Array) {\n e('[');\n l = a.length;\n for (i = 0; i < x.length; i += 1) {\n v = x[i];\n if (typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(v);\n }\n }\n e(']');\n return;\n } else if (typeof x.toString != 'undefined') {\n e('{');\n l = a.length;\n for (i in x) {\n v = x[i];\n if (x.hasOwnProperty(i) &&\n typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(i);\n e(':');\n g(v);\n }\n }\n return e('}');\n }\n }\n e('null');\n return;\n case 'number':\n e(isFinite(x) ? +x : 'null');\n return;\n case 'string':\n l = x.length;\n e('"');\n for (i = 0; i < l; i += 1) {\n c = x.charAt(i);\n if (c >= ' ') {\n if (c == '\s\s' || c == '"') {\n e('\s\s');\n }\n e(c);\n } else {\n switch (c) {\n case '\sb':\n e('\s\sb');\n break;\n case '\sf':\n e('\s\sf');\n break;\n case '\sn':\n e('\s\sn');\n break;\n case '\sr':\n e('\s\sr');\n break;\n case '\st':\n e('\s\st');\n break;\n default:\n c = c.charCodeAt();\n e('\s\su00' + Math.floor(c / 16).toString(16) +\n (c % 16).toString(16));\n }\n }\n }\n e('"');\n return;\n case 'boolean':\n e(String(x));\n return;\n default:\n e('null');\n return;\n }\n }\n g(v);\n return a.join('');\n },\n/*\n Parse a JSON text, producing a JavaScript value.\n*/\n parse: function (text) {\n var p = /^\ss*(([,:{}\s[\s]])|"(\s\s.|[^\sx00-\sx1f"\s\s])*"|-?\sd+(\s.\sd*)?([eE][+-]?\sd+)?|true|false|null)\ss*/,\n token,\n operator;\n\n function error(m, t) {\n throw {\n name: 'JSONError',\n message: m,\n text: t || operator || token\n };\n }\n\n function next(b) {\n if (b && b != operator) {\n error("Expected '" + b + "'");\n }\n if (text) {\n var t = p.exec(text);\n if (t) {\n if (t[2]) {\n token = null;\n operator = t[2];\n } else {\n operator = null;\n try {\n token = eval(t[1]);\n } catch (e) {\n error("Bad token", t[1]);\n }\n }\n text = text.substring(t[0].length);\n } else {\n error("Unrecognized token", text);\n }\n } else {\n token = operator = undefined;\n }\n }\n\n\n function val() {\n var k, o;\n switch (operator) {\n case '{':\n next('{');\n o = {};\n if (operator != '}') {\n for (;;) {\n if (operator || typeof token != 'string') {\n error("Missing key");\n }\n k = token;\n next();\n next(':');\n o[k] = val();\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next('}');\n return o;\n case '[':\n next('[');\n o = [];\n if (operator != ']') {\n for (;;) {\n o.push(val());\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next(']');\n return o;\n default:\n if (operator !== null) {\n error("Missing value");\n }\n k = token;\n next();\n return k;\n }\n }\n next();\n return val();\n }\n};\n//}}}\n/***\n!Setup the data serialization\n***/\n//{{{\nDataTiddler.format = "JSON";\nDataTiddler.stringify = JSON.stringify;\nDataTiddler.parse = JSON.parse;\n\n//}}}\n\n
/***\n''Date Plugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#DatePlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n^^last update: <<date tiddler "DDD, MMM DDth, YYYY hh:0mm:0ss">>^^\n\nThere are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.\n\nYou can ''specify a date using a combination of year, month, and day number values or mathematical expressions (such as "Y+1" or "D+30")'', and then just display it as formatted date text, or create a ''link to a 'dated tiddler''' for quick blogging, or create a ''popup menu'' containing the dated tiddler link plus links to ''tiddlers that were changed'' as well as any ''scheduled reminders'' for that date.\n!!!!!Usage\n<<<\nWhen installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.\n\nHowever, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:\n* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.\n* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values. \n* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"\n>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^\n>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^\n>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^\n>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^\n* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format\n\nIn addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:\n\n''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' \n\nNote that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:\n* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.\n* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.\n<<<\n!!!!!Examples\n<<<\nThe current date: <<date>>\nThe current time: <<date today "0hh:0mm:0ss">>\nToday's blog: <<date link today "DDD, MMM DDth, YYYY">>\nRecent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>\nThe first day of next month will be a <<date Y M+1 1 "DDD">>\nThis tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>\nThe SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>\nThis document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DatePlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.\n''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.\n''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.\n''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").\n''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.\n''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables\n''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.\n''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()\n''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)\nadded flag param to showDate() API to override internal weekend[] array\n''2005.12.27 [2.0.0]'' Update for TW2.0\nAdded parameter handling for 'linkformat'\n''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.\n''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter\n''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter\n''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.\n''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).\n''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...\n''2005.10.31 [1.0.1]'' documentation and code cleanup\n''2005.10.31 [1.0.0]'' initial public release\n''2005.10.30 [0.9.0]'' pre-release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.date = {major: 2, minor: 2, revision: 1, date: new Date(2006,5,9)};\n//}}}\n\n//{{{\nconfig.macros.date = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#babb1e", // "babble"\n todaybg: "#ffab1e", // "fable"\n weekendbg: "#c0c0c0", // "cocoa"\n holidaybg: "#ffaace", // "face"\n modifiedsbg: "#bbeeff", // "beef"\n remindersbg: "#c0ffee", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};\n//}}}\n\n//{{{\nconfig.macros.date.handler = function(place,macroName,params)\n{\n // do we want to see a link, a popup, or just a formatted date?\n var mode="display";\n if (params[0]=="display") { mode=params[0]; params.shift(); }\n if (params[0]=="popup") { mode=params[0]; params.shift(); }\n if (params[0]=="link") { mode=params[0]; params.shift(); }\n // get the date\n var now = new Date();\n var date = now;\n if (!params[0] || params[0]=="today")\n { params.shift(); }\n else if (params[0]=="filedate")\n { date=new Date(document.lastModified); params.shift(); }\n else if (params[0]=="tiddler")\n { date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }\n else if (params[0].substr(0,8)=="tiddler:")\n { var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }\n else {\n var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));\n var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));\n var d = eval(params.shift().replace(/D/ig,now.getDate()+0));\n date = new Date(y,m-1,d);\n }\n // date format with optional custom override\n var format=this.format; if (params[0]) format=params.shift();\n var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();\n showDate(place,date,mode,format,linkformat);\n}\n//}}}\n\n//{{{\nwindow.showDate=showDate;\nfunction showDate(place,date,mode,format,linkformat,autostyle,weekend)\n{\n if (!mode) mode="display";\n if (!format) format=config.macros.date.format;\n if (!linkformat) linkformat=config.macros.date.linkformat;\n if (!autostyle) autostyle=false;\n\n // format the date output\n var title = date.formatString(format);\n var linkto = date.formatString(linkformat);\n\n // just show the formatted output\n if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }\n\n // link to a 'dated tiddler'\n var link = createTiddlyLink(place, linkto, false);\n link.appendChild(document.createTextNode(title));\n link.title = linkto;\n link.date = date;\n link.format = format;\n link.linkformat = linkformat;\n\n // if using a popup menu, replace click handler for dated tiddler link\n // with handler for popup and make link text non-italic (i.e., an 'existing link' look)\n if (mode=="popup") {\n link.onclick = onClickDatePopup;\n link.style.fontStyle="normal";\n }\n\n // format the popup link to show what kind of info it contains (for use with calendar generators)\n if (!autostyle) return;\n if (hasModifieds(date))\n { link.style.fontStyle="normal"; link.style.fontWeight="bold"; }\n if (hasReminders(date))\n { link.style.textDecoration="underline"; }\n if(isToday(date))\n { link.style.border="1px solid black"; }\n\n if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )\n { place.style.background = config.macros.date.weekendbg; }\n if(isHoliday(date)&&(config.macros.date.holidaybg!=""))\n { place.style.background = config.macros.date.holidaybg; }\n if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))\n { place.style.background = config.macros.date.modifiedsbg; }\n if (store.tiddlerExists(linkto)&&(config.macros.date.linkedbg!=""))\n { place.style.background = config.macros.date.linkedbg; }\n if (hasReminders(date)&&(config.macros.date.remindersbg!=""))\n { place.style.background = config.macros.date.remindersbg; }\n if(isToday(date)&&(config.macros.date.todaybg!=""))\n { place.style.background = config.macros.date.todaybg; }\n}\n//}}}\n\n//{{{\nfunction isToday(date) // returns true if date is today\n { var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }\n\nfunction isWeekend(date) // returns true if date is a weekend\n { return (config.macros.date.weekend[date.getDay()]); }\n\nfunction isHoliday(date) // returns true if date is a holiday\n{\n var longHoliday = date.formatString("0MM/0DD/YYYY");\n var shortHoliday = date.formatString("0MM/0DD");\n for(var i = 0; i < config.macros.date.holidays.length; i++) {\n var holiday=config.macros.date.holidays[i];\n if (holiday==longHoliday||holiday==shortHoliday) return true;\n }\n return false;\n}\n//}}}\n\n//{{{\n// Event handler for clicking on a day popup\nfunction onClickDatePopup(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = createTiddlerPopup(this);\n if(popup) {\n // always show dated tiddler link (or just date, if readOnly) at the top...\n if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))\n createTiddlyLink(popup,this.date.formatString(this.linkformat),true);\n else\n createTiddlyText(popup,this.date.formatString(this.linkformat));\n addModifiedsToPopup(popup,this.date,this.format);\n addRemindersToPopup(popup,this.date,this.linkformat);\n }\n scrollToTiddlerPopup(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nfunction indexModifieds() // build list of tiddlers, hash indexed by modification date\n{\n var modifieds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].modified.formatString("YYYY0MM0DD")\n if (!modifieds[date])\n modifieds[date]=new Array();\n modifieds[date].push(tiddlers[t].title);\n }\n return modifieds;\n}\nfunction hasModifieds(date) // returns true if date has modified tiddlers\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addModifiedsToPopup(popup,when,format)\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];\n if (mods) {\n mods.sort();\n var e=createTiddlyElement(popup,"div",null,null,"changes:");\n for(var t=0; t<mods.length; t++) {\n var link=createTiddlyLink(popup,mods[t],false);\n link.appendChild(document.createTextNode(indent+mods[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date\n{\n var reminders = { };\n if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed\n // DEBUG var starttime=new Date();\n var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);\n for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;\n // DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\sn";\n // DEBUG out+="startdate: "+date.toLocaleDateString()+"\sn"+"leadtime: "+leadtime+" days\sn\sn";\n // DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\sn"; }\n // DEBUG alert(out);\n }\n return reminders;\n}\n\nfunction hasReminders(date) // returns true if date has reminders\n{\n if (window.reminderCacheForCalendar)\n return window.reminderCacheForCalendar[date]; // use calendar cache\n if (!config.macros.date.reminders)\n config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache\n return (config.macros.date.reminders[date]);\n}\n\nfunction addRemindersToPopup(popup,when,format)\n{\n if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed\n\n var indent = String.fromCharCode(160)+String.fromCharCode(160);\n var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);\n var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));\n for(var t=0; t<reminders.length; t++) {\n link = createTiddlyLink(popup,reminders[t].tiddler,false);\n var diff=reminders[t].diff;\n diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");\n var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;\n link.appendChild(document.createTextNode(indent+diff+" - "+txt));\n createTiddlyElement(popup,"br",null,null,null);\n }\n if (readOnly) return; // omit "new reminder..." link\n var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");\n var title = when.formatString(format);\n link.title="add a reminder to '"+title+"'";\n link.onclick = function() {\n // show tiddler editor\n story.displayTiddler(null, title, 2, null, null, false, false);\n // find body 'textarea'\n var c =document.getElementById("tiddler" + title).getElementsByTagName("*");\n for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;\n // append reminder macro to tiddler content\n if (i<c.length) {\n if (store.tiddlerExists(title)) c[i].value+="\sn"; else c[i].value="";\n c[i].value += "<<reminder";\n c[i].value += " day:"+when.getDate();\n c[i].value += " month:"+(when.getMonth()+1);\n c[i].value += " year:"+when.getFullYear();\n c[i].value += ' title:"Enter a title" >>';\n }\n };\n}\n//}}}\n
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Dawn Marie Blades]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n\n<data>{"firstname":"David","lastname":"Szuc","cellphone":"618-334-8452","workphone":"314-801-9098","homephone":"618-235-5937","city":"Collinsville","state":"IL","country":"USA"}</data>
Booth: Help at [[Gallerie de Imagination]]\nHome Phone: 618-235-5937\nCell Phone: \nWork Phone: 314-801-9098\nE-mail: <<email blank at blank dot com>>\nIM Handle: \nWebsite: \nAddress: \nCity, State, Zip: Collinsville, IL\n\nBirthdate: \n----\nSee: DawnBlades, WalkerSzucs, JennaBlades\n
<<formTiddler ContactsFormTemplate>>\nAlso see: [[David Szuc]]\n\nBirthdate, Anniversaries & Such:\n<<newReminder>>\n<data>{"firstname":"Dawn Marie","lastname":"Blades","e-mail":"morningbourne@sbcglobal.net","e-mail1":"morningbourne","e-mail2":"sbcglobal.net","homephone":"618-235-5937"}</data>
Iit has been coming ever since Eli Whintey's invention of mass production by identical parts. The end to Individuality. Each of us must use the exact same form letters which convey no unique personality. Formed by a committie of one who then took them to the boss to get them aproved, and then brought them to a meeting and said "The boss has already aproved them. Do you see anything that needs to be changed." Umm...what can I say? \n\nYes, it tells people what they need to know, but then so did what I was using. \nWere folks not understanding my e-mails? If so, no one ever told me. \nWere we confusing people by having different letters? If so, no one ever told me. \nBut that matters not. I will be assimulated into the collective. No free thought, no indviduality, no freedom to be creative.\nDrone I shall be. No name, just a number.\nSigned,\nDrone 110514
@inbox\nReminders\nMyJournal
Get in a rush order for a training (No, not on Procrastination...this time). \n*They want it to happen in 5 business days. \n*It will happen in one of 3 different sites, decision to be made the day before the training.\n*They either want us to combine 2 of our trainings into a training that will focus on X with some support tools for Y (one is on communication while the other is on stress management. They have not deciede which one would be X), or they might go with both trainings back to back.\n*They want the trainer to show up at Noon at the latest. Training to start at 1pm. Have him stay for at least 1 hour after training. They are willing to pay him for the 2.5 hours he is doing the trainings. So he is there for 4.5 hours and they will pay for 2.5....yeah this makes it easy to find a ==sucker== trainer.\n
Things I am working on to help me get a better picture of myself.\n\n\n<<gtdAction "MY TALENTS" "@computer">>\n<<gtdAction "MY PERSONAL VALUES" "@computer">>\n<<gtdAction "Aspects of Myself" "@computer">>
Details go here\n\n<<reminder date:28 month:6 year:2006 title:"2:00pm - John's Desk">>
A coworker just spent about 2 manhours trying to get the correct spelling of someone's last name. \nWhat was wrong; "Is the third letter an i or an e?"\nShe sent an e-mail to 5 people, 2 of whom called him to find out, 2 whom sent him an e-mail and one who was at lunch and missed it all. None of the people who sent e-mails responding back to her cc: in the others so everyone duplicated each others work.\nWhy did the co-worker not contact the person herself? Procedure says any time a customer must be contacted the Account Exec must be the one who does it (I tend to ignore this procedure for simple things like this.)\nWe don't even use their last name in any of our corrispondences.
|Name |Doug Glenn |\n|Company |StLRF, Inc. |\n|E-mail | |\n|Home Phone | |\n|Cell Phone | |\n|Work Phone | |\n|Website | |\n|Address | |\n|City ST | |\n|zipcode | |\n|Notes | |\n|More notes | |
A headline from in Forbes from an Associated Press article ~''Gas Costs Expected to Be High This Summer''. \nCan anyone remember a time when summer rolled around and gas prices didn't go up? And what is the current reason? We ''might'' stop getting oil from Iran. So the price goes up $0.60 now and then when we do stop getting oil from Iran, ''WHAM!'', now fork over an extra buck.
What I am wanting is a button that will allow me to pick one of my contacts, and then have it automatically put the tiddler title into the subject line, and the body in to the body followed by the tags.\nSimple, huh?
The idea was right in front of me the whole time. A simple mailto macro in the toolbar that use the current tiddler.title as the subject line and tiddler.text and tiddler.tag go into the body.\n\nNo, it is not going to be something that is push button and add it to my TW, but then that is not what I want. I want it so that I can send Joe a copy of the project, or Sally's contact info, with a push of a button.\n\nNow to go refresh myself on how mailto works and look at some plugins to figure out how to call up the title and such.
<div class='toolbar' macro='toolbar deleteTiddler closeOthers +saveTiddler -cancelTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<div class='editor' macro='edit text'></div>
|Name | |\n|Company |Elven Drums |\n|E-mail | |\n|Website | |\n|Home Phone | |\n|Cell Phone | |\n|Work Phone | |\n|Address | |\n|Address2 | |\n|City ST | |\n|Zipcode | |\n|Notes | |\n|Other notes | |
// //''Name:'' EmailLink\n// //''Version:'' <<getversion email>> (<<getversiondate email "DD MMM YYYY">>)\n// //''Author:'' AlanHecht\n// //''Type:'' [[Macro|Macros]]\n\n// //''Description:'' email lets you list a "email" address without displaying it as readable text. This helps prevent your email address from being harvested by search engines and other web crawlers that read your page's contents. Using email, you type in the words "at" and "dot" instead of the punctuation symbols and add spaces inbetween words to disguise your address. However, email will display your email address in a web browser so that humans can read it. And email turns the address into a hyperlink that can be clicked to send you an instant email.\n\n// //''Syntax:'' << {{{email yourname at yourdomain dot com "?optional parameters"}}} >>\n// //Example 1: <<email sample at nowhere dot com>> (standard)\n// //Example 2: <<email multiple dot sample at somewhere dot nowhere dot com>> (multiple dots)\n// //Example 3: <<email sample at nowhere dot com "?subject=Submission&body=Type your message here.">> (with optional parameters)\n\n// //''Directions:'' <<tiddler MacroDirections>>\n\n// //''Notes:'' You can use the optional email parameters to stipulate a subject or message body for the message. Most (not all) email clients will use this information to construct the email message.\n\n// //''Related Links:'' none\n\n// //''Revision History:''\n// // v0.1.0 (20 July 2005): initial release\n// // v0.1.1 (22 July 2005): renamed the macro from "mailto" to "email" to further thwart email harvesters.\n// // v0.1.2 (15 October 2005): added global replacement of "dots" thanks to a suggestion from Ralph Winter\n\n// //''Code section:''\nversion.extensions.email = {major: 0, minor: 1, revision: 2, date: new Date("Oct 15, 2005")};\nconfig.macros.email = {}\nconfig.macros.email.handler = function(place,macroName,params)\n{\nvar temp = params.join(" ");\ndata = temp.split("?");\nvar recipient = data[0];\nrecipient = recipient.replace(" at ","@").replace(" dot ",".","g");\nrecipient = recipient.replace(/\ss/g,"");\nvar optional = data[1] ? "?" + data[1] : "";\nvar theLink = createExternalLink(place,"ma"+"il"+"to:"+recipient+optional);\ntheLink.appendChild(document.createTextNode(recipient))\n}\n
//{{{\nconfig.macros.email1 = {};\nconfig.macros.email1.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n\n wikify('[[Email1|mailto:?subject='+escape(tiddler.title)+'&body='+escape(view.tiddler.text)+' Tags:'+escape(tiddler.tags)+']]',place);\n place.lastChild.className='button'; \n place.lastChild.title='Email this tiddler'; \n}\n//}}}
|Name |Eric |\n|Company | |\n|E-mail | |\n|Website | |\n|Home Phone | |\n|Cell Phone | |\n|Work Phone | |\n|Address |123 Some Rd. |\n|Address2 |Apt. 34 |\n|City ST | |\n|Zipcode | |\n|Notes | |\n|Other notes | |
http://www.sedumphotos.net/nfagerlund/fmp/\n\n!My Fiendish Master Plan\n\nFor you plain text nerds, Nick Fagerlund has developed a nifty little Ruby script called โFiendish Master Planโ that helps with managing your lists of tasks or what have you.\n\nThe basic idea is to capture anything you need into one text file, with one item per line. He (and I) recommend using a Quicksilver trigger to append to that file of your choice as you work. When adding an item, you use a โcategoryโ tag (as in โ^categoryโ) which you type at the beginning of each line you. Ala:\n{{{\n^write thank Jaime for delicious basket of kittens \n^errand take blood-stained poncho to French Cleaners \n^chore find source of smell under clownโs house \n}}}\nPeriodically, you then run Nickโs script (either manually, via the command line, or by cron would work), and the magic happens. All the tagged items from your master list are appended to separate text files matching the name of the one-word category. In the above, for example, my thank you note to-do is added to my โwrite.txtโ list, and off I go.\n\nI havenโt spent too long with FMP, but it installed fine for me (with his โI donโt know Unixโ directions) and worked for the few test items I ran. I like that you could use this for GTD contexts, as well as for reference materials and running lists โ e.g. โ^getmusic Sonic Youth - Rather Rippedโ would write to a file of records you want to listen to called โgetmusic.txt.โ \n\nSimple script that does a simple (but very handy) thing โ the ultimate life hack. \n\n
At long last I have figured out what the folks with the fish symbol on thier car are trying to tell me: "Yeah, I cut you off, but it's OK. God forgives me."
<<newReminder>>\n\n<<reminder year:2006 month:9 day:2 title:"pm7:00 Football vs. Jennings H.S." >>\n<<reminder year:2006 month:9 day:8 title:"pm7 Football vs. Kansas City Paseo Academy" >>\n<<reminder year:2006 month:9 day:15 title:"pm5:00 Football vs. Washington H.S. @ Lindenwood University" >>\n<<reminder year:2006 month:9 day:22 title:"pm7:00 Football vs. Cape Girardeau Central H.S. (Eighth Grade Band Night)" >>\n<<reminder year:2006 month:9 day:29 title:"pm7:00 Football vs. Helias H.S." >>\n<<reminder year:2006 month:10 day:13 title:"pm7:00 Football vs. Warrenton H.S." >>\n<<reminder year:2006 month:11 day:2 title:"pm7:00 Football vs. St. Charles West H.S. (Senior Night)" >>
To sort by data\n{{{\n<<forEachTiddler\n sortBy 'tiddler.data("priority")' >>\n}}}\nTo referencing a different TW put this in your TW (Changing what you need):\n{{{\n<<forEachTiddler in 'file:\s\s\sT:\sEnvironmental & Customer \nServices\sShared \nResources\sProcedures\sRegistration\sRegistrationProcedures.htm' \n where \n 'tiddler.tags.contains("Procedures")' \n write \n'"*[["+tiddler.title+"|Registration\s\sRegistrationProcedures.htm#%5B%5B"+tidยญdler.title+"%5D%5D]]"+"\sn"' >>\n}}}
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-05)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|[[ForEachTiddlerMacro]] v1.0.5|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.5\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nversion.extensions.ForEachTiddlerPlugin = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), source: "http://tiddlywiki.abego-software.de/#ForEachTiddlergPlugin"};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var tiddlyWiki = new TiddlyWiki();\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s"); \n return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n\n
/***\n<<checkForDataTiddlerPlugin>>\n|''Name:''|FormTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-24)|\n|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|\n|''Requires:''|DataTiddlerPlugin|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nUse form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).\n\n''Syntax:'' \n|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|\n|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|\n\n|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|\n|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|\n|//buttonLabel//|The label of the button|\n|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|\n|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nFor details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].\n\n!Revision history\n* v1.0.5 (2006-02-24)\n** Removed "debugger;" instruction\n* v1.0.4 (2006-02-07)\n** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)\n* v1.0.3 (2006-02-05)\n** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)\n* v1.0.2 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.1 (2005-12-22)\n** Features: \n*** Support InternetExplorer\n*** Added newTiddlerWithForm Macro\n* v1.0.0 (2005-12-14)\n** initial version\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// FormTiddlerPlugin\n//============================================================================\n//============================================================================\n\n\nversion.extensions.FormTiddlerPlugin = {\n major: 1, minor: 0, revision: 5,\n date: new Date(2006, 2, 24), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } \n\n//============================================================================\n// formTiddler Macro\n//============================================================================\n\n// -------------------------------------------------------------------------------\n// Configurations and constants \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler = {\n // Standard Properties\n label: "formTiddler",\n version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},\n prompt: "Edit tiddler data using forms",\n\n // Define the "setters" that set the values of INPUT elements of a given type\n // (must match the corresponding "getter")\n setter: { \n button: function(e, value) {/*contains no data */ },\n checkbox: function(e, value) {e.checked = value;},\n file: function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},\n hidden: function(e, value) {e.value = value;},\n password: function(e, value) {e.value = value;},\n radio: function(e, value) {e.checked = (e.value == value);},\n reset: function(e, value) {/*contains no data */ },\n "select-one": function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},\n "select-multiple": function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},\n submit: function(e, value) {/*contains no data */},\n text: function(e, value) {e.value = value;},\n textarea: function(e, value) {e.value = value;}\n },\n\n // Define the "getters" that return the value of INPUT elements of a given type\n // Return undefined to not store any data.\n getter: { \n button: function(e, value) {return undefined;},\n checkbox: function(e, value) {return e.checked;},\n file: function(e, value) {return e.value;},\n hidden: function(e, value) {return e.value;},\n password: function(e, value) {return e.value;},\n radio: function(e, value) {return e.checked ? e.value : undefined;},\n reset: function(e, value) {return undefined;},\n "select-one": function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},\n "select-multiple": function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},\n submit: function(e, value) {return undefined;},\n text: function(e, value) {return e.value;},\n textarea: function(e, value) {return e.value;}\n }\n};\n\n\n// -------------------------------------------------------------------------------\n// The formTiddler Macro Handler \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {\n return;\n }\n \n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n\n // --- Processing ------------------------------------------\n\n // Get the form template text. \n // (This contains the INPUT elements for the form.)\n var formTemplateTiddler = store.getTiddler(formTemplateName);\n if (!formTemplateTiddler) {\n config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");\n return;\n }\n var templateText = formTemplateTiddler.text;\n if(!templateText) {\n // Shortcut: when template text is empty we do nothing.\n return;\n }\n\n // Get the name of the tiddler containing this "formTiddler" macro\n // (i.e. the tiddler, that will be edited and that contains the data)\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);\n\n // Append a "form" element. \n var formName = "form"+formTemplateName+"__"+tiddlerName;\n var e = document.createElement("form");\n e.setAttribute("name", formName);\n place.appendChild(e);\n\n // "Embed" the elements defined by the templateText (i.e. the INPUT elements) \n // into the "form" element we just created\n wikify(templateText, e);\n\n // Initialize the INPUT elements.\n config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));\n}\n\n\n// -------------------------------------------------------------------------------\n// Form Data Access \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\n// Initialize the INPUT elements of the form with the values of their "matching"\n// data fields in the tiddler. Also setup the onChange handler to ensure that\n// changes in the INPUT elements are stored in the tiddler's data.\n//\nconfig.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {\n // config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");\n\n // find the form\n var form = config.macros.formTiddler.findForm(formName);\n if (!form) {\n return;\n }\n\n try {\n var elems = form.elements;\n for (var i = 0; i < elems.length; i++) {\n var c = elems[i];\n \n var setter = config.macros.formTiddler.setter[c.type];\n if (setter) {\n var value = data[c.name];\n if (value != null) {\n setter(c, value);\n }\n c.onchange = onFormTiddlerChange;\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");\n }\n }\n } catch(e) {\n config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);\n }\n}\n\n\n// Internal.\n//\n// @return [may be null]\n//\nconfig.macros.formTiddler.findForm = function(formName) {\n // We must manually iterate through the document's forms, since\n // IE does not support the "document[formName]" approach\n\n var forms = window.document.forms;\n for (var i = 0; i < forms.length; i++) {\n var form = forms[i];\n if (form.name == formName) {\n return form;\n }\n }\n\n return null;\n}\n\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectOneValue = function(element,value) {\n var n = element.options.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = element.options[i].value == value;\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectMultipleValue = function(element,value) {\n var values = {};\n for (var i = 0; i < value.length; i++) {\n values[value[i]] = true;\n }\n \n var n = element.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = !(!values[element.options[i].value]);\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectOneValue = function(element) {\n var i = element.selectedIndex;\n return (i >= 0) ? element.options[i].value : null;\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectMultipleValue = function(element) {\n var values = [];\n var n = element.length;\n for (var i = 0; i < n; i++) {\n if (element.options[i].selected) {\n values.push(element.options[i].value);\n }\n }\n return values;\n}\n\n\n\n// -------------------------------------------------------------------------------\n// Helpers \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.formTiddler.checkForExtensions = function(place,macroName) {\n if (!version.extensions.DataTiddlerPlugin) {\n config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");\n return false;\n }\n return true;\n}\n\n// Internal.\n//\n// Displays a trace message in the "TiddlyWiki" message pane.\n// (used for debugging)\n//\nconfig.macros.formTiddler.trace = function(s) {\n displayMessage("Trace: "+s);\n}\n\n// Internal.\n//\n// Display some error message in the "TiddlyWiki" message pane.\n//\nconfig.macros.formTiddler.displayFormTiddlerError = function(s) {\n alert("FormTiddlerPlugin Error: "+s);\n}\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.formTiddler.createErrorElement = function(place, message) {\n return createTiddlyElement(place,"span",null,"formTiddlerError",message);\n}\n\n// Internal.\n//\n// Returns the name of the tiddler containing the given element.\n// \nconfig.macros.formTiddler.getContainingTiddlerName = function(element) {\n return story.findContainingTiddler(element).id.substr(7);\n}\n\n// -------------------------------------------------------------------------------\n// Event Handlers \n// -------------------------------------------------------------------------------\n\n// This function must be called by the INPUT elements whenever their\n// data changes. Typically this is done through an "onChange" handler.\n//\nfunction onFormTiddlerChange (e) {\n // config.macros.formTiddler.trace("onFormTiddlerChange "+e);\n\n if (!e) var e = window.event;\n\n var target = resolveTarget(e);\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);\n var getter = config.macros.formTiddler.getter[target.type];\n if (getter) {\n var value = getter(target);\n DataTiddler.setData(tiddlerName, target.name, value);\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");\n }\n}\n\n// ensure that the function can be used in HTML event handler\nwindow.onFormTiddlerChange = onFormTiddlerChange;\n\n\n// -------------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// -------------------------------------------------------------------------------\n\nsetStylesheet(\n ".formTiddlerError{color: #ffffff;background-color: #880000;}",\n "formTiddler");\n\n\n//============================================================================\n// checkForDataTiddlerPlugin Macro\n//============================================================================\n\nconfig.macros.checkForDataTiddlerPlugin = {\n // Standard Properties\n label: "checkForDataTiddlerPlugin",\n version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},\n prompt: "Check if the DataTiddlerPlugin exists"\n}\n\nconfig.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {\n config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);\n}\n\n\n\n//============================================================================\n// newTiddlerWithForm Macro\n//============================================================================\n\nconfig.macros.newTiddlerWithForm = {\n // Standard Properties\n label: "newTiddlerWithForm",\n version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},\n prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"\n}\n\nconfig.macros.newTiddlerWithForm.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the button label\n var buttonLabel = undefined;\n if (i < params.length) {\n buttonLabel = params[i];\n i++;\n }\n\n if (!buttonLabel) {\n config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the (optional) tiddlerName script and "askUser"\n var tiddlerNameScript = undefined;\n var askUser = false;\n if (i < params.length) {\n tiddlerNameScript = params[i];\n i++;\n\n if (i < params.length && params[i] == "askUser") {\n askUser = true;\n i++;\n }\n }\n\n // --- Processing ------------------------------------------\n\n if(!readOnly) {\n var onClick = function() {\n var tiddlerName;\n if (tiddlerNameScript) {\n try {\n tiddlerName = eval(tiddlerNameScript);\n } catch (ex) {\n }\n }\n if (!tiddlerName || askUser) {\n tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");\n }\n while (tiddlerName && store.getTiddler(tiddlerName)) {\n tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\sn\sn"+"Please specify a tiddler name.", tiddlerName);\n }\n\n // tiddlerName is either null (user canceled) or a name that is not yet in the store.\n if (tiddlerName) {\n var body = "<<formTiddler [["+formTemplateName+"]]>>";\n var tags = [];\n store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);\n story.displayTiddler(null,tiddlerName,1);\n }\n }\n\n createTiddlyButton(place,buttonLabel,buttonLabel,onClick);\n }\n}\n\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
Get a call from a co-worker who wanted to return a non-work related borrowed item. It was amusing trying to schedual a time to transfer the item from car to car. See, I have no set time on anything. My job involves me sitting at a computer. I only walk away from it to get paper or to transfer fluids from the coffeepot to the restroom. I can stop what I am doing at any time and wander away as long as I want. The boss will not complain as long as I still get everything done on time.\n\nSo while I was trying to be polite and open to any time she suggest, she kept pushing for me to make a desicion as to when. Even when I pointed out that I can do it at any time (The swap I mean) she still kept trying to get me to commit to something.\n\nIt struck me as funny as she is a hardcore-alpha, be-in-charge type person. I am so beta, laid back, non-confrontational and non-commital it is a miricle I get anything done. So what is it about this situation that makes her want me to be in the driver seat?\n
|Name |E-mail |Cell |Home |Web |\n<<forEachTiddler\n where\n 'tiddler.tags.contains("personal") && tiddler.tags.contains("contact")' \n sortBy 'tiddler.title'\n write \n '"|[["+tiddler.title+"]]|<<email "+tiddler.data("e-mail1")+"@"+tiddler.data("e-mail2")+"$)) | "+ tiddler.data("cellphone") + "| "+tiddler.data("homephone")+" | <html><a href="+ tiddler.data("website")+"$)Web</a$)</html$) |\sn"'\n>>
http://www.allmusic.com/cg/amg.dll?p=amg&sql=11:m8x8b5t4tsqh~T2\nhttp://www.pandora.com/music/song/23397f0b521d7513\nJust heard them on Pandora and had to look up MY band.\n\nAlso, http://No-Sin.com finally made it to the first page on Google!
<<calendar>>
+++!!!![Projects & Actions]\n+++(gtdProjectsSliderState)[Projects]<<list tagged project>>\n=== \n+++(gtdActionsSliderState)[Actions]<<list tagged context>>\n=== \n+++(gtdReviewSliderState)[Review]\n* [[Project Review]]\n* [[Action Review]]\n* [[Reminders]]\n* [[Goals]]\n=== \n<<newerTiddler button:"Create new project" name:"NewProject" tags:"project" template:"NewProjectTemplate">>\n<<newerTiddler button:"Create new context" name:"NewContext" tags:"context" template:"NewContextTemplate">>\n[[Reference]]\n[[Someday-Maybe]]\n[[Archives]]\n[[Configuration|Configuration Options]]\n[[Check for Updates|UpdateApplication]]\n===
/***\n''Name:'' GTDPlugins\n''Author:'' Tom Otvos\n''Version:'' <<gtdVersion>>\n\n''Macros:''\n*{{{<<gtdAction "}}}//title//{{{" "}}}//context list//{{{">>}}}\n*{{{<<gtdActionList {"}}}//context list//{{{" | "*" | "@" {"all"} }>>}}}\n** //if no parameters are specified, current context or project is used//\n** //specify "*" for actions across all projects, "@" for incomplete actions across all contexts (or "all" for all actions)//\n*{{{<<list tagged "}}}//tag list//{{{" {any | all}>>}}}\n** //if no parameters are specified, all tags are necessary//\n*{{{<<importUpdates "}}}//url//{{{" {updates | all} "}}}//buttonTitle//{{{" "}}}//buttonHelp//{{{" "}}}//importTiddlers params...//{{{">>}}}\n*{{{<<gtdArchive { archive | unarchive | purge }>>}}}\n\n''Commands:''\n*{{{newAction}}}\n*{{{newProjectAction}}}\n*{{{changeContext}}}\n*{{{deleteAction}}}\n*{{{deleteContext}}}\n*{{{deleteProject}}}\n*{{{deleteProjectAll}}}\n*{{{projectify}}}\n\n''Wiki formatting:''\n*{{{..new action title|context}}}\n\n***/\n//{{{\n\nversion.extensions.GTDPlugins = {major: 1, minor: 0, revision: 10, date: new Date(2006,4,26,0,0,0,0), source: "http://www.dcubed.ca/"};\n\nvar _GTD = {\n\n initialize: function ()\n {\n if (config.options.txtGTDReferenceContext == undefined) config.options.txtGTDReferenceContext = "reference";\n if (config.options.txtGTDSomedayContext == undefined) config.options.txtGTDSomedayContext = "someday";\n if (config.options.txtGTDUnfiledContext == undefined) config.options.txtGTDUnfiledContext = "unfiled";\n if (config.options.txtGTDActionAging == undefined) config.options.txtGTDActionAging = "";\n if (config.options.chkGTDFancyStyle == undefined) config.options.chkGTDFancyStyle = true;\n \n // some tricks to work when our script is loaded from an external file...\n if (!store) config.notifyTiddlers.push( {name: "GTDStyleSheet", notify: refreshStyles} );\n if (!store && config.options.chkGTDFancyStyle) config.notifyTiddlers.push( {name: "GTDTWStyleSheet", notify: refreshStyles} );\n if (!store) config.notifyTiddlers.push( {name: null, notify: _GTD.refreshActionViews} );\n if (!store) return;\n\n var tiddlers = [];\n tiddlers = tiddlers.concat(store.getTaggedTiddlers("project"), store.getTaggedTiddlers("context"), store.getTaggedTiddlers("action"));\n for (var i = 0; i < tiddlers.length; i++)\n tiddlers[i].changed();\n store.addNotification("GTDStyleSheet", refreshStyles);\n if (config.options.chkGTDFancyStyle) store.addNotification("GTDTWStyleSheet", refreshStyles);\n store.addNotification(null, _GTD.refreshActionViews);\n \n // force a display of release notes, if required\n var v = version.extensions.GTDPlugins;\n var releaseNotesTiddler = "About version " + v.major + '.' + v.minor + '.' + v.revision;\n if ((config.options.chkGTDReleaseNotes || config.options.chkGTDReleaseNotes == undefined) && store.tiddlerExists(releaseNotesTiddler)) {\n params = "open:\s"" + releaseNotesTiddler + "\s"";\n params = params.parseParams("open",null,false);\n config.options.chkGTDReleaseNotes = false;\n saveOptionCookie("chkGTDReleaseNotes");\n }\n },\n\n tiddlerHasTag: function (tiddler, tag)\n {\n if (typeof(tiddler) == "string") tiddler = store.getTiddler(tiddler);\n if (tiddler.tags.length == 0) return false;\n return (tiddler.tags.find(tag) != null);\n },\n \n tiddlerSwapTag: function (tiddler, oldTag, newTag)\n {\n for (var i = 0; i < tiddler.tags.length; i++)\n if (tiddler.tags[i] == oldTag) {\n tiddler.tags[i] = newTag;\n return true;\n }\n return false;\n },\n \n tiddlerHasChanged: function (tiddler, doSave)\n {\n tiddler.changed();\n //story.setDirty(tiddler.title, true);\n store.setDirty(true);\n if (doSave == undefined) doSave = true;\n if (config.options.chkAutoSave && doSave)\n saveChanges();\n },\n \n tiddlerAgeInDays: function(tiddler)\n {\n var now = new Date();\n return (now.getTime() - tiddler.modified.getTime()) / 1000 / 86400;\n },\n \n filteredActionTags: function (tags, filterTitle)\n {\n var actionTags = [];\n for (var i = 0; i < tags.length; i++)\n if (tags[i] != "action" && tags[i] != "done" && tags[i] != "floating" && tags[i] != filterTitle) actionTags.push(tags[i]);\n return actionTags;\n },\n \n toggleTag: function (tiddler, tag, toggle)\n {\n var tagIndex = -1;\n for (var i = 0; i < tiddler.tags.length; i++)\n if (tiddler.tags[i] == tag) {\n tagIndex = i;\n break;\n }\n \n if (toggle && tagIndex == -1) {\n tiddler.tags.push(tag);\n }\n else if (!toggle && tagIndex != -1) {\n tiddler.tags.splice(tagIndex, 1);\n }\n },\n \n refreshActionViews: function (tiddler)\n {\n if (tiddler) {\n if (typeof(tiddler) == "string") tiddler = store.getTiddler(tiddler);\n if (tiddler) {\n // do not do anything if we are not an action!\n if (!_GTD.tiddlerHasTag(tiddler, "action")) return;\n story.refreshTiddler(tiddler.title, null, true);\n for (var i = 0; i < tiddler.tags.length; i++)\n if (tiddler.tags[i] != "action" && tiddler.tags[i] != "done") {\n story.refreshTiddler(tiddler.tags[i], null, true);\n }\n }\n }\n \n var specialTiddlers = store.getTaggedTiddlers("review");\n for (var i = 0; i < specialTiddlers.length; i++)\n story.refreshTiddler(specialTiddlers[i].title, null, true);\n },\n \n appendProjectAction: function(projectTiddler, actionTitle, actionContext)\n {\n var actionInsertionPoint = -1, actionLeadin = "";\n \n var reActionWikitext = "^\s\s.{2}([^|\sn]+)(?:\s\s|?)(.*).*$";\n var reActionMacro = "(.*)<<gtdAction ((?:[^>]|(?:>(?!>)))*)>>.*$";\n var actionRe = new RegExp("(" + reActionWikitext + ")|(" + reActionMacro + ")", "mg");\n do {\n var formatMatch = actionRe.exec(projectTiddler.text);\n if (formatMatch) {\n actionLeadin = (formatMatch[1] ? "" : formatMatch[5]);\n actionInsertionPoint = actionRe.lastIndex;\n }\n } while(formatMatch);\n \n var actionProto = "\sn" + actionLeadin + "<<gtdAction \s"" + actionTitle + "\s" \s"" + actionContext + "\s">>";\n if (actionInsertionPoint == -1)\n projectTiddler.text += actionProto;\n else\n projectTiddler.text = projectTiddler.text.substring(0, actionInsertionPoint) + actionProto + projectTiddler.text.substr(actionInsertionPoint + 1);\n \n this.tiddlerHasChanged(projectTiddler);\n this.refreshActionViews(projectTiddler);\n },\n \n removeProjectAction: function(projectTiddler, actionTitle)\n {\n //var reActionWikitext = "^(\s\s.{2})(" + actionTitle + ")((\s\s|.*\sn)|(\sn))";\n var reActionWikitext = "^(\s\s.{2})(" + actionTitle + ")((\s\s|.*\sn?)|(.*\sn?))";\n var reActionMacro = "(.*<<gtdAction [\s"\s']?)(" + actionTitle + ")([\s"\s']?\s\ss+(?:[^>]|(?:>(?!>)))*>>.*\sn?)";\n projectTiddler.text = projectTiddler.text.replace(new RegExp(reActionWikitext, "mg"), "");\n projectTiddler.text = projectTiddler.text.replace(new RegExp(reActionMacro, "mg"), "");\n projectTiddler.changed();\n story.refreshTiddler(projectTiddler.title, null, true);\n },\n \n saveWithForcedBackup: function()\n {\n var saveBackups = config.options.chkSaveBackups;\n config.options.chkSaveBackups = true;\n saveChanges();\n config.options.chkSaveBackups = saveBackups;\n },\n \n isNextAction: function(actionTiddler)\n {\n if (actionTiddler.gtdProject && actionTiddler == actionTiddler.gtdProject.gtdNextAction)\n return true;\n return this.tiddlerHasTag(actionTiddler, "floating");\n }\n};\n\nconfig.macros.gtdVersion = {}\nconfig.macros.gtdVersion.handler = function(place)\n{\n var v = version.extensions.GTDPlugins;\n createTiddlyElement(place, "span", null, null, v.major + "." + v.minor + "." + v.revision + (v.beta ? " (beta " + v.beta + ")" : ""));\n}\n\nconfig.macros.list.tagged = {}\nconfig.macros.list.tagged.innerHandler = function(tagList, allTags)\n{\n var tiddlers = store.getTaggedTiddlers(tagList[0]);\n\n if (allTags) {\n var results = [];\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i], hasAllTags = true;\n for (var j = 1; hasAllTags && j < tagList.length; j++)\n hasAllTags &= _GTD.tiddlerHasTag(tiddler, tagList[j]);\n if (hasAllTags) results.push(tiddlers[i]);\n }\n return results;\n }\n else {\n for (var i = 1; i < tagList.length; i++) {\n var more = store.getTaggedTiddlers(tagList[i]);\n for (var j = 0; j < more.length; j++)\n tiddlers.pushUnique(more[j]);\n }\n return tiddlers;\n }\n}\nconfig.macros.list.tagged.handler = function(params) \n{\n var tags = params[1].readBracketedList();\n if (tags.length == 1) {\n if (config.options[tags[0]] == undefined)\n return store.getTaggedTiddlers(tags[0]);\n else\n return store.getTaggedTiddlers(config.options[tags[0]]);\n }\n else if (tags.length > 1) {\n var allTags = (params[2] == undefined || params[2] == 'all');\n var tiddlers = this.innerHandler(tags, allTags);\n tiddlers.sort(function (a,b) {if(a.title == b.title) return(0); else return (a.title < b.title) ? -1 : +1; });\n return tiddlers;\n }\n}\n\nconfig.macros.gtdAction = {}\nconfig.macros.gtdAction.createActionElement = function(place, actionTiddler, parentTiddler, tags)\n{\n if (typeof(actionTiddler) == "string") actionTiddler = store.getTiddler(actionTiddler);\n \n var actionElement = createTiddlyElement(place, "span", null, "gtdActionItem");\n // oddly, we barf when setting the checkbox type on an input if we use createTiddlyElement...\n var cb = document.createElement("input");\n cb.setAttribute("type", "checkbox");\n cb.setAttribute("actionTiddler", actionTiddler.title);\n cb.setAttribute("contextTiddler", parentTiddler);\n cb.onclick = this.onClickDone;\n actionElement.appendChild(cb);\n cb.checked = actionTiddler.gtdActionDone;\n createTiddlyLink(actionElement, actionTiddler.title, true);\n if (actionTiddler.gtdActionDone) actionElement.className = "gtdCompletedActionItem";\n if (_GTD.isNextAction(actionTiddler)) actionElement.className = "gtdNextActionItem";\n \n var actionTags = _GTD.filteredActionTags(tags, parentTiddler);\n //if (actionTags.length > 0) createTiddlyText(actionElement, " (" + actionTags.join(",") + ")");\n if (actionTags.length > 0) {\n createTiddlyText(actionElement, " [");\n for (var i = 0; i < actionTags.length; i++) {\n if (i > 0) createTiddlyText(actionElement, ", ");\n createTiddlyLink(actionElement, actionTags[i], true, "actionCrossReference");\n }\n createTiddlyText(actionElement, "]");\n }\n \n /*\n if (actionTiddler.gtdProject && actionTiddler.gtdProjectName != parentTiddler) {\n createTiddlyText(actionElement, " [");\n createTiddlyLink(actionElement, actionTiddler.gtdProjectName, true);\n createTiddlyText(actionElement, "]");\n }\n else {\n var actionTags = _GTD.filteredActionTags(tags, parentTiddler);\n if (actionTags.length > 0) createTiddlyText(actionElement, " (" + actionTags.join(",") + ")");\n }\n */\n \n return actionElement;\n}\n\nconfig.macros.gtdAction.onClickDone = function(e)\n{\n var tiddler = store.getTiddler(this.getAttribute("actionTiddler"));\n if (tiddler) {\n _GTD.toggleTag(tiddler, "done", this.checked);\n tiddler.gtdActionDone = this.checked;\n _GTD.tiddlerHasChanged(tiddler);\n _GTD.refreshActionViews(tiddler);\n }\n return true;\n}\n\nconfig.macros.gtdAction.handler = function(place,macroName,params)\n{\n var title = params[0], tags;\n var parentTiddler = story.findContainingTiddler(place).getAttribute("tiddler");\n var tiddler = store.getTiddler(title);\n if (!tiddler) {\n // we should *never* get here now for project actions, but keep code in case project code\n // trips up, or we use this macro somewhere else\n this.createAction(title, parentTiddler, params[1]);\n }\n else\n // use actual tiddler tags, not macro param, in case context changed!\n tags = tiddler.tags;\n var action = this.createActionElement(place, title, parentTiddler, tags);\n}\n\nconfig.macros.gtdAction.setNextAction = function(project)\n{\n project.gtdNextAction = null;\n for (var i = 0; i < project.gtdActions.length; i++)\n if (!project.gtdActions[i].gtdActionDone) {\n project.gtdNextAction = project.gtdActions[i];\n return;\n }\n}\n\nconfig.macros.gtdAction.createAction = function(title, parentTiddler, tagParams, extraTags)\n{\n var tags = ["action", parentTiddler];\n if (typeof(tagParams) == "string") tags = tags.concat(tagParams.readBracketedList());\n if (typeof(extraTags) == "string") tags = tags.concat(extraTags.readBracketedList());\n var templateText = store.getTiddlerText("NewActionTemplate", config.views.wikified.defaultText.format([title]));\n return store.saveTiddler(title, title, templateText, config.options.txtUserName, new Date(), tags);\n}\n\nconfig.macros.gtdActionCompleted = {}\nconfig.macros.gtdActionCompleted.handler = function(place,macroName,params)\n{\n var title = story.findContainingTiddler(place).getAttribute("tiddler");\n var tiddler = store.getTiddler(title);\n // oddly, we barf when setting the checkbox type on an input if we use createTiddlyElement...\n var cb = document.createElement("input");\n cb.setAttribute("type", "checkbox");\n cb.setAttribute("actionTiddler", title);\n cb.onclick = this.onClickDone;\n place.appendChild(cb);\n cb.checked = tiddler.gtdActionDone;\n}\n\nconfig.macros.gtdActionCompleted.onClickDone = function(e)\n{\n var tiddler = store.getTiddler(this.getAttribute("actionTiddler"));\n if (tiddler) {\n _GTD.toggleTag(tiddler, "done", this.checked);\n tiddler.gtdActionDone = this.checked;\n _GTD.tiddlerHasChanged(tiddler);\n _GTD.refreshActionViews(tiddler);\n }\n return true;\n}\n\nconfig.macros.gtdAction.inheritedChanged = Tiddler.prototype.changed;\nTiddler.prototype.changed = function()\n{\n config.macros.gtdAction.inheritedChanged();\n \n // Note that this is called both as part of normal tiddler changes AND as a part\n // of the initial TW loading process from DIVs...\n \n if (_GTD.tiddlerHasTag(this, "project")) {\n // (re)build the in-memory ordered action list\n this.gtdActions = [];\n this.gtdNextAction = null;\n if (this.text) {\n var reActionWikitext = "^\s\s.{2}([^|\sn]+)(?:\s\s|?)(.*)";\n var reActionMacro = "<<gtdAction ((?:[^>]|(?:>(?!>)))*)>>";\n var actionRe = new RegExp("(" + reActionWikitext + ")|(" + reActionMacro + ")", "mg");\n do {\n var formatMatch = actionRe.exec(this.text);\n if (formatMatch) {\n var macroParams = (formatMatch[1] ? null : formatMatch[5].readMacroParams());\n var actionTiddlerName = (formatMatch[1] ? formatMatch[2] : macroParams[0]);\n var actionTiddler = store.getTiddler(actionTiddlerName);\n if (!actionTiddler) {\n var actionTags = (formatMatch[1] ? formatMatch[3] : macroParams[1]);\n var extraTags = (formatMatch[1] ? '' : macroParams[2]);\n actionTiddler = config.macros.gtdAction.createAction(actionTiddlerName, this.title, actionTags, extraTags);\n }\n if (actionTiddler) {\n actionTiddler.gtdProject = this;\n if (this.gtdNextAction == null && !_GTD.tiddlerHasTag(actionTiddler, "done"))\n this.gtdNextAction = actionTiddler;\n this.gtdActions.push(actionTiddler);\n // handle project renaming in action\n if (actionTiddler.gtdProjectName && actionTiddler.gtdProjectName != this.title) {\n _GTD.tiddlerSwapTag(actionTiddler, actionTiddler.gtdProjectName, this.title);\n // action view won't get updated through any other refresh mechanism, so\n story.refreshTiddler(actionTiddler.title, null, true);\n }\n actionTiddler.gtdProjectName = this.title;\n }\n }\n } while(formatMatch);\n }\n }\n \n else if (_GTD.tiddlerHasTag(this, "context")) {\n if (this.gtdContextName == undefined)\n this.gtdContextName = this.title;\n else if (this.gtdContextName != this.title) {\n // propagate renamed context to affected actions\n var results = config.macros.list.tagged.innerHandler([ this.gtdContextName, "action"], true);\n for (var t = 0; t < results.length; t++) {\n _GTD.tiddlerSwapTag(results[t], this.gtdContextName, this.title);\n // action view won't get updated through any other refresh mechanism, so\n story.refreshTiddler(results[t].title, null, true);\n }\n this.gtdContextName = this.title;\n }\n }\n \n else if (_GTD.tiddlerHasTag(this, "action")) {\n if (this.gtdActionName == undefined)\n this.gtdActionName = this.title;\n else if (this.gtdActionName != this.title && this.gtdProject) {\n // ugh...dig into related project and update the wiki code to use new action name\n var reActionWikitext = "^(\s\s.{2})(" + this.gtdActionName + ")((\s\s|.*\sn)|(\sn))";\n var reActionMacro = "(<<gtdAction [\s"\s']?)(" + this.gtdActionName + ")([\s"\s']?\s\ss+(?:[^>]|(?:>(?!>)))*>>)";\n this.gtdProject.text = this.gtdProject.text.replace(new RegExp(reActionWikitext, "mg"), "$1" + this.title + "$3");\n this.gtdProject.text = this.gtdProject.text.replace(new RegExp(reActionMacro, "mg"), "$1" + this.title + "$3");\n this.gtdActionName = this.title;\n }\n this.gtdActionDone = _GTD.tiddlerHasTag(this, "done");\n // reset the next action on the associated project\n if (this.gtdProject) config.macros.gtdAction.setNextAction(this.gtdProject);\n }\n}\n\nconfig.formatters.push(\n {\n name: "gtdAction",\n match: "^\s\s.\s\s..*",\n lookahead: "^\s\s.\s\s.([^|]*)(?:\s\s|?)(.*)",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"g");\n var lookaheadMatch = lookaheadRegExp.exec(w.matchText)\n if (lookaheadMatch) {\n var params = [ lookaheadMatch[1] ];\n if (lookaheadMatch[2].length > 0) params.push(lookaheadMatch[2]);\n config.macros.gtdAction.handler(w.output, "gtdAction", params);\n }\n }\n }\n);\n\nconfig.commands.newAction = { text: "action", tooltip: "Create a new action for this context", hideReadOnly: true };\nconfig.commands.newAction.handler = function(event, src, context)\n{\n var d = new Date();\n var newActionTitle = d.formatString("New Action hh:0mm:0ss");\n if (!store.tiddlerExists(newActionTitle)) {\n var tiddler = store.createTiddler(newActionTitle);\n var templateText = store.getTiddlerText("NewActionTemplate", config.views.wikified.defaultText.format([newActionTitle]));\n tiddler.assign(newActionTitle, templateText, config.options.txtUserName, new Date(), [ "action", context ]);\n \n story.displayTiddler(null, newActionTitle, DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(newActionTitle, "title");\n }\n return false;\n}\n\nconfig.commands.newProjectAction = { text: "action", tooltip: "Create a new action for this project", hideReadOnly: true };\nconfig.commands.newProjectAction.handler = function(event, src, project)\n{\n var d = new Date();\n var newActionTitle = d.formatString("New Action hh:0mm:0ss");\n if (!store.tiddlerExists(newActionTitle)) {\n var defaultContext = config.options.txtGTDUnfiledContext;\n _GTD.appendProjectAction(store.getTiddler(project), newActionTitle, defaultContext);\n \n var tiddler = store.createTiddler(newActionTitle);\n var templateText = store.getTiddlerText("NewActionTemplate", config.views.wikified.defaultText.format([newActionTitle]));\n tiddler.assign(newActionTitle, templateText, config.options.txtUserName, new Date(), [ "action", project, defaultContext ]);\n \n story.displayTiddler(null, newActionTitle, DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(newActionTitle, "title");\n }\n return false;\n}\n\nconfig.macros.gtdActionList = {}\nconfig.macros.gtdActionList.handler = function(place,macroName,params)\n{\n var theList = createTiddlyElement(place, "ul", null, "gtdActionList");\n var parentTiddler = story.findContainingTiddler(place).getAttribute("tiddler");\n var allActions = (params[1] == "all");\n var aging = parseInt(config.options.txtGTDActionAging, 10);\n aging = isNaN(aging) ? 0 : aging.clamp(0, Number.MAX_VALUE);\n \n if (params[0] == "*") { // actions for all projects\n var projects = store.getTaggedTiddlers("project");\n for (var i = 0; i < projects.length; i++) {\n var project = projects[i];\n if (!allActions) {\n var skipEmptyProject = true;\n if (project.gtdActions != undefined && project.gtdActions.length > 0)\n for (var k = 0; skipEmptyProject && k < project.gtdActions.length; k++)\n skipEmptyProject = project.gtdActions[k].gtdActionDone;\n if (skipEmptyProject) continue;\n }\n var theListItem = createTiddlyElement(theList, "li", null, "gtdActionListProject");\n createTiddlyLink(theListItem, project.title, true);\n if (project.gtdActions != undefined && project.gtdActions.length > 0) {\n var subList = createTiddlyElement(theList, "ul", null, "gtdActionList");\n for (var j = 0; j < project.gtdActions.length; j++) {\n var action = project.gtdActions[j];\n if (!allActions && aging > 0 && action.gtdActionDone && _GTD.tiddlerAgeInDays(action) > aging) continue;\n var subListItem = createTiddlyElement(subList, "li");\n var el = config.macros.gtdAction.createActionElement(subListItem, action, project.title, action.tags);\n }\n }\n }\n }\n else if (params[0] == "@") { // actions for all contexts\n var contexts = store.getTaggedTiddlers("context");\n for (var i = 0; i < contexts.length; i++) {\n var context = contexts[i];\n var actions = config.macros.list.tagged.innerHandler([context.title, "action"], true);\n if (actions.length > 0) {\n var firstAction = true, theListItem, subList;\n for (var j = 0; j < actions.length; j++) {\n var currentAction = actions[j];\n // if we are not displaying all actions, filter completed actions and non-next project actions\n if (!allActions && (currentAction.gtdActionDone || (currentAction.gtdProject && !_GTD.isNextAction(currentAction)))) continue;\n if (firstAction) {\n theListItem = createTiddlyElement(theList, "li", null, "gtdActionListContext");\n createTiddlyLink(theListItem, context.title, true);\n subList = createTiddlyElement(theList, "ul", null, "gtdActionList");\n firstAction = false;\n }\n var subListItem = createTiddlyElement(subList, "li");\n var el = config.macros.gtdAction.createActionElement(subListItem, currentAction, context.title, currentAction.tags);\n }\n }\n }\n }\n else { // actions tagged by current tiddler name\n // chain to our "tagged" list macro to get the tiddlers first\n var tags = (params.length == 0 ? [ parentTiddler ] : params[0].readBracketedList());\n tags.push("action");\n var results = config.macros.list.tagged.innerHandler(tags, true);\n // ??? do we want this list sorted by action name alone ???\n results.sort(function (a,b) {if(a.title == b.title) return(0); else return (a.title < b.title) ? -1 : +1; });\n for (var t = 0; t < results.length; t++) {\n var action = results[t];\n if (!allActions && aging > 0 && action.gtdActionDone && _GTD.tiddlerAgeInDays(action) > aging) continue;\n var theListItem = createTiddlyElement(theList, "li");\n var el = config.macros.gtdAction.createActionElement(theListItem, action, parentTiddler, action.tags);\n }\n }\n}\n\nconfig.commands.changeContext = { text: "context", tooltip: "Change context of this action", hideReadOnly: true, popupNone: "There are no contexts" };\nconfig.commands.changeContext.handler = function(event,src,title)\n{\n var popup = Popup.create(src);\n if (popup) {\n var contexts = store.getTaggedTiddlers("context");\n var tiddler = store.getTiddler(title);\n var c = false;\n var currentContext = config.options.txtGTDUnfiledContext;\n for (var i = 0; i < contexts.length; i++)\n if (_GTD.tiddlerHasTag(tiddler, contexts[i].title)) {\n currentContext = contexts[i].title;\n break;\n }\n \n for (i = 0; i < contexts.length; i++)\n if (contexts[i].title != currentContext) {\n var button = createTiddlyButton(createTiddlyElement(popup, "li"), contexts[i].title, '', this.onClickContext);\n button.setAttribute("actionTiddler", title);\n button.setAttribute("oldContext", currentContext);\n button.setAttribute("newContext", contexts[i].title);\n c = true;\n }\n if (!c)\n createTiddlyText(createTiddlyElement(popup, "li", null, "disabled"), this.popupNone);\n }\n \n Popup.show(popup, false);\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n // do *not* cause a browser navigation\n return false;\n}\n\nconfig.commands.changeContext.onClickContext = function(e)\n{\n var tiddler = store.getTiddler(this.getAttribute("actionTiddler"));\n if (tiddler) {\n var oldContext = this.getAttribute("oldContext");\n var newContext = this.getAttribute("newContext");\n if (_GTD.tiddlerSwapTag(tiddler, oldContext, newContext)) {\n _GTD.tiddlerHasChanged(tiddler);\n _GTD.refreshActionViews(tiddler);\n // be sure to refresh old context as well...\n story.refreshTiddler(oldContext, null, true);\n }\n }\n // do *not* cause a browser navigation\n return false;\n}\n\nconfig.commands.deleteAction = { text: "delete", tooltip: "Delete this action", hideReadOnly: true, warning: "Are you sure you want to delete '%0'?", altwarning: "Are you sure you want to delete '%0'? The action will also be removed from project '%1'." };\nconfig.commands.deleteAction.handler = function(event, src, title)\n{\n var tiddler = store.getTiddler(title);\n var ok = (tiddler.gtdProject ? confirm(this.altwarning.format([title, tiddler.gtdProject.title])) : confirm(this.warning.format([title])));\n if (ok) {\n if (tiddler.gtdProject) _GTD.removeProjectAction(tiddler.gtdProject, title);\n store.removeTiddler(title);\n story.closeTiddler(title,true,event.shiftKey || event.altKey);\n if(config.options.chkAutoSave)\n saveChanges();\n }\n \n return false;\n}\n\nconfig.commands.deleteContext = { text: "delete", tooltip: "Delete this context", hideReadOnly: true, warning: "Are you sure you want to delete '%0'? All associated actions will be tagged as 'unfiled'." };\nconfig.commands.deleteContext.handler = function(event, src, title)\n{\n if (confirm(this.warning.format([title]))) {\n store.suspendNotifications();\n this.unlinkActions(title);\n store.resumeNotifications();\n store.removeTiddler(title);\n story.closeTiddler(title,true,event.shiftKey || event.altKey);\n if(config.options.chkAutoSave)\n saveChanges();\n }\n \n return false;\n}\n\nconfig.commands.deleteContext.unlinkActions = function(contextTitle)\n{\n var tiddlers = config.macros.list.tagged.innerHandler([contextTitle, "action"], true);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n _GTD.tiddlerSwapTag(tiddler, contextTitle, config.options.txtGTDUnfiledContext);\n _GTD.tiddlerHasChanged(tiddler, false);\n // context removal will do view notification...\n }\n}\n\nconfig.commands.deleteProject = { text: "delete", tooltip: "Delete this project", hideReadOnly: true, warning: "Are you sure you want to delete '%0'? All associated actions will no longer be bound to this (or any) project." };\nconfig.commands.deleteProject.handler = function(event, src, title)\n{\n if (confirm(this.warning.format([title]))) {\n store.suspendNotifications();\n this.unlinkActions(title);\n store.resumeNotifications();\n store.removeTiddler(title);\n story.closeTiddler(title,true,event.shiftKey || event.altKey);\n if(config.options.chkAutoSave)\n saveChanges();\n }\n \n return false;\n}\n\nconfig.commands.deleteProject.unlinkActions = function(projectTitle)\n{\n var tiddlers = config.macros.list.tagged.innerHandler([projectTitle, "action"], true);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n tiddler.gtdProject = null;\n tiddler.tags.splice(tiddler.tags.find(projectTitle), 1);\n _GTD.tiddlerHasChanged(tiddler, false);\n // project removal will do view notification...\n }\n}\n\nconfig.commands.deleteProjectAll = { text: "delete all", tooltip: "Delete this project and its actions", hideReadOnly: true, warning: "Are you sure you want to delete '%0' and all its associated actions?" };\nconfig.commands.deleteProjectAll.handler = function(event, src, title)\n{\n if (confirm(this.warning.format([title]))) {\n store.suspendNotifications();\n this.deleteActions(title);\n store.resumeNotifications();\n store.removeTiddler(title);\n story.closeTiddler(title,true,event.shiftKey || event.altKey);\n if(config.options.chkAutoSave)\n saveChanges();\n }\n \n return false;\n}\n\nconfig.commands.deleteProjectAll.deleteActions = function(projectTitle)\n{\n var tiddlers = config.macros.list.tagged.innerHandler([projectTitle, "action"], true);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i].title;\n store.removeTiddler(tiddler);\n story.closeTiddler(tiddler, true, false);\n // project removal will do view notification...\n }\n}\n\nconfig.commands.projectify = { text: "projectify", tooltip: "Convert this action to a project", hideReadOnly: true, warning: "Are you sure you want to convert '%0' to a project?" };\nconfig.commands.projectify.handler = function(event, src, title)\n{\n if (confirm(this.warning.format([title]))) {\n var tiddler = store.getTiddler(title);\n if (tiddler.gtdProject) _GTD.removeProjectAction(tiddler.gtdProject, title);\n tiddler.tags = [ "project" ];\n _GTD.tiddlerHasChanged(tiddler, true);\n // we need a broad notification here, not just refreshActionViews\n store.notify(title, true);\n }\n \n return false;\n}\n\nconfig.macros.touchRevision = {}\nconfig.macros.touchRevision.handler = function ()\n{\n var d = version.extensions.GTDPlugins.date;\n var tiddlers = config.macros.list.tagged.innerHandler(["systemConfig", "systemTiddler", "template", "gtd"], false);\n for (var i = 0; i < tiddlers.length; i++) {\n tiddlers[i].created = d;\n tiddlers[i].modified = d;\n }\n}\n\nStory.prototype.chooseTemplateForTiddler = function(title,template)\n{\n if (!template)\n template = DEFAULT_VIEW_TEMPLATE;\n\n // before reverting to default behaviour, check to see if a tag-based template exists\n if (template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE) {\n if (this.tagBasedTemplateCache == undefined) this.tagBasedTemplateCache = new Array();\n var templateRoot = (template == DEFAULT_VIEW_TEMPLATE ? "ViewTemplate" : "EditTemplate");\n var tiddler = store.getTiddler(title);\n if (tiddler) {\n for (var i = 0; i < tiddler.tags.length; i++) {\n var tag = tiddler.tags[i];\n var tagTemplate = tag + templateRoot;\n var tagCacheId = tag + template;\n // first check our cache to see if we have seen this template before\n if (this.tagBasedTemplateCache[tagCacheId] != undefined) {\n // make sure template still exists\n if (store.tiddlerExists(this.tagBasedTemplateCache[tagCacheId])) {\n template = this.tagBasedTemplateCache[tagCacheId];\n break;\n }\n else\n delete this.tagBasedTemplateCache[tagCacheId];\n }\n // go to the store to see if template exists\n if (store.tiddlerExists(tagTemplate)) {\n template = tagTemplate;\n this.tagBasedTemplateCache[tagCacheId] = tagTemplate;\n break;\n }\n }\n }\n }\n \n if (template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE)\n template = config.tiddlerTemplates[template];\n return template;\n}\n\nconfig.macros.importUpdates = { \n importMode: "updates",\n buttonTitle: "Update", \n buttonHelp: "Click here to update the application",\n preUpdateMessage: "Once the download is finished, you will need to reload your document to complete the update. In order to allow you to review the update tiddlers, this will not be done automatically. \sn\snClick \s"OK\s" start the update."\n}\nconfig.macros.importUpdates.handler = function(place, macroName, params)\n{\n var mode = params[1] ? params[1] : this.importMode;\n var title = params[2] ? params[2] : this.buttonTitle;\n var prompt = params[3] ? params[3] : this.buttonHelp;\n var button = createTiddlyButton(place, title, prompt, this.onClickUpdate);\n button.setAttribute("updateSource", params[0]);\n button.setAttribute("importMode", mode);\n if (params.length > 4) button.setAttribute("importExtras", params.slice(4).join(" "));\n}\n\nconfig.macros.importUpdates.onClickUpdate = function(e)\n{\n if (!confirm(config.macros.importUpdates.preUpdateMessage))\n return;\n var importParams = [ this.getAttribute("importMode"), this.getAttribute("updateSource") ];\n var importExtras = this.getAttribute("importExtras");\n if (importExtras) importParams = importParams.concat(importExtras.split(" "));\n importParams.push("force");\n // force a saveChanges with backup before the update\n _GTD.saveWithForcedBackup();\n // chain to the importTiddlers macro\n config.macros.importTiddlers.handler(this, "importTiddlers", importParams);\n // ensure that relevant release notes are displayed on first launch\n config.options.chkGTDReleaseNotes = true;\n saveOptionCookie("chkGTDReleaseNotes");\n // do *not* cause a browser navigation\n return false;\n}\n\nconfig.macros.gtdArchive = {}\nconfig.macros.gtdArchive.handler = function(place, macroName, params)\n{\n var archiveAction = params.length > 0 ? params[0] : "archive"\n var btn = createTiddlyButton(place, archiveAction, "", this.onClick);\n btn.setAttribute("archiveAction", archiveAction);\n}\n\nconfig.macros.gtdArchive.onClick = function(e)\n{\n var warning = "Are you sure you want to %0 all %1 projects and actions?";\n var status = "There were %0 project(s) and %1 action(s) %2d.";\n var archiveAction = this.getAttribute("archiveAction");\n \n var projectCount = 0, actionCount = 0;\n \n if (archiveAction == "archive") {\n if (confirm(warning.format([archiveAction, "completed"]))) {\n clearMessage();\n var projects = store.getTaggedTiddlers("project");\n for (var i = 0; i < projects.length; i++) {\n var project = projects[i];\n if (project.gtdActions == undefined || project.gtdActions.length == 0) continue;\n var projectComplete = true;\n for (var j = 0; projectComplete && j < project.gtdActions.length; j++)\n projectComplete = project.gtdActions[j].gtdActionDone;\n if (!projectComplete) continue;\n // if we get here, all project actions are done, so archive project\n story.closeTiddler(project.title, false, false);\n _GTD.tiddlerSwapTag(project, "project", "project-archive");\n _GTD.tiddlerHasChanged(project, false);\n projectCount++;\n for (j = 0; j < project.gtdActions.length; j++) {\n story.closeTiddler(project.gtdActions[j].title, false, false);\n _GTD.tiddlerSwapTag(project.gtdActions[j], "action", "action-archive");\n _GTD.tiddlerHasChanged(project.gtdActions[j], false);\n actionCount++;\n }\n }\n var actions = store.getTaggedTiddlers("action");\n for (i = 0; i < actions.length; i++) {\n var action = actions[i];\n if (action.gtdActionDone && !action.gtdProject) {\n story.closeTiddler(action.title, false, false);\n _GTD.tiddlerSwapTag(action, "action", "action-archive");\n _GTD.tiddlerHasChanged(action, false);\n actionCount++;\n }\n }\n displayMessage(status.format([projectCount, actionCount, archiveAction]));\n var saveClearMessage = clearMessage;\n clearMessage = function() {};\n if (config.options.chkAutoSave) saveChanges();\n clearMessage = saveClearMessage;\n store.notify(null, true);\n }\n }\n \n else if (archiveAction == "unarchive") {\n if (confirm(warning.format([archiveAction, "archived"]))) {\n clearMessage();\n var projects = store.getTaggedTiddlers("project-archive");\n for (var i = 0; i < projects.length; i++) {\n var project = projects[i];\n story.closeTiddler(project.title, false, false);\n _GTD.tiddlerSwapTag(project, "project-archive", "project");\n _GTD.tiddlerHasChanged(project, false);\n projectCount++;\n }\n var actions = store.getTaggedTiddlers("action-archive");\n for (i = 0; i < actions.length; i++) {\n var action = actions[i];\n story.closeTiddler(action.title, false, false);\n _GTD.tiddlerSwapTag(action, "action-archive", "action");\n _GTD.tiddlerHasChanged(action, false);\n actionCount++;\n }\n displayMessage(status.format([projectCount, actionCount, archiveAction]));\n var saveClearMessage = clearMessage;\n clearMessage = function() {};\n if (config.options.chkAutoSave) saveChanges();\n clearMessage = saveClearMessage;\n store.notify(null, true);\n }\n }\n \n else if (archiveAction == "purge") {\n if (confirm(warning.format([archiveAction, "archived"]))) {\n clearMessage();\n _GTD.saveWithForcedBackup();\n var projects = store.getTaggedTiddlers("project-archive");\n for (var i = 0; i < projects.length; i++) {\n var project = projects[i];\n story.closeTiddler(project.title, false, false);\n store.removeTiddler(project.title);\n projectCount++;\n }\n var actions = store.getTaggedTiddlers("action-archive");\n for (i = 0; i < actions.length; i++) {\n var action = actions[i];\n story.closeTiddler(action.title, false, false);\n store.removeTiddler(action.title);\n actionCount++;\n }\n displayMessage(status.format([projectCount, actionCount, archiveAction]));\n var saveClearMessage = clearMessage;\n clearMessage = function() {};\n if (config.options.chkAutoSave) saveChanges();\n clearMessage = saveClearMessage;\n store.notify(null, true);\n }\n }\n else\n alert("That archiving action is not supported");\n}\n\n_GTD.initialize();\n\n//}}}\n
I was amused to hear someone the other day say "I only make enough money to pay for the gas it takes to get to work. I am going to have to get a second job to pay for gas". Gas prices have risen about $0.75 a gallon since last Memorial Day. \n\nLet's consider a moron in his 12mpg Hummer who is burning 5 gallons a day to get to and from work (that's 30 miles each way, foot on the floor the entire time). That means he is spending $3.75 more a day then he was last year. In my opinion if you only have $3.75 worth of spending cash a day you need to quit eating every meal at a resturant, smoking cigeretes, buying beer, and visiting Starbucks every morning. Either that or start working a corner. And you can't have this one as it is mine.\n\nOf course the Hummer driving idiot is most likely to get a job delivering pizzas.
<<formTiddler ContactsFormTemplate>>\nService: Massage\n\n\n<data>{"firstname":"Geoffrey","lastname":"Pruitt","cellphone":"314-650-2689","website":"http://thegeoffrey.livejournal.com","country":"USA"}</data>
http://www.rasterwerks.com/game/phosphor/beta1.asp\n\nhttp://www.unclebear.com/silveragents/
Give him around $100 for gas and such.\n<<reminder year:2006 month:4 day:29 title:"Give Carl Cash" >>\n<<reminder year:2006 month:5 day:15 title:"Give Carl Cash" >>
Family; a word with easily defined definition...NOT!\nWhen I say "Yeah, Joey is a screw-up, but he's family. What can you do about it?" I could mean:\n*He is a relative of mine.\n*He is in the Mafia.\n*He is a homosexual.\n*He is a person I consider to be as close to me as my own brother.\nAll of these could apply...and might. \n\nAlso see [[Pronouns]]
http://www.quirksmode.org/js/rotate.html\n\nMy idea is to have an image in the header that will change every so often.\nMaybe even set it up so that different CSS style will have differnt images.
The following was posted in the [[TiddlyWiki Google Group|http://groups.google.com/group/TiddlyWiki/browse_frm/thread/ef4e18b98175a59c/3129985c2afd0617?hl=en#3129985c2afd0617]] by : Daniel Baird \n----\n''tiddler:'' is a piece of micro-content in a TiddlyWiki. Micro-content can be thought of as stuff that's smaller that a page of content. The precise meanings of "micro-content", "page" and "smaller" continue to be debated in this forum :) \n\nWhatever micro-content is, it turns out that most people actually deal with it a lot in their day-to-day lives. That's part of the reason why TW is so great -- tiddlers fit nicely with a lot of real-world stuff. \n\n''shadow tiddler:'' the default content that is provided for certain tiddlers used by TW. Shadow tiddlers keep you from completely tanking your TW by accidentally deleting something important. You can see a list of shadow tiddlers in the Shadowed tab under the More tab in the right hand column. When you create a tiddler with a given title, you override any shadow tiddler with that title. \n\n\n''tags:'' categorise a tiddler by giving it some tags. Tags can be tiddlers themselves, with their own tags, so you can have heirarchies of tiddlers. This is a surprisingly useful and powerful technique called "tagglytagging"; see http://simonbaird.com/mptw/#TagglyTagging for an introduction from the spiritual leader of the tagglytagging movement. \n\n''plugin:'' is a general term for a collection of Javascript that you have in a tiddler. It enhances or changes the behaviour or appearance of the TiddlyWiki. One way it can do that is by making one or more macros available to you. \n\n''wikify:'' what TW does to display a tiddler. It takes what you've typed into the tiddler edit box and applys bold formatting, makes "!This" into a heading, etc. The thing that does the wikifying is the wikifier. \n\n''macro:'' is a thing you can type into a tiddler body like this: \n{{{<<minesweeper>>}}} ..that then usually gets handled in some special way when the tiddler is wikified. My minesweeper plugin installs a {{{<<minesweeper>>}}} macro that displays a minesweeper game board, but other macros do more useful things like add reminders to a calendar, etc. There are a bunch of macros built in -- eg {{{<<today>>}}} and {{{<<slider>>}}}. \n----\n[[A useful tutorial|http://www.blogjones.com/TiddlyWikiTutorial.html#EasyToEdit]]\n----\n<<tiddlerList tags:"Helper">>
<<tiddlerList filter:"tiddler.tags.contains('Helper')" itemTemplate:"|%link|%modified|\sn" header:"|!Name|!Modified|" footer:"|%count|c" order:"-modified">>\n\n<<tiddlerList filter:"tiddler.tags.contains(currentTiddler.title)" itemTemplate:"|%link|%modified|\sn" header:"|!Name|!Modified|" footer:"|%count|c" order:"-modified">>
!!!!Simple reminders that fire on the same month/day of every year.\n*<<reminder month:1 day:1 title:"New Year's Day" >>\n*<<reminder month:2 day:2 title:"Groundhog Day" >>\n*<<reminder month:12 day:24 title:"Christmas Eve" >>\n*<<reminder month:12 day:25 title:"Christmas Day" >>\n\n!!!!Offset reminders\nThese are all holidays that are specified as the Nth DAYOFWEEK in Month.\n*President's Day is the third Monday of February \n**<<reminder month:2 day:15 offsetdayofweek:1 title:"President's Day">>\n*Mother's Day is the second Sunday of May\n**<<reminder month:5 day:8 offsetdayofweek:0 title:"Mother's Day">>\n\n*Memorial Day is the last Monday of May (note that offsetdayofweek is a negative number, meaning match backwards)\n**<<reminder month:5 day:31 offsetdayofweek:-1 title:"Memorial Day">>\n\n!!!Ignore these\nThese are just here to fill in the common US holidays\n*<<reminder month:2 day:14 title:"Valentine's Day" >>\n*<<reminder month:3 day:1 title:"April Fool's Day" >>\n*<<reminder month:4 day:15 title:"Tax day">>\n*<<reminder month:3 day:22 title:"Earth Day">>\n*<<reminder month:6 day:14 title:"Flag Day" >>\n*Father's Day is the third Sunday of June \n**<<reminder month:6 day:15 offsetdayofweek:0 title:"Father's Day">>\n*<<reminder month:7 day:4 title:"Independence Day" >>\n*Labor Day is the first Monday of September\n**<<reminder month:9 day:1 offsetdayofweek:1 title:"Labor Day">>\n*Columbus Day is the second Monday of October\n**<<reminder month:10 day:8 offsetdayofweek:1 title:"Columbus Day">>\n*<<reminder month:10 day:31 title:"Halloween" >>\n*<<reminder month:11 day:11 title:"Veteran's Day" >>\n*Thanksgiving(US) is the third Thursday of November\n**<<reminder month:11 day:22 offsetdayofweek:4 title:"Thanksgiving (US)">>\n*<<reminder month:12 day:21 title:"Winter Soltice" >>\n
Went to training for a new company wide database. It is a big improvement over what it is replacing but I have to wonder at some of the things they came up with. \n\nThe best example is in the parent frame information they want to draw your attention to looks like this @@color(blue):Important info@@ and general links look like @@color(blue):general link@@. \n\nIn the inner frame they have it set up so that @@color(blue):this@@ means a link that has no information behind it while @@color(red):*this@@ is a link with good information behind it.\n\nOK, quickly tell me which are good links, which are just text and which are links with no data behind them:\n@@color(blue):link good@@ \n@@color(red):*link good@@\n@@color(blue):information@@\n@@color(blue):link bad@@\n\nIs it just me or is that a little confusing?
I realized that there are needs I have that are not being met in my current life. Intellectual and social stimulation. I spend most of my time surronded by the 8 people (5 who live with me and 3 at work).\n\nI need new stories, people who can talk about something other then a video game, and people I can flirt with.
<html><img src="http://www.userfriendly.org/cartoons/archives/06jul/uf009316.gif" width="500" length="368"></html>\n\nToo friken true!\n\nFor more of this humor see: http://www.userfriendly.org/\n
/***\n''Import Tiddlers Plugin for TiddlyWiki version 1.2.x and 2.0''\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!!!!!Inline interface (live)\n<<<\n<<importTiddlers inline>>\n<<<\n!!!!!Macro Syntax\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 filter source quiet ask force>>}}}\nnon-interactive 'automatic' import.\n''filter'' determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\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>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n''source'' is the location of the imported document. It can be either a local document or an URL:\n>filename is any local path/file, in whatever format your system requires\n>URL is any remote web location that starts with "http://" or "https://"\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''"ask"'' (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''"force"'' (optional)\n>ignores the importReplace and importPublic special tags (see below). Allows automatic importing and overwriting of tiddlers even when they have not been tagged accordingly. This is intended for use with TW files for which you have complete control of the content and can therefore be certain that importing all tiddlers into your document is 'safe'.\n\n''Special tag values: importReplace and importPublic''\n\nBy adding these special tags to an existing tiddler, you can precisely control whether or not to allow updates to that tiddler as well as decide which tiddlers in your document can be automatically imported by others.\n*''For maximum safety, the default action is to prevent existing tiddlers from being unintentionally overwritten by incoming tiddlers.'' To allow an existing tiddler to be overwritten by an imported tiddler, you must tag the existing tiddler with ''<<tag importReplace>>''\n*''For maximum privacy, the default action for //outgoing// tiddlers is to NOT automatically share your tiddlers with others.'' To allow a tiddler in your document to be shared via auto-import actions by others, you must tag it with ''<<tag importPublic>>''\n//Note: these tags are only applied when using the auto-import processing. When using the interactive control panel, all tiddlers in the imported document are available in the listbox, regardless of their tag values.//\n<<<\n!!!!!Interactive Usage\n<<<\nWhen used interactively, a control panel is displayed consisting of an "import source document" filename input (text field plus a ''[Browse...]'' button), a listbox of available tiddlers, a "differences only" checkbox, an "add tags" input field and four push buttons: ''[open]'', ''[select all]'', ''[import]'' and ''[close]''.\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!!!!!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.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\n// // Version\n//{{{\nversion.extensions.importTiddlers = {major: 2, minor: 9, revision: 1, date: new Date(2006,3,30)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n// // IE needs explicit global scoping for functions/vars called from browser events\n//{{{\nwindow.onClickImportButton=onClickImportButton;\nwindow.loadImportFile=loadImportFile;\nwindow.refreshImportList=refreshImportList;\n//}}}\n\n// // default cookie/option values\n//{{{\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n//}}}\n\n\n// // ''MACRO DEFINITION''\n\n//{{{\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n countMsg: "%0 tiddlers selected for import",\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 // LINK WITH FLOATING PANEL\n if (!params[0]) {\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n return;\n }\n // INLINE TIDDLER CONTENT\n if (params[0]=="inline") {\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n return;\n }\n // NON-INTERACTIVE BATCH MODE\n switch (params[0].substr(0,7)) {\n case 'all':\n case 'new':\n case 'changes':\n case 'updates':\n case 'tiddler':\n var filter=params.shift();\n break;\n default:\n var filter="updates";\n break;\n } \n if (!params[0]||!params[0].length) return; // filename is required\n config.macros.importTiddlers.src=params.shift();\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="ask"); if (ask) params.shift();\n var force=(params[0]=="force"); if (force) params.shift();\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n // load storeArea from a hidden IFRAME, then apply import rules and add/replace tiddlers\n loadImportFile(config.macros.importTiddlers.src,filter,quiet,ask,force,autoImportTiddlers);\n}\n//}}}\n\n// // ''READ TIDDLERS FROM ANOTHER DOCUMENT''\n\n//{{{\nfunction loadImportFile(src,filter,quiet,ask,force,callback) {\n if (!quiet) clearMessage();\n // LOCAL FILE\n if ((src.substr(0,7)!="http://")&&(src.substr(0,8)!="https://")) {\n if (!quiet) displayMessage("Opening local document: "+ src);\n var txt=loadFile(src);\n if(!txt) { if (!quiet) displayMessage("Could not open local document: "+src); }\n else {\n var start=txt.indexOf('<div id="storeArea">');\n var end=txt.indexOf('</body>');\n var sa="<html><body>"+txt.substring(start,end)+"</body></html>";\n if (!quiet) displayMessage(txt.length+" bytes in document. ("+sa.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(convertUTF8ToUnicode(sa));\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask,force);\n }\n return;\n }\n // REMOTE FILE\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 var start=x.responseText.indexOf('<div id="storeArea">');\n var end=x.responseText.indexOf('</body>',start);\n var sa="<html><body>"+x.responseText.substring(start,end)+"</body></html>";\n if (!quiet) displayMessage(x.responseText.length+" bytes in document. ("+sa.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(sa);\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask,force);\n }\n else\n if (!quiet) displayMessage("Could not open remote document:"+ src+" (error="+x.status+")");\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 if (config.macros.importTiddlers.useProxy) src=config.macros.importTiddlers.proxy+src;\n if (!quiet) displayMessage("Opening remote document: "+ src);\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("Could not open remote document: "+src);\n displayMessage(e.description?e.description:e.toString());\n }\n }\n}\n\nfunction readImportedTiddlers(txt)\n{\n var importedTiddlers = [];\n // create frame\n var f=document.getElementById("importFrame");\n if (f) document.body.removeChild(f);\n f=document.createElement("iframe");\n f.id="importFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n // get document\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 // load source into document\n d.open(); d.writeln(txt); d.close();\n // read tiddler DIVs from storeArea DOM element \n var importStore = [];\n var importStoreArea = d.getElementById("storeArea");\n if (!importStoreArea || !(importStore=importStoreArea.childNodes) || (importStore.length==0)) { return null; }\n importStoreArea.normalize();\n for(var t = 0; t < importStore.length; t++) {\n var e = importStore[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && (e.id.substr(0,5) == "store"))\n title = e.id.substr(5);\n if(title && title != "") {\n var theImported = new Tiddler();\n theImported.loadFromDiv(e,title);\n importedTiddlers.push(theImported);\n }\n }\n return importedTiddlers;\n}\n//}}}\n\n// // ''NON-INTERACTIVE IMPORT''\n\n// // import all/new/changed tiddlers into store, replacing or adding tiddlers as needed\n//{{{\nfunction autoImportTiddlers(src,filter,quiet,ask,force)\n{\n var count=0;\n if (config.macros.importTiddlers.inbound) for (var t=0;t<config.macros.importTiddlers.inbound.length;t++) {\n var theImported = config.macros.importTiddlers.inbound[t];\n var theExisting = store.getTiddler(theImported.title);\n\n // only import tiddlers if tagged with "importPublic"\n if (!force && theImported.tags && theImported.tags.find("importPublic")==null)\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // never import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // check existing tiddler for importReplace, or systemConfig tags\n config.macros.importTiddlers.inbound[t].status="added"; // default - add any tiddlers not filtered out\n if (store.tiddlerExists(theImported.title)) {\n config.macros.importTiddlers.inbound[t].status="replaced";\n if (!force && (!theExisting.tags||(theExisting.tags.find("importReplace")==null)))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists (use importReplace to allow changes)"; continue; }\n if ((theExisting.tags.find("systemConfig")!=null)||(theImported.tags.find("systemConfig")!=null))\n config.macros.importTiddlers.inbound[t].status+=" - WARNING: an active systemConfig plugin has been added or updated";\n }\n\n // apply the all/new/changes/updates filter \n if (filter!="all") {\n if ((filter=="new") && store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists"; continue; }\n if ((filter=="changes") && !store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - new tiddler"; continue; }\n if ((filter.substr(0,8)=="tiddler:") && theImported.title!=filter.substr(8))\n { config.macros.importTiddlers.inbound[t].status=""; continue; }\n if (store.tiddlerExists(theImported.title) && ((theExisting.modified.getTime()-theImported.modified.getTime())>=0))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler is unchanged"; continue; }\n }\n\n // get confirmation if required\n if (ask && !confirm("Import "+(theExisting?"updated":"new")+" tiddler '"+theImported.title+"'\snfrom "+src))\n { config.macros.importTiddlers.inbound[t].status="skipped - cancelled by user"; continue; }\n\n // DO THE IMPORT!!\n store.addTiddler(theImported); count++;\n }\n importReport(quiet); // generate a report (as needed) and display it if not 'quiet'\n if (count) store.setDirty(true); \n // always show final message when tiddlers were actually imported\n if (!quiet||count) displayMessage("Imported "+count+" tiddler"+(count!=1?"s":"")+" from "+src);\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n\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 Ask panel will still be open... close it now.\n var askpanel=document.getElementById('importAskPanel'); if (askpanel) askpanel.style.display='none'; \n // get the alphasorted list of 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 // gather the statistics\n var count=tiddlers.length;\n var added=0; var replaced=0; var renamed=0; var skipped=0; var merged=0;\n for (var t=0; t<count; t++)\n if (tiddlers[t].status)\n {\n if (tiddlers[t].status=='added') added++;\n if (tiddlers[t].status.substr(0,7)=='skipped') skipped++;\n if (tiddlers[t].status.substr(0,6)=='rename') renamed++;\n if (tiddlers[t].status.substr(0,7)=='replace') replaced++;\n if (tiddlers[t].status.substr(0,6)=='merged') merged++;\n }\n var omitted=count-(added+replaced+renamed+skipped+merged);\n // DEBUG alert('stats done: '+count+' total, '+added+' added, '+skipped+' skipped, '+renamed+' renamed, '+replaced+' replaced, '+merged+' merged');\n // skip the report if nothing was imported\n if (added+replaced+renamed+merged==0) return;\n // skip the report if not desired by user\n if (!config.options.chkImportReport) {\n // reset status flags\n for (var t=0; t<count; t++) config.macros.importTiddlers.inbound[t].status="";\n // refresh display since tiddlers have been imported\n store.notifyAll();\n // quick message area summary report\n var msg=(added+replaced+renamed+merged)+' of '+count+' tiddler'+((count!=1)?'s':"");\n msg+=' imported from '+config.macros.importTiddlers.src.replace(/\s\s/g,'/')\n displayMessage(msg);\n return;\n }\n // create the report tiddler (if not already present)\n var tiddler = store.getTiddler('ImportedTiddlers');\n if (!tiddler) // create new report tiddler if it doesn't exist\n {\n tiddler = new Tiddler();\n tiddler.title = 'ImportedTiddlers';\n tiddler.text = "";\n }\n // format the report header\n var now = new Date();\n var newText = "";\n newText += "On "+now.toLocaleString()+", "+config.options.txtUserName+" imported tiddlers from\sn";\n newText += "[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n newText += "<"+"<"+"<\sn";\n newText += "Out of "+count+" tiddler"+((count!=1)?"s ":" ")+" in {{{"+config.macros.importTiddlers.src.replace(/\s\s/g,'/')+"}}}:\sn";\n if (added+renamed>0)\n newText += (added+renamed)+" new tiddler"+(((added+renamed)!=1)?"s were":" was")+" added to your document.\sn";\n if (merged>0)\n newText += merged+" tiddler"+((merged!=1)?"s were":" was")+" merged with "+((merged!=1)?"":"an ")+"existing tiddler"+((merged!=1)?"s":"")+".\sn"; \n if (replaced>0)\n newText += replaced+" existing tiddler"+((replaced!=1)?"s were":" was")+" replaced.\sn"; \n if (skipped>0)\n newText += skipped+" tiddler"+((skipped!=1)?"s were":" was")+" skipped after asking.\sn"; \n if (omitted>0)\n newText += omitted+" tiddler"+((omitted!=1)?"s":"")+((omitted!=1)?" were":" was")+" not imported.\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 // output the tiddler detail and reset status flags\n for (var t=0; t<count; t++)\n if (tiddlers[t].status!="")\n {\n newText += "#["+"["+tiddlers[t].title+"]"+"]";\n newText += ((tiddlers[t].status!="added")?("^^\sn"+tiddlers[t].status+"^^"):"")+"\sn";\n config.macros.importTiddlers.inbound[t].status="";\n }\n newText += "<"+"<"+"<\sn";\n // output 'discard report' link\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+tiddler.title+"'); store.deleteTiddler('"+tiddler.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n tiddler.text = newText+((tiddler.text!="")?'\sn----\sn':"")+tiddler.text;\n tiddler.modifier = config.options.txtUserName;\n tiddler.modified = new Date();\n store.addTiddler(tiddler);\n if (!quiet) story.displayTiddler(null,"ImportedTiddlers",1,null,null,false);\n story.refreshTiddler("ImportedTiddlers",1,true);\n // refresh the display\n store.notifyAll();\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#importAskPanel { 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="importAskPanel">\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// // 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 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// // 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 theAskPanel = document.getElementById('importAskPanel');\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 loadImportFile(config.macros.importTiddlers.src,"all",null,null,null,function(){window.refreshImportList(0);});\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 theAskPanel.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 theAskPanel.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: [['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn^^'+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 hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.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 hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.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// // 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 ask panel and set the title edit field\n document.getElementById('importAskPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n
On Wednesday, July 12, 2006 9:26:01 PM, KenGirard imported tiddlers from\n[[C:\sDocuments and Settings\sDark Lady\sMy Documents\sMy Webs\sNo-Sin\swiki\sindex.htm|C:\sDocuments and Settings\sDark Lady\sMy Documents\sMy Webs\sNo-Sin\swiki\sindex.htm]]:\n<<<\nOut of 253 tiddlers in {{{C:/Documents and Settings/Dark Lady/My Documents/My Webs/No-Sin/wiki/index.htm}}}:\n22 new tiddlers were added to your document.\n11 existing tiddlers were replaced.\n220 tiddlers were not imported.\n#[[.and can even span across several lines...]]\n#[[.or even include blank lines.]]\n#[[Alesia Clardy]]^^\nreplaces Alesia Clardy - 6/29/2006 16:7:0 by KenGirard^^\n#[[Band Schedule]]^^\nreplaces Band Schedule - 7/6/2006 11:14:0 by KenGirard^^\n#[[Bill Blanke]]\n#[[Brian Gates]]\n#[[Cayce Duda]]\n#[[Chris Gregory]]\n#[[ContactsFormTemplate]]^^\nreplaces ContactsFormTemplate - 7/5/2006 15:7:0 by KenGirard^^\n#[[David Szuc]]^^\nreplaces David Szuc - 6/28/2006 23:52:0 by KenGirard^^\n#[[EmailTiddlerPlugin]]^^\nreplaces EmailTiddlerPlugin - 6/27/2006 14:56:0 by KenGirard^^\n#[[ForEach formating]]\n#[[Geoffrey Pruitt]]\n#[[Jamie Schnieder]]\n#[[Jason Gish]]\n#[[Jen Brinkly]]\n#[[Jenni-myCousin]]^^\nreplaces Jenni-myCousin - 1/22/2006 17:36:0 by KenGirard^^\n#[[Joe White]]\n#[[Karen Skaife]]\n#[[Ken Girard]]\n#[[Laurah Persons]]\n#[[Mike Ebert]]\n#[[Misty Gates]]\n#[[Mitzi Trout]]\n#[[MyContacts]]^^\nreplaces MyContacts - 6/29/2006 16:10:0 by KenGirard^^\n#[[NewContact]]^^\nreplaces NewContact - 6/28/2006 23:55:0 by KenGirard^^\n#[[Percussion Pre-Camp]]^^\nreplaces Percussion Pre-Camp - 7/6/2006 11:10:0 by KenGirard^^\n#[[Pirates]]\n#[[Reminders]]^^\nreplaces Reminders - 6/28/2006 9:27:0 by KenGirard^^\n#[[ServiceTemplate]]\n#[[Sheep Brand Products]]\n#[[Things to blog about]]\n#[[bottomMenu]]^^\nreplaces bottomMenu - 7/6/2006 14:23:0 by KenGirard^^\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''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{{{\n<script>alert('InlineJavascriptPlugin: this is a demonstration message');</script>\n}}}\n<script>alert('InlineJavascriptPlugin: this is a demonstration message');</script>\n\ndynamic output:\n{{{\n<script>return (new Date()).toString();</script>\n}}}\n<script>return (new Date()).toString();</script>\n\nwikified dynamic output:\n{{{\n<script>return "link to current user: [["+config.options.txtUserName+"]]";</script>\n}}}\n<script>return "link to current user: [["+config.options.txtUserName+"]]";</script>\n\ndynamic output using 'place' to get size information for current tiddler\n{{{\n<script>\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>\n}}}\n<script>\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>\n\ncreating an 'onclick' button/link that runs a script\n{{{\n<script label="click here">\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\n}}}\n<script label="click here">\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\n\nloading a script from a source url\n{{{\n<script src="demo.js">return "loading demo.js..."</script>\n<script label="click to execute demo() function">demo()</script>\n}}}\nwhere 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">return "loading demo.js..."</script>\n<script label="click to execute demo() function">demo()</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.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: 4, revision: 0, date: new Date(2006,1,5)};\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")?\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[2] && lookaheadMatch[3]) { // 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[3]+"};_out(this);"\n link.setAttribute("href","javascript:;"); link.setAttribute("title",""); link.style.cursor="pointer";\n }\n else if (lookaheadMatch[3]) { // run inline script code\n var code="function _out(place){"+lookaheadMatch[3]+"};_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 w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}\n
/***\n|''Name:''|~IntelliTaggerPlugin|\n|''Version:''|1.0.0 (2006-04-26)|\n|''Type:''|plugin|\n|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|\n|''Source Code:''|[[IntelliTaggerPlugin SourceCode]]|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n|''Browser:''|Firefox 1.5.0.2 or better|\n\n***/\n// /%\nif(!version.extensions.IntelliTaggerPlugin){if(!window.abego){window.abego={};}if(!abego.internal){abego.internal={};}abego.alertAndThrow=function(s){alert(s);throw s;};if(version.major<2){abego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");}version.extensions.IntelliTaggerPlugin={major:1,minor:0,revision:0,date:new Date(2006,3,26),type:"plugin",source:"http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin",documentation:"[[IntelliTaggerPlugin Documentation]]",sourcecode:"[[IntelliTaggerPlugin SourceCode]]",author:"Udo Borkowski (ub [at] abego-software [dot] de)",licence:"[[BSD open source license (abego Software)]]",tiddlywiki:"Version 2.0.8 or better",browser:"Firefox 1.5.0.2 or better"};abego.isPopupOpen=function(_2){return _2&&_2.parentNode==document.body;};abego.openAsPopup=function(_3){if(_3.parentNode!=document.body){document.body.appendChild(_3);}};abego.closePopup=function(_4){if(abego.isPopupOpen(_4)){document.body.removeChild(_4);}};abego.getWindowRect=function(){return {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};};abego.moveElement=function(_5,_6,_7){_5.style.left=_6+"px";_5.style.top=_7+"px";};abego.centerOnWindow=function(_8){if(_8.style.position!="absolute"){throw "abego.centerOnWindow: element must have absolute position";}var _9=abego.getWindowRect();abego.moveElement(_8,_9.left+(_9.width-_8.offsetWidth)/2,_9.top+(_9.height-_8.offsetHeight)/2);};abego.isDescendantOrSelf=function(_a,e){while(e){if(_a==e){return true;}e=e.parentNode;}return false;};abego.toSet=function(_c){var _d={};for(var i=0;i<_c.length;i++){_d[_c[i]]=true;}return _d;};abego.filterStrings=function(_f,_10,_11){var _12=[];for(var i=0;i<_f.length&&(_11===undefined||_12.length<_11);i++){var s=_f[i];if(s.match(_10)){_12.push(s);}}return _12;};abego.arraysAreEqual=function(a,b){var n=a.length;if(n!=b.length){return false;}for(var i=0;i<n;i++){if(a[i]!=b[i]){return false;}}return true;};abego.moveBelowAndClip=function(_19,_1a){if(!_1a){return;}var _1b=findPosX(_1a);var _1c=findPosY(_1a);var _1d=_1a.offsetHeight;var _1e=_1b;var _1f=_1c+_1d;var _20=findWindowWidth();if(_20<_19.offsetWidth){_19.style.width=(_20-100)+"px";}var _21=_19.offsetWidth;if(_1e+_21>_20){_1e=_20-_21-30;}if(_1e<0){_1e=0;}_19.style.left=_1e+"px";_19.style.top=_1f+"px";_19.style.display="block";};abego.compareStrings=function(a,b){return (a==b)?0:(a<b)?-1:1;};abego.sortIgnoreCase=function(arr){var _25=[];var n=arr.length;for(var i=0;i<n;i++){var s=arr[i];_25.push([s.toString().toLowerCase(),s]);}_25.sort(function(a,b){return (a[0]==b[0])?0:(a[0]<b[0])?-1:1;});for(i=0;i<n;i++){arr[i]=_25[i][1];}};abego.getTiddlerField=function(_2b,_2c,_2d){var _2e=document.getElementById(_2b.idPrefix+_2c);var e=null;if(_2e!=null){var _30=_2e.getElementsByTagName("*");for(var t=0;t<_30.length;t++){var c=_30[t];if(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){if(!e){e=c;}if(c.getAttribute("edit")==_2d){e=c;}}}}return e;};abego.setRange=function(_33,_34,end){if(_33.setSelectionRange){_33.setSelectionRange(_34,end);var max=0+_33.scrollHeight;var len=_33.textLength;var top=max*_34/len,bot=max*end/len;_33.scrollTop=Math.min(top,(bot+top-_33.clientHeight)/2);}else{if(_33.createTextRange!=undefined){var _39=_33.createTextRange();_39.collapse();_39.moveEnd("character",end);_39.moveStart("character",_34);_39.select();}else{_33.select();}}};abego.internal.TagManager=function(){var _3a=null;var _3b=function(){if(_3a){return;}_3a={};store.forEachTiddler(function(_3c,_3d){for(var i=0;i<_3d.tags.length;i++){var tag=_3d.tags[i];var _40=_3a[tag];if(!_40){_40=_3a[tag]={count:0,tiddlers:{}};}_40.tiddlers[_3d.title]=true;_40.count+=1;}});};var _41=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_42,_43,_44,_45,_46,_47){var _48=this.fetchTiddler(_42);var _49=_48?_48.tags:[];var _4a=(typeof _47=="string")?_47.readBracketedList():_47;_41.apply(this,arguments);if(!abego.arraysAreEqual(_49,_4a)){abego.internal.getTagManager().reset();}};var _4b=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_4c){var _4d=this.fetchTiddler(_4c);var _4e=_4d&&_4d.tags.length>0;_4b.apply(this,arguments);if(_4e){abego.internal.getTagManager().reset();}};this.reset=function(){_3a=null;};this.getTiddlersWithTag=function(tag){_3b();var _50=_3a[tag];return _50?_50.tiddlers:null;};this.getAllTags=function(_51){_3b();var _52=[];for(var i in _3a){_52.push(i);}for(i=0;_51&&i<_51.length;i++){_52.pushUnique(_51[i],true);}abego.sortIgnoreCase(_52);return _52;};this.getTagInfos=function(){_3b();var _54=[];for(var _55 in _3a){_54.push([_55,_3a[_55]]);}return _54;};var _56=function(a,b){var a1=a[1];var b1=b[1];var d=b[1].count-a[1].count;return d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());};this.getSortedTagInfos=function(){_3b();var _5c=this.getTagInfos();_5c.sort(_56);return _5c;};this.getPartnerRankedTags=function(_5d){var _5e={};for(var i=0;i<_5d.length;i++){var _60=this.getTiddlersWithTag(_5d[i]);for(var _61 in _60){var _62=store.getTiddler(_61);if(!(_62 instanceof Tiddler)){continue;}for(var j=0;j<_62.tags.length;j++){var tag=_62.tags[j];var c=_5e[tag];_5e[tag]=c?c+1:1;}}}var _66=abego.toSet(_5d);var _67=[];for(var n in _5e){if(!_66[n]){_67.push(n);}}_67.sort(function(a,b){var d=_5e[b]-_5e[a];return d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());});return _67;};};abego.internal.getTagManager=function(){if(!abego.internal.gTagManager){abego.internal.gTagManager=new abego.internal.TagManager();}return abego.internal.gTagManager;};(function(){var _6c=2;var _6d=1;var _6e=30;var _6f;var _70;var _71;var _72;var _73;var _74;if(!abego.IntelliTagger){abego.IntelliTagger={};}var _75=function(){return _70;};var _76=function(tag){return _73[tag];};var _78=function(s){var i=s.lastIndexOf(" ");return (i>=0)?s.substr(0,i):"";};var _7b=function(_7c){var s=_7c.value;var len=s.length;return (len>0&&s[len-1]!=" ");};var _7f=function(_80){var s=_80.value;var len=s.length;if(len>0&&s[len-1]!=" "){_80.value+=" ";}};var _83=function(tag,_85,_86){if(_7b(_85)){_85.value=_78(_85.value);}story.setTiddlerTag(_86.title,tag,0);_7f(_85);abego.IntelliTagger.assistTagging(_85,_86);};var _87=function(n){if(_74){if(_74.length>n){return _74[n];}n-=_74.length;}return (_72&&_72.length>n)?_72[n]:null;};var _89=function(n,_8b,_8c){var _8d=_87(n);if(_8d){_83(_8d,_8b,_8c);}};var _8e=function(_8f){var pos=_8f.value.lastIndexOf(" ");var _91=(pos>=0)?_8f.value.substr(++pos,_8f.value.length):_8f.value;return new RegExp(_91.escapeRegExp(),"i");};var _92=function(_93,_94){var _95=0;for(var i=0;i<_93.length;i++){if(_94[_93[i]]){_95++;}}return _95;};var _97=function(_98,_99,_9a){var _9b=1;var c=_98[_99];for(var i=_99+1;i<_98.length;i++){if(_98[i][1].count==c){if(_98[i][0].match(_9a)){_9b++;}}else{break;}}return _9b;};var _9e=function(_9f,_a0){var _a1=abego.internal.getTagManager().getSortedTagInfos();var _a2=[];var _a3=0;for(var i=0;i<_a1.length;i++){var c=_a1[i][1].count;if(c!=_a3){if(_a0&&(_a2.length+_97(_a1,i,_9f)>_a0)){break;}_a3=c;}if(c==1){break;}var s=_a1[i][0];if(s.match(_9f)){_a2.push(s);}}return _a2;};var _a7=function(_a8,_a9){return abego.filterStrings(abego.internal.getTagManager().getAllTags(_a9),_a8);};var _aa=function(){if(!_6f){return;}var _ab=store.getTiddlerText("IntelliTaggerMainTemplate");if(!_ab){_ab="<b>Tiddler IntelliTaggerMainTemplate not found</b>";}_6f.innerHTML=_ab;applyHtmlMacros(_6f,null);refreshElements(_6f,null);};var _ac=function(e){if(!e){var e=window.event;}var tag=this.getAttribute("tag");if(_71){_71.call(this,tag,e);}return false;};var _af=function(_b0,_b1,_b2,_b3){if(!_b1){return;}var _b4=_b3?abego.toSet(_b3):{};var n=_b1.length;for(var i=0;i<n;i++){var tag=_b1[i];if(_b4[tag]){continue;}if(i>0){createTiddlyElement(_b0,"span",null,"tagSeparator"," | ");}var _b8="";var _b9=_b0;if(_b2<10){_b9=createTiddlyElement(_b0,"span",null,"numberedSuggestion");_b2++;var key=_b2<10?""+(_b2):"0";createTiddlyElement(_b9,"span",null,"suggestionNumber",key+") ");var _bb=_b2==1?"Ctrl-Space or ":"";_b8=" (Shortcut: %1Alt-%0)".format([key,_bb]);}var _bc=config.views.wikified.tag.tooltip.format([tag]);var _bd=(_76(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_b8]);var _be="%0; Shift-Click: %1".format([_bd,_bc]);var btn=createTiddlyButton(_b9,tag,_be,_ac,_76(tag)?"currentTag":null);btn.setAttribute("tag",tag);}};var _c0=function(){if(_6f){window.scrollTo(0,ensureVisible(_6f));}if(_75()){window.scrollTo(0,ensureVisible(_75()));}};var _c1=function(e){if(!e){var e=window.event;}if(!_6f){return;}var _c3=resolveTarget(e);if(_c3==_75()){return;}if(abego.isDescendantOrSelf(_6f,_c3)){return;}abego.IntelliTagger.close();};addEvent(document,"click",_c1);var _c4=Story.prototype.gatherSaveFields;Story.prototype.gatherSaveFields=function(e,_c6){_c4.apply(this,arguments);var _c7=_c6.tags;if(_c7){_c6.tags=_c7.trim();}};var _c8=function(_c9){story.focusTiddler(_c9,"tags");var _ca=abego.getTiddlerField(story,_c9,"tags");if(_ca){var len=_ca.value.length;abego.setRange(_ca,len,len);window.scrollTo(0,ensureVisible(_ca));}};var _cc=config.macros.edit.handler;config.macros.edit.handler=function(_cd,_ce,_cf,_d0,_d1,_d2){_cc.apply(this,arguments);var _d3=_cf[0];if((_d2 instanceof Tiddler)&&_d3=="tags"){var _d4=_cd.lastChild;_d4.onfocus=function(e){abego.IntelliTagger.assistTagging(_d4,_d2);setTimeout(function(){_c8(_d2.title);},100);};_d4.onkeyup=function(e){if(!e){var e=window.event;}if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){_89(e.keyCode==48?9:e.keyCode-49,_d4,_d2);}else{if(e.ctrlKey&&e.keyCode==32){_89(0,_d4,_d2);}}setTimeout(function(){abego.IntelliTagger.assistTagging(_d4,_d2);},100);return false;};_7f(_d4);}};var _d7=function(e){if(!e){var e=window.event;}var _d9=resolveTarget(e);var _da=_d9.getAttribute("tiddler");if(_da){story.displayTiddler(_d9,_da,"IntelliTaggerEditTagsTemplate",false);_c8(_da);}return false;};var _db=config.macros.tags.handler;config.macros.tags.handler=function(_dc,_dd,_de,_df,_e0,_e1){_db.apply(this,arguments);abego.IntelliTagger.createEditTagsButton(_e1,createTiddlyElement(_dc.lastChild,"li"));};var _e2=function(){if(_6f&&_70&&!abego.isDescendantOrSelf(document,_70)){abego.IntelliTagger.close();}};setInterval(_e2,100);abego.IntelliTagger.displayTagSuggestions=function(_e3,_e4,_e5,_e6,_e7){_72=_e3;_73=abego.toSet(_e4);_74=_e5;_70=_e6;_71=_e7;if(!_6f){_6f=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");_6f.style.position="absolute";}_aa();abego.openAsPopup(_6f);if(_75()){var w=_75().offsetWidth;if(_6f.offsetWidth<w){_6f.style.width=(w-2*(_6c+_6d))+"px";}abego.moveBelowAndClip(_6f,_75());}else{abego.centerOnWindow(_6f);}_c0();};abego.IntelliTagger.assistTagging=function(_e9,_ea){var _eb=_8e(_e9);var s=_e9.value;if(_7b(_e9)){s=_78(s);}var _ed=s.readBracketedList();var _ee=_ed.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_ed),_eb,_6e):_9e(_eb,_6e);abego.IntelliTagger.displayTagSuggestions(_a7(_eb,_ed),_ed,_ee,_e9,function(tag,e){if(e.shiftKey){onClickTag.call(this,e);}else{_83(tag,_e9,_ea);}});};abego.IntelliTagger.close=function(){abego.closePopup(_6f);_6f=null;return false;};abego.IntelliTagger.createEditTagsButton=function(_f1,_f2,_f3,_f4,_f5,id,_f7){if(!_f3){_f3="[edit]";}if(!_f4){_f4="Edit the tags";}if(!_f5){_f5="editTags";}var _f8=createTiddlyButton(_f2,_f3,_f4,_d7,_f5,id,_f7);_f8.setAttribute("tiddler",(_f1 instanceof Tiddler)?_f1.title:String(_f1));return _f8;};config.macros.intelliTagger={label:"intelliTagger",handler:function(_f9,_fa,_fb,_fc,_fd,_fe){var _ff=_fd.parseParams("list",null,true);var _100=_ff[0]["action"];for(var i=0;_100&&i<_100.length;i++){var _102=_100[i];var _103=config.macros.intelliTagger.subhandlers[_102];if(!_103){abego.alertAndThrow("Unsupported action '%0'".format([_102]));}_103(_f9,_fa,_fb,_fc,_fd,_fe);}},subhandlers:{showTags:function(_104,_105,_106,_107,_108,_109){_af(_104,_72,_74?_74.length:0,_74);},showFavorites:function(_10a,_10b,_10c,_10d,_10e,_10f){_af(_10a,_74,0);},closeButton:function(_110,_111,_112,_113,_114,_115){var _116=createTiddlyButton(_110,"close","Close the suggestions",abego.IntelliTagger.close);},version:function(_117){var t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPlugin.major,version.extensions.IntelliTaggerPlugin.minor,version.extensions.IntelliTaggerPlugin.revision]);var e=createTiddlyElement(_117,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";},copyright:function(_11a){var e=createTiddlyElement(_11a,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">© 2006 <b><font color=\s"red\s">abego</font></b> Software<font>";}}};})();config.shadowTiddlers["IntelliTaggerStyleSheet"]="/***\sn"+"!~IntelliTagger Stylesheet\sn"+"***/\sn"+"/*{{{*/\sn"+".intelliTaggerSuggestions {\sn"+"\stposition: absolute;\sn"+"\stwidth: 600px;\sn"+"\sn"+"\stpadding: 2px;\sn"+"\stlist-style: none;\sn"+"\stmargin: 0;\sn"+"\sn"+"\stbackground: #eeeeee;\sn"+"\stborder: 1px solid DarkGray;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .currentTag {\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .suggestionNumber {\sn"+"\stcolor: #808080;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .numberedSuggestion{\sn"+"\stwhite-space: nowrap;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter {\sn"+"\stmargin-top: 4px;\sn"+"\stborder-top-width: thin;\sn"+"\stborder-top-style: solid;\sn"+"\stborder-top-color: #999999;\sn"+"}\sn"+".intelliTaggerSuggestions .favorites {\sn"+"\stborder-bottom-width: thin;\sn"+"\stborder-bottom-style: solid;\sn"+"\stborder-bottom-color: #999999;\sn"+"\stpadding-bottom: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .normalTags {\sn"+"\stpadding-top: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter .button {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-left: 0.3em;\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn";config.shadowTiddlers["IntelliTaggerMainTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class=\s"favorites\s" macro=\s"intelliTagger action: showFavorites\s"></div>\sn"+"<div class=\s"normalTags\s" macro=\s"intelliTagger action: showTags\s"></div>\sn"+"<!-- The Footer (with the Navigation) ============================================ -->\sn"+"<table class=\s"intelliTaggerFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\st<span macro=\s"intelliTagger action: closeButton\s"></span>\sn"+"\st</td>\sn"+"\st<td align=\s"right\s">\sn"+"\st\st<span macro=\s"intelliTagger action: version\s"></span>, <span macro=\s"intelliTagger action: copyright \s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["IntelliTaggerEditTagsTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='title' macro='view title'></div>\sn"+"<div class='tagged' macro='tags'></div>\sn"+"<div class='viewer' macro='view text wikified'></div>\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["BSD open source license (abego Software)"]="See [[Licence|http://tiddlywiki.abego-software.de/#%5B%5BBSD%20open%20source%20license%5D%5D]].";config.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf]].";config.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|http://tiddlywiki.abego-software.de/src/Plugin-IntelliTagger-src.js]]";setStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"intelliTagger");}\n//%/\n
Macros let you write tiddlers containing more exotic objects than just text. See also [[TiddlyWiki Markup]]. Here are the built-in macros:\n\n|!Macro|!Description|!Syntax|\n|allTags|List all the tags used in the current TiddlyWiki file<<br>>Each entry is a button that pops up the list of tiddlers for that tag<<br>><<slider sliderID [[Internal Macros/tags]] 'Click to show example output'>>|{{{<<allTags>>}}}|\n|br|Force a line break|{{{<<br>>}}}|\n|closeAll|Displays a button to close all displayed Tiddlers<<br>><<closeAll>>|{{{<<closeAll>>}}}|\n|gradient|<<gradient [horiz|vert] #bbbbbb #eeeeee #ffffff>>Produces a horizontal or vertical background gradient fill>><<br>>There can be 2 or more colours in the format: #rrggbb (hex), or RGB(r,g,b) (CSS)<<br>>Other CSS formatting can also be added, e.g. {{{<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>}}}|{{{<<gradient [horiz|vert] #bbbbbb #eeeeee #ffffff>>Some text here>>}}}|\n|list all|List all Tiddlers in a Tiddler|{{{<<list all>>}}}|\n|list missing|List all missing tiddlers|{{{<<list missing>>}}}|\n|list orphans|List all orphaned tiddlers|{{{<<list orphans>>}}}|\n|newJournal|Displays a button to create new date & Time stamped Tiddler (Date/time format optional)<<br>><<newJournal "DD MMM YYYY, hh:mm">>|{{{<<newJournal [DateFormatString]>>}}}|\n|newTiddler|Displays a button to create new Tiddler<<br>><<newTiddler>>|{{{<<newTiddler>>}}}|\n|permaview|Displays a button to change the URL link for all open Tiddlers - or the containing tiddler if used in the command bar (See the ViewTemplate)<<br>><<permaview>>|{{{<<permaview>>}}}|\n|saveChanges |Button to save all TiddlyWiki changes (or the current tiddler if used in the command bar (see EditTemplate)<<br>><<saveChanges>>|{{{<<saveChanges>>}}}|\n|search|Display a Search box<<br>><<search>>|{{{<<search>>}}}|\n|slider|Display a Slider (a collapsable display of another tiddler)<<br>>See the allTags entry for an example. Note: Put quotes around the label if needing spaces<<br>>where: ''ID''=cookie name to be used to save the state of the slider, ''Tiddler''=name of the tiddler to include in the slider, ''Label''=label text of the slider button, ''tooltip''=text of the buttons tooltip|{{{<<slider ID Tiddler [Label] [toolTip]>>}}}|\n|sparkline|Produces a sparkline graphic<<br>>e.g. <<sparkline 163 218 231 236 232 266 176 249 289 1041 1835 2285 3098 2101 1755 3283 3353 3335 2898 2224 1404 1354 1825 1839 2142 1942 1784 1145 979 1328 1611>>|{{{<<sparkline num1 num2 ... numN>>}}}|\n|tabs|Display Tabbed content (contents of tab provided by another tiddler)|{{{<<tabs indentifier tabLabel tabName Tiddler>>}}}|\n|tag|Display a Tag ~PopUp<<br>><<tag _Config>>|{{{<<tag tagName>>}}}|\n|tagChooser|Used in EditTemplate to add tags to the tags field. Doesn't actually add anything unless in edit mode (though it does show the list)<<br>><<tagChooser>>|{{{<<tagChooser>>}}}|\n|tagging|<<tiddler [[Internal Macros/tagging]]>>|{{{<<tagging [TiddlerTitle]>>}}}|\n|tiddler|Display contents of another tiddler inline|{{{<<tiddler Tiddler>>}}}|\n|timeline|Display a timeline list of tiddlers<<br>>where the sortfield is the sort order ("modified" or "created") and maxentries is the maximum number of entries|{{{<<timeline [sortfield] [maxentries]>>}}}|\n|today|Display Today's Date<<br>>e.g. <<today>>|{{{<<today [DateFormatString]>>}}}|\n|version|Display TiddlyWiki's version<<br>>e.g. <<version>>|{{{<<version>>}}}|\n\n!DateFormatString\nSeveral Macros including the today macro take a DateFormatString as an optional argument. This string can be a combination of ordinary text, with some special characters that get substituted by parts of the date:\n* DDD - day of week in full (eg, "Monday")\n* DD - day of month, 0DD - adds a leading zero\n* MMM - month in full (eg, "July")\n* MM - month number, 0MM - adds leading zero\n* YYYY - full year, YY - two digit year\n* hh - hours\n* mm - minutes\n* ss - seconds\n!Notes\nIf you need to supply a parameter that should be evaluated (e.g. a JavaScript variable), enclose the parameter in {{{{{}}} and {{{}}}}} rather than quotes. Note however, that the scope used in the evaluation is {{{global}}} rather than {{{local}}}. In other words, the evaluation is done ''before'' the parameter is passed to the macro/plugin so it cannot access any of the variables or functions defined within the macro/plugin.\n!Commands supported by the toolbar macro\n{{{\nconfig.commands = {\n closeTiddler: {text: "close", tooltip: "Close this tiddler"},\n closeOthers: {text: "close others", tooltip: "Close all other tiddlers"},\n editTiddler: {text: "edit", tooltip: "Edit this tiddler", readOnlyText: "view", readOnlyTooltip: "View the source of this tiddler"},\n saveTiddler: {text: "done", tooltip: "Save changes to this tiddler", readOnlyText: "done", readOnlyTooltip: "View this tiddler normally"},\n cancelTiddler: {text: "cancel", tooltip: "Undo changes to this tiddler", hideReadOnly: true},\n deleteTiddler: {text: "delete", tooltip: "Delete this tiddler", warning: "Are you sure you want to delete '%0'?", hideReadOnly: true},\n permalink: {text: "permalink", tooltip: "Permalink for this tiddler"},\n references: {text: "references", tooltip: "Show tiddlers that link to this one", popupNone: "No references"},\n jump: {text: "jump", tooltip: "Jump to another open tiddler"}\n };\n}}}\n(Julian Knight, 2006-04-06)\n<part tagging hidden>\nProduces a list (NB: <ul> ''not'' a popup) of links to tiddlers that carry the specified tag. If no tag is specified, it looks for tiddlers tagged with the name of the current tiddler.\nIn HTML, the list is formatted like so:\n{{{\n<ul>\n<li class="listTitle">List title label</li>\n<li><a class="tiddlyLink ..." href="javascript:;" onclick="..."\n refresh="link" tiddlyLink="ExampleOne">ExampleOne</a></li>\n</ul>\n}}}\n</part>\n<part tags hidden>\n<<allTags>>\n</part>
Create a sliding panel that (onclick so it only does it when I want it to) will list all contacts with any of the checked tags (use toggle tag & for each to do it). So that if I check 'work' & 'personal' I would get a list of all work & personal contacts, but not 'service' contacts.\nThis list would print up like the ShoppingList allowing my to check each person I want to 'invite' to be part of the project by tagging them with the project title.\nThere would be a seperate list which would show me who is already invited, and allow me to get there contact info as needed.
<<formTiddler ContactsFormTemplate>>\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n\n<data>{"cellphone":"314-452-2972","firstname":"Jamie","lastname":"Schnieder","city":"St. Charles","state":"MO"}</data>
\n|Home Phone: | 816-455-3388|\n|Cell Phone: | |\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | http://www.livejournal.com/users/darth_breezy/|\n|Address: | 2606 Red Cedar Parc Ct|\n|City, State, Zip: | O'Fallon, MO 63366|\n\nBirthdate: <<reminder month:1 day:9 title:"JamieBlanke B-day">>\n\n!Details:\nShe is one of the fairies at the StLouisRenFaire.\nAnd spends a lot of time snuggling with her boyfriend.\n\nSee: BillBlanke \n
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Ken Girard]], [[Alesia Clardy]], [[Tim Metza]], [[Cayce Duda]] & [[Tiana Duda]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>> \n<<reminder firstyear:1974 month:8 day:4 title:"Jason's Birthday" >>\n<data>{"firstname":"Jason","lastname":"Gish","e-mail":"illinois_juggalo@yahoo.com","homephone":"636-255-0665","cellphone":"636-352-7349","imhandle":"malbosha (yahoo)","address":"3204 Town & Country Ln.","city":"St. Charles","state":"MO","zip":"63301-0647","country":"USA","website":"http://malboshia.livejournal.com/","e-mail1":"illinois_juggalo","e-mail2":"yahoo.com","notes":"Also works as a DJ"}</data>\n
<<formTiddler ContactsFormTemplate>>\nAlso see: \n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>> \n<<reminder month:8 day:24 title:"Jen's Birthday" >>\n<data>{"firstname":"Jen","lastname":"Brinkly","cellphone":"314-302-0239","imhandle":"deirbhleisut (yahoo)","website":"http://deirbhle.livejournal.com/","city":"St. Louis","state":"MO","country":"USA","address":"7730 Minnesota","zip":"63111-3336","e-mail":"deirbhleisut@yahoo.com","e-mail1":"deirbhleisut","e-mail2":"yahoo.com"}</data>
<<formTiddler ContactsFormTemplate>>\nAlso see: \n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<data>{"homephone":"636-464-4057","firstname":"Jenni - my Cousin","state":"MO","country":"USA"}</data>
<<formTiddler ContactsFormTemplate>>\nAlso see:\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<data>{"cellphone":"636-734-4996","firstname":"Joe","lastname":"White","city":"St. Charles","state":"MO","country":"USA"}</data>
<<formTiddler ContactsFormTemplate>>\n<data>{"firstname":"Joe","lastname":"Block","email":"jb@example.org","phone":"555-1234567","city":"Boston","state":"MA","notes":"works as a designer, \snmay help with logo.","webpage":"www.example.org","country":"US"}</data>
Home Phone: \nCell Phone: \nWork Phone: 314-387-5858\nE-mail: <<email JMMarkuly at magellanhealth dot com>>\nIM Handle: \nWebsite: \nAddress: \nCity, State, Zip: \n\nBirthdate: <<reminder month:12 day:1 title:"JohnMarkuly Birthday">>\n
<<formTiddler ContactsFormTemplate>>\nAlso see: \n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<<reminder firstyear:1957 month:11 day:11 title:"Karen Skaife's Birthday" >>\n<data>{"homephone":"314-426-8774","cellphone":"314-605-8932","firstname":"Karen","lastname":"Skaife","e-mail":"Kskaife@swbell.net","website":"http://kskaife.livejournal.com/","imhandle":"stormie (yahoo)","state":"MO","country":"USA"}</data>
<<reminder date:19 month:9 title:"Ken & Alesia's Anniversary" firstyear:1996>>
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Laurah Persons]], [[Jason Gish]], [[Tim Metza]], [[Cayce Duda]] & [[Tiana Duda]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<<reminder firstyear:1965 month:11 day:14 title:"Ken's Birthday" >> \n<<reminder firstyear:1996 month:9 day:14 title:"Alesia & Ken's first met" >> \n<data>{"cellphone":"314-497-1046","e-mail":"ken.girard@gmail.com","imhandle":"ken.girard (google) | ken_girard (msn)","homephone":"636-255-0665","firstname":"Ken","lastname":"Girard","website":"http://no-sin.com","address":"3204 Town & Country Ln.","city":"St. Charles","state":"MO","zip":"63301-0647","country":"USA"}</data>
Booth: The King's Nuts\n----\n\n|Home Phone: | 618-549-5682|\n|Cell Phone: | |\n|Work Phone: | |\n|E-mail: | <<email Blank at blank dot com>>|\n|IM Handle: | |\n|Website: | |\n| | |\n|Address: | |\n|City: | Alton?, IL|\n\n\nBirthdate: \n
This is an actual company name. What do you think they make?\n\n
<<formTiddler [[MerchantFormTemplate]]>><data>{"companyname":"Lady MacSnood","boothname":"Lady MacSnood","contactname":"Sara Dunham","email":"sara@snood.com","phone":"217-963-6907 or 217-454-4329","address":"PO Box 123","city":"Harristown","state":"IL","zip":"62537","webpage":"http://www.snoods.com","notes":"Permanent deck, returning merchant","product":"Snood & clothes"}</data>
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Ken Girard]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<<reminder firstyear:1967 month:4 day:2 title:"Laurah's Birthday" >> \n<<reminder month:6 day:15 title:"Laurah Persons files for Divorce" firstyear:2006>>\n<data>{"homephone":"314-650-2689","firstname":"Laurah","lastname":"Persons","address":"7303 Commonwealth","city":"St. Louis","state":"MO","zip":"63143","country":"USA"}</data>
Contact: Rodney Busch\nCompany: \nHome Phone: 573-224-3369\nCell Phone: \nWork Phone: \nE-mail: \nE-mail2: \nIM Handle: \nWebsite: \nAddress: Rt2 Box 2780\nCity, State, Zip: Greenville, MO 63944\n\n+++!!![Product Description]\nStaffs, canes, Wooden Balls, flyswaters \n===\n+++!!![Notes]\nPermanent Deck \nReturning merchant ?4? years\nOpen Student Days\n===\n+++!!![Form only works in FireFox]\n<<formTiddler [[MerchantFormTemplate]]>><data>{"contactname":"Rodney Busch","companyname":"Le Staff Royal","boothname":"Le Staff Royal","phone":"573-224-3369","address":"Rt2 Box 2780","city":"Greenville","state":"MO","zip":"63944","product":"Permanent Deck\snReturning merchant ?4? years\snOpen Student Days","notes":"Staffs, canes, Wooden Balls, flyswaters"}</data>\n===
<<tiddlerList tags:"lifehack" group:"tiddler.title.substr(0,1)">>
Service: Chiropractor\n\n|Phone: | 636-947-4770|\n|Address: | 2067 Zumbehl Rd.|\n|City: | St. Charles, MO 63303|
http://www.cfcl.com/vlb/about.php\n\nThis along with [[MY TALENTS]] & [[Aspects of Myself]] are things I am working on creating my own copies of. Someday it will get completed (maybe). \n\n * ADVANCEMENT: Be able to get ahead rapidly, gaining opportunities, for growth and seniority from work well done.\n * AFFILIATION: Be recognized as a member of a particular organization.\n * CHALLENGING PROBLEMS: Engage continually with complex questions and demanding tasks, trouble shooting and Problem solving as a core part of my job.\n * CHANGE AND VARIETY: Have work responsibilities frequently changed in content or setting.\n * COMMUNITY: Live in a town or city where I can meet my neighbors and become active in local politics or service projects.\n * COMPETITION: Engage in activities, which pit my abilities against others.\n * CREATIVITY: Create new ideas, programs, organized structures or anything else not following format developed by others\n * DIVERSITY: Work in a setting that includes individuals of diverse religious, racial or social backgrounds.\n * ENVIRONMENT: Work on tasks that have a positive effect on the natural environment.\n * EXCITEMENT: Experience a high degree of stimulation or frequent novelty and drama on the job.\n * EXERCISE COMPETENCE: Demonstrate a high degree of proficiency in job skills and knowledge; show above average effectiveness.\n * FAST PACE: Work in circumstances where there is a high pace of activity and work is done rapidly.\n * FRIENDSHIPS: Develop close personal relationships with people as a result of work activity.\n * FUN AND HUMOR: Work in a setting where it is possible (and appropriate) to joke and have fun.\n * GROUP & TEAM: Work with a group to obtain team (rather than individual) results.\n * HELP OTHERS: Be involved in helping people directly, either individually or in small groups.\n * HELP SOCIETY: Do something to contribute to the betterment of the world.\n * HIGH EARNINGS ANTICIPATED: Be able to purchase essentials and the luxuries of life that I wish.\n * HONESTY & INTEGRITY: Work in a setting where honesty and integrity are assets.\n * INDEPENDENCE: Be able to determine the nature of my work without significant direction of others. Not to follow instructions or to conform to regulations.\n * INFLUENCE PEOPLE: Be in a position to change attitudes or opinions of others.\n * JOB TRANQUILITY: Avoid the pressure and the "rat race" in my job role and work setting.\n * KNOWLEDGE: Engage myself in pursuit of knowledge, truth and understanding.\n * LOCATION: Find a place to live (town or geographic area) conducive to my lifestyle, a desirable home base for my leisure, learning and work life.\n * MAKE DECISIONS: Have the power to decide courses of action, policies, etc. It is mostly a judgment job.\n * POWER AND AUTHORITY: Control the work activities or destinies of others.\n * PRACTICALITY: Be involved in work that yields a practical or useful result.\n * PRECISION WORK: Deal with tasks that have exact specifications that require careful, accurate attention to detail.\n * PROFIT, GAIN: Have a strong likelihood of accumulating large amounts of money or other material gain through ownership, profit sharing, commissions, merit increases, etc.\n * PUBLIC CONTACT: Have a lot of day-to-day contact with people.\n * RECOGNITION: Get positive feedback and public credit for work well done.\n * SECURITY: Be assured of keeping my job and a reasonable financial reward.\n * STABILITY: Have a work routine and job duties that are largely predictable and not likely to change over time.\n * STATUS: Impress or gain the respect of friends, family and community by the nature and/or level of responsibility of my work.\n * STEEP LEARNING CURVE: Be presented with new, unique or difficult tasks to be quickly mastered.\n * STRUCTURE & PREDICTABILITY: Do work with a high level of structure and predictability.\n * SUPERVISION: have a job in which I am directly responsible for work done by others.\n * TRADITION: Be involved in work that is consistent with the social traditions in which I was brought up.\n * WORK ALONE: Do projects by myself, without any amount of contact or input from others.\n * WORK LIFE BALANCE: A job that allows me adequate time for my family, hobbies and social activities.\n * WORK UNDER PRESSURE: Work in time-pressured circumstances, where there is little or no margin for error, or with demanding personal relationships.\n * WORK WITH OTHERS: Have close working relations with a group and work as a team to common goals. \n\n
This along with [[MY PERSONAL VALUES]] & [[Aspects of Myself]] are things I am working on creating my own copies of. Someday it will get completed (maybe). \n\n* ACT AS LIAISON: Represent, serve as a link between individuals or groups.\n* ANALYZE: Break down figure out problems logically\n* BUDGET: Economize, save, and stretch money or other resources\n* CLASSIFY: Group, categorize, systematize data, people or things\n* COMPOSE MUSIC: Write and arrange Music for voice instruments\n * COUNSEL: Facilitate Insight and personal growth, guide, advise, coach students, employees, or clients.\n * COUNT: Tally, calculate, and compute questions.\n * DEAL WITH FEELINGS: Draw out, listen, accept, empathize, express sensitivity, defuse anger, calm, inject humor, and appreciate.\n * DESIGN: Structure new or innovative practices, programs, products or environments.\n * ENTERTAIN, PERFORM: Amuse, sing, dance, play music, speak to an audience, give a demonstration.\n * ESTIMATE: Appraise value or cost\n * EVALUATE: Assess, review, critique feasibility or quality.\n * EXPEDITE: Speed up production or services, trouble shoot problems, Streamline procedures.\n * GENERATE IDEAS: Reflect upon, conceive of, dream up, and brainstorm ideas.\n * HOST/HOSTESS: Make welcome, put at ease, provide comfort and pleasure, serve visitors, guests or customers.\n * IMPLEMENT: Provide detailed follow through of policies and plans.\n * INITIATE CHANGE: Exert influence on changing the status quo, exercise leadership in bringing about new directions.\n * INTERVIEW FOR INFORMATION: Draw out subjects through incisive questioning.\n * MAINTAIN RECORDS: Keep accurate and up-to-date records, log, record, itemize, collate, and tabulate data\n * MAKE ARRANGEMENTS: Coordinate events, handle logistics.\n * MAKE DECISIONS: Make major, complex or frequent decisions.\n * MEDIATE: Manage conflict, reconcile differences.\n * MONITOR Keep track of the movement of data, people or things\n * MOTIVATE: Recruit involvement, mobilize energy, and stimulate peak performance.\n * NEGOTIATE: Bargain for the rights or the advantages\n * OBSERVE: Study, scrutinize, exam data, people or things scientifically.\n * PERCEIVE INTUITIVELY: Sense, show insight and foresight\n * PLAN, ORGANIZE: Define goals and objectives, schedule and develop projects or programs.\n * PORTRAY IMAGES: Sketch, draw, illustrate, paint, photograph.\n * PRODUCE SKILLED CRAFTS: Shape, weave, attache etch or carve ornamental gift or display items.\n * PROOFREAD, EDIT: Check writings for proper usage and stylistic flair, make improvements.\n * READ FOR INFORMATION: Research written resources efficiently and exhaustively.\n * SELL: Promote a person, company, goods or services, convince of merits and benefits, raise money.\n * STAGE SHOWS: Price theatrical, art, fashion, or trade shows and other events for public performance or display.\n * SUPERVISE: Oversee, direct the work of others.\n * SYNTHESIZE: Integrate ideas and information, combine diverse elements into a coherent whole.\n * TEACH, TRAIN: Inform, explain, and give instruction to students, employees or customers.\n * TEST: Measure proficiency, quality or validity, check and double check.\n * TREAT, NURSE: Heal, cure patients or clients\n * USE MECHANICAL ABILITIES: Assemble, tune repair or operate engines or other machinery\n * VISUALIZE: Imagine possibilities, see in mind's eye.\n * WRITE: Compose reports, letters, articles, ads, stories, or educational materials. \n\n
<html>\n<FORM METHOD=POST ACTION="mailto:someone@$nailmail.com" ENCTYPE="text/plain">\n<table border=0 cellspacing=0 cellpadding=2>\n<tr>\n<td colspan=2>\n<font size=2 face="arial" color="#000000">\n<INPUT type="text" name=URL size=17 value="http://"> :Your URL<BR>\n<INPUT type="text" name=user size=17> :Your Username<BR>\n<INPUT type="text" name=email size=17> :Your E-mail\n</font>\n</td>\n</tr>\n<tr>\n<td>\n<font size=1 face="arial" color="#000000">\n<INPUT name=subscribe type=radio value="yes" CHECKED> subscribe<BR>\n<INPUT name=subscribe type=radio value="no"> unsubscribe<BR>\n</font>\n</td>\n<td>\n<SELECT name="choices" size=1>\n<OPTION selected> OPTIONS\n<OPTION> OPTION 1\n<OPTION> OPTION 2\n<OPTION> OPTION 3\n<OPTION> OPTION 4\n<OPTION> OPTION 5\n</SELECT>\n</td>\n</tr>\n<tr>\n<td colspan=2>\n<font size=1 face="arial" color="#000000">\n<INPUT type=checkbox name="html" value="sendme" CHECKED>\ni can recive email as html<BR>\n<INPUT type=checkbox name="receipt" value="sendme">\nsend me a recipt for this email<BR>\n</font>\n<TEXTAREA cols=20 rows=10>\nHey !\nwhat do you think of the form? \n\ncool huh?\n</TEXTAREA><br>\n<center>\n<INPUT NAME="redirect" TYPE="hidden" VALUE="index.html">\n<INPUT NAME="NEXT_URL" TYPE="hidden" VALUE="index.html">\n<INPUT type=submit value=Send>\n<INPUT type=reset value="Clear">\n</center>\n</td></tr></table>\n</FORM>\n<!-- ** END OF FORM ** -->\n</html>
!<<showClock>>\n<<newerTiddler button:"Dump Brain" name:"New Dump" tags:"@inbox action">>\n[[@inbox]]\n[[Reminders]]\n+++!!!!![Personal|Personal Information]\nMyContacts\nMyEvents\nMyProjects\nMyJournal\n[[Music]]\n[[Books]]\n[[Websites]]\n[[LifeHacks]]\n[[Budget]]\nShoppingList\n===\n+++!!!!![RenFaire|Information about the Ren Faire]\nRenContacts\nRenEvents\nRenHistory\nRenNotes\nRenProjects\n[[Greater St. Louis Ren Faire|http://www.stlrenfaire.com/]]\n===\n+++!!!!![Work|Work related stuff]\nWorkContacts\nWorkEvents\nWorkProjects\n[[PTO]]\n===\n+++!!!!![OtherStuff|Things that don't fit under the other headings]\nplaceholder\n===\n+++!!!!![Help]\n<<forEachTiddler\n where\n 'tiddler.tags.contains("Helper")'\n sortBy 'tiddler.title'\n>>\n===\n+++!!!!![Tag Cloud|A cloud of all my tags]\n<<tagCloud>>\n===\n+++!!!!![Calendar|Click to see calendar]\n<<calendar thismonth>>\n@@bgcolor(#ffffcc):color(#000000):Click to see [[Full year|calendar year]]@@\n===\n+++!!!!![Upcoming Events|Click here to see events happening in the next 31 days] \n@@bgcolor(#ffffcc):color(#000000):Click to see [[365 days]]@@\n<<showReminders leadtime:31 tag:"!Helper" format:"|DIFF: TITLE|">>\n===\n+++!!!!![Links]\n[[GoogleCalendar|http://www.google.com/calendar/]]\n[[Gmail|http://www.gmail.com/]]\n===\n<<tiddler GTDMenu>>\n<<newerTiddler button:"Add Personal Contact" name:"new Contact" tags:"contact" template:"NewContact">>\n---- \n^^Last saved: <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>^^\n^^Edit MainMenu^^\n\nRSS: [img[RSS Feed|rss_feed.gif][index.xml]]\n^^[[Download|http://tiddlyspot.com/BrainDump/index.html]]^^\n
In our ever on going quest to make things easier on you, the customer, we have decided to cut out some of the outdated and cumbersom steps in our ordering process. Below is a comparison of our new & old systems.\n!Old Method:\n# Customer places order\n# We ship order to customer\n# Customer is dissatisfide with product and returns it for thier money back\n# We send customer a bill for Shipping & Handling \n\n!New Method (patent pending):\n# We send customer a bill for Shipping & Handling\nWe strongly believe that not only will these changes make things eaisier on you, the customer, but also will allow us to cut down on overhead, driving our profits through the roof. And unlike other companies that have had a reduction in the amount of shipping that they do, we are not laying anyone off. We are transitioning all of our shipping staff into claims processors.
\n[[Competitions & Parades]]\n[[Football Games]]\n[[Band Camp]]\n[[Night Music Rehearsal]]\n[[Percussion Pre-Camp]]\n[[All|Band Schedule]]
I see what some of the problem is now. I have been forgetting that most folks think that they really do get what they pay for, hence designer jeans, t-shirts and a [[$40 wallet pen|http://eastgate.com/catalog/WalletPen.html]] (Leather against silver... that should tarnish nice and fast. For that price I want titanium. Oh, and then there is $8+ for shipping). \n\nHere I am trying to offer folks stuff at a reasonable price or even free, when what I should be doing is doubling my prices so that folks think "Wow, it cost a mint. It most be good". So we make fewer sales, so what? If I make half as many sales, but my profit margin is 4-10 times higher, then all is good.\n\n<<email1>>
The other day, during one of our endless discussions on why this or that show was canceled, the boychik asked we most marketing seems to be targeted at the young. I had to tell the truth, "Because the young are stupid".\n\nSee, as we get older we get less gulible. We've already been burned a million times. We care less about what is cool, we just want the damn thing to work. We don't need the latest music, we have 30+ years of good stuff already playing in our heads. We don't need that item that will change our lives, as we already had something like it that didn't change us at all. \n
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'>\n\n<div id="SplashScreen" style="border: 3px groove #ffbf00; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>BrainDump</b> is loading<br /><img src="wait2.gif"></img><br><br><span style="font-size: 14px; color:red;">By the way, this page requires Javascript. Hope you have it enabled.</span></div>
<<formTiddler ContactsFormTemplate>>\nAlso see: \n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n\n\n<data>{"cellphone":"816-588-2812","firstname":"Mike","lastname":"Ebert","country":"USA"}</data>
What mileage am I getting and on what fuel?\n*''E85:'' 267.3 miles on 16.403 gallons (16.296mpg)- April 30, 2006\n*''Gasoline:''\n\n!All E85 pumps in MO\nhttp://www.e85fuel.com/database/locationsplain.php?state=moMissouri
1 gal.
http://www.millionformarriage.org\n\nAt first glance at the flyer I thought 'Oh, great more stuff from the million man "can't count & don't know grammer" group'. Then I noticed it was for same sex couples. About time they started making some noise in a big manner.
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Brian Gates]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<<reminder month:8 day:6 title:"Misty Gates' Birthday" >>\n<data>{"firstname":"Misty","lastname":"Gates","website":"http://skyfire33.livejournal.com/","e-mail":"veryfairy@juno.com","homephone":"816-531-6121","cellphone":"816-665-4733","imhandle":"eatzbugs (yahoo)","city":"Kansas City","state":"MO","country":"USA"}</data>
<<formTiddler ContactsFormTemplate>>\nAlso see: \n+++[Picture]\n<html><img src="http://no-sin.com/images/Contra04/thumbnails/Contra04-DSCN0447.jpg" width="56" height="75" alt="Mitzi Trout" /></html>\n===\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>\n<data>{"website":"http://lapis-lazuli615.livejournal.com/","firstname":"Mitzi","lastname":"Trout","cellphone":"316-734-6020","city":"Witchita","state":"KS","country":"USA","imhandle":"liltornado0615 (aim)","e-mail":"liltornado@cox.net","e-mail1":"liltornado","e-mail2":"yahoo.com"}</data>
\n+++![All reminders for 8-14 days away]\n<<showReminders leadtime:8...14 tag:"!done" format:"DIFF: TIDDLER TITLE">>\n===\n+++![All reminders for the rest of the year]\n<<showReminders leadtime:15...365 tag:"!done" format:"DIFF: TIDDLER TITLE">>\n===
<<newMovie NewMovieForm "New Movie" '"Movies - MovieNameHere"' askUser "Movie">>\n{{movietable{\n<<forEachTiddler \n where \n 'tiddler.tags.containsAny(["MovSeen","MovSeenAgain"])'\n sortBy \n 'tiddler.data("movieDateSeen")'\ndescending\nwrite\n'(index == 0 ? "<html><table id=\s"MoviesSeenTable\s" cellspacing=\s"0\s"><caption align=\s"top\s">Movies Seen - 2006</caption><thead><tr><th> # </th><th>Title</th><th></th><th>Rating</th><th>Seen</th><th>Top Movie</th><th>Watch Again</th></tr></thead><tbody>": "") +(index%2 == 0 ? "<tr class=\s"evenRow\s"><td align=center>"+(index+1)+"</td><td><<imdb \s"right\s" \s""+tiddler.data("movieName")+"\s"$))</td><td align=center>[[>$))|"+tiddler.title+"]]</td><td align=center onclick=\s"setRating(\s'"+tiddler.title+"\s',\s'"+config.macros.forEachTiddler.getContainingTiddler(context.place).title+"\s')\s" class=\s"adjustable\s" title=\s"Click to change rating\s">"+tiddler.data("movieRating","---")+"</td><td align=center> [_("+tiddler.title+":MovSeen){(this.fn_init)}{removeTag(this.tiddler,\s'MovToSee\s')}]</td><td align=center>[_("+tiddler.title+":MovFav)]</td><td align=center>[_("+tiddler.title+":MovWatchAgain){(this.fn_init)}{removeTag(this.tiddler,\s'MovSeenAgain\s')}]</td></tr>" : "<tr class=\s"oddRow\s"><td align=center>"+(index+1)+"</td><td><<imdb \s"right\s" \s""+tiddler.data("movieName")+"\s"$))</td><td align=center>[[>$))|"+tiddler.title+"]]</td><td align=center onclick=\s"setRating(\s'"+tiddler.title+"\s',\s'"+config.macros.forEachTiddler.getContainingTiddler(context.place).title+"\s')\s" class=\s"adjustable\s" title=\s"Click to change rating\s">"+tiddler.data("movieRating","---")+"</td><td align=center> [_("+tiddler.title+":MovSeen){(this.fn_init)}{removeTag(this.tiddler,\s'MovToSee\s')}]</td><td align=center>[_("+tiddler.title+":MovFav)]</td><td align=center>[_("+tiddler.title+":MovWatchAgain){(this.fn_init)}{removeTag(this.tiddler,\s'MovSeenAgain\s')}]</td></tr>") +\n(index == count-1 ? "</tbody></table></html>" : "")'\n>>\n<<sortit "MoviesSeenTable">>\n}}}
Action Goal: Create a macro to allow user to specify how many days an event is happening. This way one needs to make one entry to have a 5 day long reminder (exp. vacation)\n\nActions Required: Coding a macro.\n\nMaterials Needed: Computer and time\n\nTime Estimate: 1 week - never\n\nAdd Due Date & Progress Reports: \n<<reminder day:15 title:"Create multi day reminder" >>
''My Girlfriend's Daughter'' by: The Brett Rosenberg Problem\n[[Love So Pure by: Puffy AmiYumi|http://www.pandora.com/music/song/3cd6ac20679c5b8d]]\n
<<tabs txtContactTab Personal 'Family, Friends & Tribe' PersonalContacts Work 'Work contacts' WorkContacts RenFaire 'Rennies, Merchants & Entertainment' RenContacts>>
<<newerTiddler button:"Add Personal Event" name:"newPersonalEvent" tags:"reminder personal" template:"newEventTemplate">>\n!Current Month\n<<showReminders leadtime:31 tag:"personal">>\n+++![Rest of the year]\n<<showReminders leadtime:32...365 tag:"personal">>\n===\n+++![Past year]\n<<showReminders leadtime:-365...-1 tag:"personal">>\n===\n
<<newerTiddler button:"New Jounal Posting" name:"newJournal" tags:"@journal" >>\n<<tiddlerList tags:"@journal" order:"-created">>
<<newerTiddler button:"Create new project" name:"NewProject" tags:"project personal" template:"NewProjectTemplate">>\n<<tiddlerList tags:"project,personal" order:"-created">>
/***\n''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.elsdesign.com/tiddlywiki/#NestedSlidersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''\n\nYou can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n//''note: Enabling these settings may produce unexpected results. Use at your own risk.''//\n===\n++++!!!!![Usage]>\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify 'default to open', 'cookiename', 'heading level', 'custom label/tooltip', 'automatic blockquote' and 'deferred rendering'.\n//{{{\n++++(cookiename)!!!!![label|tooltip]>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsave the slider opened/closed state, and restore this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{[label]}}} or {{{[label|tooltip]}}}^^\nuses custom label/tooltip. (defaults are: ">/more..." and "</less...")^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\ndefault to open: \n{{{\n++++\n content\n===\n}}}\n++++\n content\n===\n----\nuse a custom label: \n{{{\n+++[label]\n content\n===\n}}}\n+++[label]\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, custom label/tooltip, blockquoted)//\n{{{\n++++(testcookie)[label|tooltip]>\n content\n===\n}}}\n++++(testcookie)[label|tooltip]>\n content\n===\n----\ncomplex nesting example:\n{{{\n+++[get info...|click for information]>\n put some general information here, plus a slider with more specific info:\n +++[view details...|click for details]>\n put some detail here, which could include some +++[definitions]>explaining technical terms===\n ===\n===\n}}}\n+++[get info...|click for information]>\n put some general information here, plus a slider with more specific info:\n +++[view details...|click for details]>\n put some detail here, which could include some +++[definitions]>explaining technical terms===\n === \n=== \n===\n+++!!!!![Installation]>\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n===\n+++!!!!![Revision History]>\n\n++++[2006.01.03 - 1.6.2]\nWhen using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n===\n\n+++[2005.12.15 - 1.6.1]\nadded optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n===\n\n+++[2005.11.25 - 1.6.0]\nadded optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n===\n\n+++[2005.11.21 - 1.5.1]\nrevised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.\n===\n\n+++[2005.11.20 - 1.5.0]\n added (cookiename) syntax for optional tracking and restoring of slider open/close state\n===\n\n+++[2005.11.11 - 1.4.0]\n added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n===\n\n+++[2005.11.07 - 1.3.0]\n removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\n formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n===\n\n+++[2005.11.05 - 1.2.1]\n changed name to NestedSlidersPlugin\n more documentation\n===\n\n+++[2005.11.04 - 1.2.0]\n added alternative character-mode syntax {{{(((}}} and {{{)))}}}\n tweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n===\n\n+++[2005.11.03 - 1.1.1]\n fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\n code cleanup, added documentation\n===\n\n+++[2005.11.03 - 1.1.0]\n changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\n changed name to EasySlidersPlugin\n===\n\n+++[2005.11.03 - 1.0.0]\n initial public release\n===\n\n===\n+++!!!!![Credits]>\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] based on considerable research, programming and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson\n===\n***/\n// //+++!!!!![Code]\n//{{{\nversion.extensions.nestedSliders = {major: 1, minor: 6, revision: 2, date: new Date(2006,1,3)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s[[^\s\s]]*\s\s])?(\s\s>?)(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // default to closed, no cookie\n var show="none"; var title=">"; var tooltip="show"; var cookie="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().substr(1,lookaheadMatch[2].length-2);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // custom label/tooltip\n if (lookaheadMatch[4]) {\n title = lookaheadMatch[4].trim().substr(1,lookaheadMatch[4].length-2);\n if ((pos=title.indexOf("|")) != -1)\n { tooltip = title.substr(pos+1,title.length); title = title.substr(0,pos); }\n else\n { tooltip += " "+title; }\n }\n // use "Hn" header format instead of button/link\n if (lookaheadMatch[3]) {\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(w.output,"h"+lvl,null,null,null),"a",null,null,title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n\n }\n else\n var btn = createTiddlyButton(w.output,title,tooltip,onClickNestedSlider);\n var panel = createTiddlyElement(w.output,"span",null,"sliderPanel",null);\n btn.sliderCookie = cookie;\n btn.sliderPanel = panel;\n panel.style.display = show;\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if (!lookaheadMatch[6] || show=="block") {\n w.subWikify(lookaheadMatch[5]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[5]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer)\n alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nfunction onClickNestedSlider(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n// DISABLED: animation sets overflow:hidden, which clips nested sliders...\n// if(config.options.chkAnimate)\n// anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n// else\n theSlider.style.display = isOpen ? "none" : "block";\n if (this.sliderCookie && this.sliderCookie.length)\n { config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }\n return false;\n}\n//}}}\n// //===
Action Goal:\n\nActions Required:\n\nMaterials Needed:\n\nTime Estimate:\n\nAdd Due Date & Progress Reports: <<newReminder>>
<<formTiddler ContactsFormTemplate>>\nAlso see: [[Dawn Marie Blades]]\n!!!!!Birthdate, Anniversaries & Such:\n<<newReminder>>
Default description for new context (which you can change by editing the [[NewContextTemplate]]). You can edit this description as you like, but be sure to include the {{{gtdActionList}}} macro somewhere to see the active actions.\n\n<<gtdActionList>>
|outerborderonly|k\n|<html><b>Title:</b><br><input name=movieName type=text /></html>||>| |>|[x(MovToSee)] - Movie to see|\n|~| <<movielink>> ||>|[x(MovSeen)] - Movie seen|\n|<html><b>Rating:</b><br><input name=movieRating type=text /></html>|||>|[x(MovFav)] - Top Movie|\n|~|||>|[x(MovWatchAgain)] - Watch Again|\n|>|>|>|>|<html><br><b>Review:</b><br><TEXTAREA name=movieReview rows=8 cols=80 ></TEXTAREA></html>|\n|>|>|>|>|<html><br><b>Other Notes:</b><br><TEXTAREA name=movieNotes rows=4 cols=80 ></TEXTAREA></html>|\n<data>{"movieName":"orm"}</data>
/***\nBorrowed from http://lewcid.googlepages.com/mm.html\nCoded by Saq\n\n!Code\n***/\n\n//{{{\nconfig.macros.newMovie = {\n // Standard Properties\n label: "newTiddlerWithForm",\n version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},\n prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"\n}\n\nconfig.macros.newMovie.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the button label\n var buttonLabel = undefined;\n if (i < params.length) {\n buttonLabel = params[i];\n i++;\n }\n\n if (!buttonLabel) {\n config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the (optional) tiddlerName script and "askUser"\n var tiddlerNameScript = undefined;\n var askUser = false;\n if (i < params.length) {\n tiddlerNameScript = params[i];\n i++;\n\n if (i < params.length && params[i] == "askUser") {\n askUser = true;\n i++;\n }\n }\n var tempTag = undefined;\n if (i < params.length) {\n tempTag = params[i];\n i++;\n }\n\n // --- Processing ------------------------------------------\n\n if(!readOnly) {\n var onClick = function() {\n var movieTitle;\n var tiddlerName = 'Movies - ' + movieTitle;\n\n if (tiddlerNameScript) {\n try {\n tiddlerName = eval(tiddlerNameScript);\n } catch (ex) {\n }\n }\n if (!tiddlerName || askUser) {\n movieTitle = prompt("Please specify a movie name.", "");\n var tiddlerName = 'Movies - ' + movieTitle;}\n while (tiddlerName && store.getTiddler(tiddlerName)) {\n movieTitle = prompt("A movie named '"+movieTitle+"' already exists.\sn\sn"+"Please specify a movie name.", movieTitle); var tiddlerName = 'Movies - ' + movieTitle;\n }\n\n // tiddlerName is either null (user canceled) or a name that is not yet in the store.\n if ((tiddlerName)&&(movieTitle!=null)) {\n var body = "<<formTiddler [["+formTemplateName+"]]>>";\n var tags = tempTag;\n store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);\n DataTiddler.setData(tiddlerName,"movieName",movieTitle);\n DataTiddler.setData(tiddlerName,"movieRating","");\n story.displayTiddler(null,tiddlerName,1);\n if(config.options.chkAutoSave)\n saveChanges();\n }\n else\n {return false;}\n }\n\n createTiddlyButton(place,buttonLabel,buttonLabel,onClick);\n }\n\n}\n//}}}
Default description for new project (which you can change by editing the [[NewProjectTemplate]]). Add actions to the project using the {{{gtdAction}}} macro, or the ".." wikitext notation. Note that actions will be tagged with the project name, so it would look nicer if the project name were somewhat concise.
/***\n|''Name:''|NewerTiddlerPlugin|\n|''Version:''|$Revision: 13 $ |\n|''Source:''|http://thePettersons.org/tiddlywiki.html#NewerTiddlerPlugin |\n|''Author:''|[[Paul Petterson]] |\n|''Type:''|Macro Extension |\n|''Requires:''|TiddlyWiki 1.2.33 or higher |\n!Description\nCreate a 'new tiddler' button with lots more options! Specify the text to show on the button, the name of the new tiddler (with date macro expansion), one or more tags for the new tiddlers, and what text if any to include in the new tiddler body! Uses a named parameter format, simalar to the reminder plugin.\n\nAlso - if the tiddler already exists it won't replace any of it's existing data (like tags).\n\n!Syntax\n* {{{<<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal, inbox" text:"New stuff for today:">>}}}\n* {{{<<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>}}}\n* {{{<<newerTiddler button:"New Project" name:"Project Name?" tags:"My Projects, My Inbox, Journal" template:"MyTemplate">>}}}\n!!Parameters\n* name:"Name of Tiddler"\n* tags:"Tag1, Tag2, Tag3" - tags for new tiddler, comma seperated //don't use square brackets //({{{[[}}})// for tags!//\n* button:"name for button" - the name to display instead of "new tiddler"\n* body:"what to put in the tiddler body"\n* template:"Name of a tiddler containing the text to use as the body of the new tiddler"\n\n''Note:'' if you sepecify both body and template parameters, then template parameter will be used and the body parameter overridden.\n\n!Sample Output\n* <<newerTiddler button:"Inbox" name:"Inbox YYYY/MM/DD" tags:"Journal inbox" text:"New stuff for today:">>\n* <<newerTiddler button:"@Action" name:"Action: what" tags:"@Action" text:"Add project and describe action">>\n* <<newerTiddler button:"New Project" name:"Project Name?" tags:"[[My Projects]] [[My Inbox]] Journal" template:"MyTemplate">>\n\n!Todo\n<<projectTemplate>>\n\n!Known issues\n* Must use double quotes (") around parameter values if they contain a space, can't use single quotes (').\n* can't use standard bracketted style tags, ust type in the tags space and all and put a comma between them. For example tags:"one big tag, another big tag" uses 2 tags ''one big tag'' and ''another big tag''.\n\n!Notes\n* It works fine, and I use it daily, however I haven't really tested edge cases or multiple platforms. If you run into bugs or problems, let me know!\n\n!Requests\n* Have delta-date specifiers on the name: name:"Inbox YYY/MM/DD+1" ( ceruleat@gmail.com )\n* Option to just open the tiddler instead of immediately edit it ( ceruleat@gmail.com )\n* Have date formatters in tags as well as in name (me)\n\n!Revision history\n$History: PaulsNotepad.html $\n * \n * ***************** Version 2 *****************\n * User: paulpet Date: 2/26/06 Time: 7:25p\n * Updated in $/PaulsNotepad3.0.root/PaulsNotepad3.0/PaulsPlugins/systemConfig\n * Port to tw2.0, bug fixes, and simplification!\nv1.0.2 (not released) - fixed small documentation issues.\nv1.0.1 October 13th - fixed a bug occurring only in FF\nv1.0 October 11th - Initial public release\nv0.8 October 10th - Feature complete... \nv0.7 Initial public preview\n\n!Code\n***/\n//{{{\nconfig.macros.newerTiddler = { \nname:"New(er) Tiddler",\ntags:"",\ntext:"Type Tiddler Contents Here.",\nbutton:"new(er) tiddler",\n\nreparse: function( params ) {\n var re = /([^:\s'\s"\ss]+)(?::([^\s'\s":\ss]+)|:[\s'\s"]([^\s'\s"\s\s]*(?:\s\s.[^\s'\s"\s\s]*)*)[\s'\s"])?(?=\ss|$)/g;\n var ret = new Array() ;\n var m ;\n\n while( (m = re.exec( params )) != null )\n ret[ m[1] ] = m[2]?m[2]:m[3]?m[3]:true ;\n\n return ret ;\n},\nhandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if ( readOnly ) return ;\n\n var input = this.reparse( paramString ) ;\n var tiddlerName = input["name"]?input["name"].trim():config.macros.newerTiddler.name ;\n var tiddlerTags = input["tags"]?input["tags"]:config.macros.newerTiddler.tags ;\n var tiddlerBody = input["text"]?input["text"]:config.macros.newerTiddler.text ;\n var buttonText = input["button"]?input["button"]:config.macros.newerTiddler.button ;\n var template = input["template"]?input["template"]:null;\n\n // if there is a template, use it - otherwise use the tiddlerBody text\n if ( template ) {\n tiddlerBody = store.getTiddlerText( template );\n }\n if ( tiddlerBody == null || tiddlerBody.length == 0 )\n tiddlerBody = config.macros.newerTiddler.text ;\n\n var now = new Date() ;\n tiddlerName = now.formatString( tiddlerName ) ;\n \n createTiddlyButton( place, buttonText, "", function() {\n var exists = store.tiddlerExists( tiddlerName );\n var t = store.createTiddler( tiddlerName );\n if ( ! exists )\n t.assign( tiddlerName, tiddlerBody, config.views.wikified.defaultModifier, now, tiddlerTags.readBracketedList() );\n \n story.displayTiddler(null,tiddlerName,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(tiddlerName,"title");\n return false;\n });\n}}\n//}}}\n/***\nThis plugin is released under the [[Creative Commons Attribution 2.5 License|http://creativecommons.org/licenses/by/2.5/]]\n***/
<<newReminder>>\n\n<<reminder year:2006 month:7 day:18 title:"pm5:30-8pm Tuesday Night Music Rehearsal" >>\n<<reminder year:2006 month:7 day:20 title:"pm5:30-8pm Thursday Night Music Rehearsal" >>\n<<reminder year:2006 month:8 day:15 title:"pm5:30-8pm Tuesday Night Rehearsal" >>\n<<reminder year:2006 month:8 day:22 title:"pm5:30-8pm Tuesday Night Rehearsal" >>\n<<reminder year:2006 month:8 day:29 title:"pm5:30-8pm Tuesday Night Rehearsal" >>\n<<reminder year:2006 month:9 day:12 title:"pm5:30-8pm Tuesday Night Rehearsal" >>\n<<reminder year:2006 month:9 day:26 title:"pm5:30-8pm Tuesday Night Rehearsal" >>\n<<reminder year:2006 month:10 day:5 title:"pm5:30-8pm Tuesday Night Rehearsal" >>\n<<reminder year:2006 month:10 day:17 title:"pm5:30-8pm Tuesday Night Rehearsal" >>\n<<reminder year:2006 month:10 day:24 title:"pm5:30-8pm Tuesday Night Rehearsal " >>\n
\n!!!Don't Be Afraid to Say "No" \nHow do you go about saying "no" to personal requests? Try this "no" sandwich method: \n*Yes (explain what you are willing to do or what alternatives you will offer)\n*No (the "no" is sandwiched between "yeses")\n*Explanation (briefly explain why you have said "no")\n*Yes (close by restating what you are willing to do\n!!!!For example: \nI would be more than happy to go to the meeting with the architect tomorrow (Yes). That will free you up to shop for your daughter's birthday. I would prefer not to do that (No). Something that comes from you will mean much more to her (Explanation). But again I'll be glad to take care of the 3:00 meeting (Yes). \n
!PDF file overkill?\nIt gets used for everything...but should it?\n!LLC Relationships\nhttp://www.relationshipllc.com/ - A different form of marriage.
Borrowed from: http://minezone.org/wiki/MVance/GettingThingsDone\n----\n!Notes from Getting Things Done\n#capture all the things that need to get done into a logical and trusted system outside of your head and off your mind \n#disciplining yourself to make decisions about all the inputs you let into your life, so that you will always have a plan for next actions that you can implement or renegotiate at any moment \n\n!!Outcomes & Actions\n#describe in a single sentence the intended successful outcome for the problem or situation \n#write down the very next physical action required to move the situation forward \n\n!!Horizontal & Vertical Control (Get Things Off Your Mind and Get Them Done)\n#horizontal maintains coherence across all activities in which you are involved \n#vertical manages thinking up and down the track of individual topics and projects \n\n!!Five Stages of Workflow (Horizontal)\n#collect things that command our attention (anything personal or professional, big or little, that you think should be different than it currently is and that you have any level of internal commitment to changing) \n##get it all out of your head \n##minimize your collection buckets \n***physical in-basket \n***writing paper and pads \n***electronic note taking \n***auditory capture (answering machines, voicemail, dictating equipment) \n***email \n##empty the buckets regularly \n#process what they mean and what to do about them \n##what is it? \n##is it actionable? YES or NO \n***No \n####trash \n####incubate \n#####someday/maybe list \n*****tickler file (suspended or follow-on file; a 3D calendar) \n*****43 folders: (31 Daily Files (12 Monthly Files (Tomorrow's Date at the front)))\n#####reference (reference should be information that can be easily referred to when needed) \n***Yes \n####What is the next action? \n*****do it \n*****delegate it \n*****defer it \n*****Project (anything requiring more than one step to accomplish the desired outcome) \n####actionable tracking \n#####list of projects \n#####storage or files for project plans and materials \n#####calendar (time specific actions [appointments], day specific actions, day specific information) \n#####list of reminders of next actions \n#####a list of reminders of things you're waiting for (only review as often as they have to be in order to stop wondering about them) \n##organize the results \n##review the options \n##do \n###choosing actions in the moment \n####context \n####time available \n####energy available \n####priority \n\n!!Weekly Review\n#Loose Papers \n**business cards, receipts, etc. - put in in basket for processing \n#Process Your Notes \n#Previous Calendar Data \n**review for remaining action items, reference information, etc. \n#Upcoming Calendar \n#Empty Your Head \n**write down any new projects, action items, etc. \n#Review "Projects" (and Larger Outcome) Lists \n**ensure that at least one kick-start action is in your system for each \n#Review "Next Actions" Lists \n**Mark off completed actions & review for reminders of further action steps to capture \n#Review "Waiting For" List \n**Records appropriate actions for any needed follow-up & check off received items \n#Review Any Relevant Checklists \n#Review "Someday/Maybe" List \n**Check for any projects that may have become active and transfer them to "Projects" & delete items no longer of interest \n#Review "Pending" and Support Files \n**Browse through all work-in-progress support material to trigger new actions, completions, and waiting-fors \n\n!!Models for Making Action Choices\n#predefined \n#work as it shows up \n#defining work \n\n!!Six Level Model for Reviewing Your Own Work\n#current actions \n#current projects \n#areas of responsibility \n#1-2 year goals \n#3-5 year vision \n#big picture view \n\n*''projects:'' clearly defined outcomes and the next actions to move them towards closure \n*''horizontal focus:'' reminders placed in a trusted system that is reviewed regularly \n*''vertical focus:'' informal back of the envelope planning \n\n!!Five Steps to Accomplish Any Task (Project Planning)\n#defining purpose and principles \n#outcome visioning \n#brainstorming \n#organizing \n#identifying next actions \n\n!!Five Phases of Natural Planning Techniques\n#purpose / guiding principles (Why are we doing this?) \n#mission / vision / goals / sucessful outcome (What would wild success look, sound, or feel like?) \n#brainstorming (How would we accomplish it?) \n##view the project from beyond the completion date \n##envision wild success (suspend "Yeah, but. . .") \n##capture features, aspects, and qualities you imagine in place \n#organizing (identify components, subcomponents, sequences, events, and/or priorities; what must occur and in what order? When do we do these things?) \n#next actions (Where do we start?) \n"If the project is off your mind, your planning is sufficient. If it's still on your mind, keep applying the model until it's clear." \n\n!!Critical Factor of Filing System\n*filing has to be instantaneous and easy \n**One Alpha System \n***consider A-Z organizing unless you need more specific filing reduces number of place something isn't \n***organize by topic, project, person, or company \n**specialized filing may be necessary if amount of reference material on one topic or project exceeds one file drawer. \n*get high quality mechanics and avoid hanging files \n*if you must use hanging files: \n**label files, not the hangers \n**use only one file folder per hanger \n**keep a big supply of plain hangers and new file folder in the front of the drawer \n*purge files once a year \n*encourage a dumpster day at work \n\n!!Dealing with un-met agreements:\n#lower standards \n#do it \n#renegotiate agreement \n\n"What is the next action?" \n\n"The better you get, the better you'd better get." \n\n!!!SUMMARY\n*keep everything out of your head \n*decide actions and outcomes when things first emerge on your radar, instead of later \n*regularly review and update the complete inventory of open loops of your life and work \n----\n!!!Pick up anything around you that youโre wondering what to do with, and apply a simple set of formulae: \n\n*I donโt need or want it = trash \n*I still need to decide what this means to me = IN basket item \n*I might need to know this information = reference \n*I use it = equipment and supplies \n*I like to see it = decoration \n*When I could possibly move on it, I want to see the action as an option = next action reminder, reviewed when and where it could be done \n*I need to be reminded of this short-term outcome Iโve committed to = project list item, reviewed weekly \n*I need to have this when I focus on a project = support material \n*I might want to commit to this at any time in the future = Someday/maybe list item \n*I might want to commit to this on or after a specific time in the future = calendared or โtickledโ item incubated for review on a specific future date \n*I want to achieve this โbiggerโ outcome = goals, objectives, visions that you review on some longer interval \n*Itโs something someone else is doing that I care about = item on Waiting-For list, reviewed at least weekly \n*I need to consider it when I do certain recurring activities = item on a checklist \n\n- from David Allen's Productivity Principles newsletter
Hello,\nI am having a reoccuring problem with my TW on TiddlySpot Currently the messed up code is at (http://tiddlyspot.com/BrainDump/index.html) and a good clean copy is at (http://ken.girard.googlepages.com/BrainDump.html). \n\nIt's happen at least 3 times within a week...I think. The first time it happened I thought I fixed the problem, but then the next time I opened the site it was messed up again, so I thought I had failed to fix it. Now I am wondering if I didn't fix it multiple times only to have it break in a slightly different way. (edit: I am also wondering if this is only happening in IE and it was looking good in Firefox...so I only thought I fixed it.)\n\nEither way, seems that in the process of uploading, or maybe due to some maintance on TiddlySpot (unlikely but...), things get added and it goes wonky. \n\nMy fist indication it happened is the SplashScreen no longer shows up in the center of the page, I get some random characters that show up above my header (They are also visible in the SpashScreen phase I think), the header becomes 700-800px in height, and all pop ups stop showing (They still do something as it jumps down to the bottom of the page & then back, but nothing is visible).
Use the spell corrector to make CorpSpeak mean something silly.\n\nhttp://ptw.sourceforge.net/index-en.html
Find a way to show PowerPoint and other files online in a cheap and simple way.\n<<gtdAction "Search SourceForge" "unfiled">>\n<<gtdAction "Test out possibles" "unfiled">>
PTO Time keeper\n<<tasksum start here>>\n<<task 184 184 87>> PTO Pool\n<<task 5 5 5>> Float Time Pool\n<<task 0.0>> Emergency Sick Time\n<<taskadder>>\n<<tasksum end>>\n\n+++[Past PTO] \n<<showReminders leadtime:-365...-1 tag:"PTO">>\n=== \n+++[Future PTO]\n<<showReminders leadtime:0...365 tag:"PTO">>\n=== \n+++[Add to PTO Scheduale] \n<<newReminder>>\n<<reminder year:2006 month:1 day:31 title:"PTO - 01/31/06 - 4hrs - sick" >>\n<<reminder year:2006 month:2 day:24 title:"PTO - 02/24/06 - 8hrs - Local Show" >>\n<<reminder year:2006 month:2 day:27 title:"PTO - 02/27/06 - 8hrs - Local Show" >>\n<<reminder year:2006 month:3 day:20 title:"PTO - 03/20/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:3 day:21 title:"PTO - 03/21/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:3 day:22 title:"PTO - 03/22/06 - 8hrs - SpringBreak" >>\n<<reminder year:2006 month:3 day:23 title:"PTO - 03/23/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:3 day:24 title:"PTO - 03/24/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:4 title:"PTO - 05/04/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:5 title:"PTO - 05/05/06 - 4hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:10 title:"PTO - 05/10/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:15 title:"PTO - 05/15/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:16 title:"PTO - 05/16/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:17 title:"PTO - 05/17/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:18 title:"PTO - 05/18/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:5 day:19 title:"PTO - 05/19/06 - 8hrs - OurBooth" >>\n<<reminder year:2006 month:8 day:8 title:"PTO - 08/08/06 - 8hrs - GenCon" >>\n<<reminder year:2006 month:8 day:9 title:"PTO - 08/09/06 - 8hrs - GenCon" >>\n<<reminder year:2006 month:8 day:10 title:"PTO - 08/10/06 - 8hrs - GenCon" >>\n<<reminder year:2006 month:8 day:11 title:"PTO - 08/11/06 - 8hrs - GenCon" >>\n<<reminder year:2006 month:8 day:14 title:"PTO - 08/14/06 - 8hrs - GenCon" >>\n\n===
<div class='header' macro='gradient vert #ffbf00 #700 #000'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu' force='true'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='breadCrumbs'></div>\n<div id='tiddlerDisplay'></div>\n<div id='bottomMenu'refresh='content' tiddler='bottomMenu' force='true'></div>\n</div>
Home Phone: \nCell Phone: \nWork Phone: 314-387-5865\nE-mail: <<email MERoppolo at magellanhealth dot com>>\nIM Handle: \nWebsite: \nAddress: 3204 Town & Country Lane\nCity, State, Zip: St. Charles, MO 63301\nBirthdate:
<<newReminder>>\n\n<<reminder year:2006 month:7 day:10 title:"am9-3pm Percussion Pre-Camp" >>\n<<reminder year:2006 month:7 day:11 title:"am9-3pm Percussion Pre-Camp" >>\n<<reminder year:2006 month:7 day:12 title:"am9-3pm Percussion Pre-Camp" >>
!!!!The next two reminders flag the 15th and 30th of every month to pay bills\n*The low leadtime keeps these from showing up in the showReminders macro until 2 days before they are due.\n**<<reminder day:15 title:"Bill Day" leadtime:2>>\n**<<reminder day:30 title:"Bill Day" leadtime:2>>\n\n!!!Reminder that fires once every N days\n*This is a reminder that fires every three weeks. It's imperative to specify a base date with year, month and day if you want this to return consistent dates.\n**<<reminder year:2005 month:7 day:31 recurdays:21 title:"Haircut Day" >>\n\n!!!!Tracking the number of years that a reminder has happened\n*This is a reminder that uses firstyear to specify when something started. Very useful for birthdays and anniversaries.\n**<<reminder month:9 day:20 title:"TiddlyWiki's First Release Anniversary" leadtime:60 firstyear:2004>>\n\n
<<newerTiddler button:"Add Personal Contact" name:"new Contact" tags:"contact personal" template:"NewContact">> :: <<newerTiddler button:"Add Convention Contact" name:"new Contact" tags:"contact convention" template:"NewContact">> :: <<newerTiddler button:"Add W/Ben Contact" name:"new Contact" tags:"contact booty" template:"NewContact">>\n<<tabs txtContactTab Friends 'Family, Friends & Tribe' FriendContacts Convention 'Convention contacts' ConventionContacts W/Ben 'Friends w/Benifits' W/BenContacts>>\n
The other day Congress saw a chance to pile all the pork it wants on to one plate. Seems some airhead pushed for a law that, among other things, maks it illegal to use words like 'Barbie' and 'Furby' in the meta tags of a website showing adult content. Dang! There goes the Barbie Twins website, not to mention the Disney stuff. Oh, wait. If the webmaster lives in a differnet country then we can't touch him. So all the money from those sites will go to other countries, but at least the web will still be safe for free speach!\n\nWhy do I say this was the perfect chance for Congress to pile on the pork? Who in thier right mind is going on record as having voted against something called "The Child Protection and Safety Act".
St Louis Pirate Festival \nRoughly 15 acres of a 17th Century town filled with Pirates! \nCome see some amazing acts, be offered ill-gotten booty from the local merchants, try your hand at games of skill and daring, or just flirt with the wenches and pirates. \n\nDates: September 16-17 & 23-24, 2006 \n2577 Meyer Rd, Wentzville, MO 63348 \n\nFor more information see: http://www.stlpiratefest.com/ \n\nOr come see us in May-June when we have a Renaissance Faire at the same location (http://www.stlrenfaire.com/)\n----\n<<reminder year:2006 month:9 day:16 title:"PirateFest" >>\n<<reminder year:2006 month:9 day:17 title:"PirateFest" >>\n<<reminder year:2006 month:9 day:19 title:"Talk like a Pirate Day" >>\n<<reminder year:2006 month:9 day:23 title:"PirateFest" >>\n<<reminder year:2006 month:9 day:24 title:"PirateFest" >>\n\n
http://tiddlyspot.com/jegden/
''V or 90'' = 1 person with 2 lovers\n''Triad'' = 3 lovers all sharing each other\n''# Spokes'' = 1 person with many lovers (replace # with number of lovers)\n''290 or Table'' = 2 people who count each other as lovers & who each have an additional lover \n''490 or Square'' = 4 people who share lovers. Typically 4 straight people.\n''Slash box'' = 4 people in a relationship with 2 of them counting all 3 of the others as lovers. Typically 2 bi and 2 straight.\n''XBox'' = 4 people all counting each other as lovers. 4 bi or 4 gay.
Has anyone dumped a poster at Wizard's Wagon at the Mill? Other comic/gaming places.\nWhat about RampRiders site?\nStLPunk site?\nWhat about some of the food places in the malls? \nMovie places? \nWhat about next year we team up with some places and do a "drop a card in the fishbowl to win 2 free tickets"?
<<gtdActionList *>>
Meetings to talk about props for the band.\n<<newReminder>>\n<<reminder year:2006 month:8 day:1 title:"pm5:30 - Prop Meeting" >>
+++[Test Case step 1] \n <<editTiddler TestCaseStep1Results>> \n <<tiddler TestCaseStep1Results>> \n=== \n+++[Test Case step 2] \n <<editTiddler TestCaseStep2Results>> \n <<tiddler TestCaseStep2Results>> \n=== \n
Well Wishing: May you live to see tommorow.\n
|I just developed some web-based training in which I referenced a radio button on a web page. My boss printed the page out and put a question mark next to the words "radio button" with the comment: "Needs another name". I've been considering naming options such as "The Circle of Selection" and "The Clicky-circle"|\n\nI just read this over at [[Clientopia|http://www.clientcopia.com/quotes.php?id=3904]] and loved the names as I have had simular problems. (@@Radio buttons? So this is going to have sound? But I don't have speakers@@) \nPersonally I am voting for 'The Circle of Selection'.
Seems like someone (Eric?) had an example of rating stars like the ones Google Groups uses.\nMight be just the thing for the BCTW to rate looks, freak, brains, personality.
<<formTiddler [[MerchantFormTemplate]]>><data>{"companyname":"Ravenwood Potery","boothname":"Ravenwood Potery","contactname":"JC Castle","phone":"314-691-4589","address":"4 Summer Ct.","city":"O'Fallon","state":"MO","zip":"63366","notes":"Permanit Booth","product":"Pottery, Returning merchant"}</data>
//{{{\n\n// adapted from: http://www.cs.utexas.edu/~joeraii/dragn/#Draggable\n// changes by ELS:\n// * hijack refreshTiddler() instead of overridding createTiddler()\n// * find title element by className instead of elementID\n// * set cursor style via code instead of stylesheet\n// * set tooltip help text\n// * set tiddler "position:relative" when starting drag event, restore saved value when drag ends\n\nStory.prototype.rearrangeTiddlersHijack_refreshTiddler = Story.prototype.refreshTiddler;\nStory.prototype.refreshTiddler = function(title,template,unused1,unused2,unused3,unused4,unused5)\n{\n this.rearrangeTiddlersHijack_refreshTiddler(title,template,unused1,unused2,unused3,unused4,unused5);\n var theTiddler = document.getElementById(this.idPrefix + title); if (!theTiddler) return;\n var theHandle;\n for (var i=0; i<theTiddler.childNodes.length; i++)\n if (hasClass(theTiddler.childNodes[i],"title"))\n { theHandle=theTiddler.childNodes[i]; break; }\n if (!theHandle) return theTiddler;\n\n Drag.init(theHandle, theTiddler, 0, 0, null, null);\n theHandle.style.cursor="move";\n theHandle.title="drag title to re-arrange tiddlers"\n theTiddler.onDrag = function(x,y,myElem) {\n if (this.style.position!="relative")\n { this.savedstyle=this.style.position; this.style.position="relative"; }\n y = myElem.offsetTop;\n var next = myElem.nextSibling;\n var prev = myElem.previousSibling;\n if (next && y + myElem.offsetHeight > next.offsetTop + next.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n next.parentNode.insertBefore(myElem, next.nextSibling);//elems[pos+1]);\n myElem.style["top"] = -next.offsetHeight/2+"px";\n }\n if (prev && y < prev.offsetTop + prev.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n prev.parentNode.insertBefore(myElem, prev);\n myElem.style["top"] = prev.offsetHeight/2+"px";\n }\n };\n theTiddler.onDragEnd = function(x,y,myElem) {\n myElem.style["top"] = "0px";\n if (this.savedstyle!=undefined)\n this.style.position=this.savedstyle;\n }\n return theTiddler;\n}\n\n/**************************************************\n * dom-drag.js\n * 09.25.2001\n * www.youngpup.net\n **************************************************\n * 10.28.2001 - fixed minor bug where events\n * sometimes fired off the handle, not the root.\n **************************************************/\n\nvar Drag = {\n obj:null,\n\n init:\n function(o, oRoot, minX, maxX, minY, maxY) {\n o.onmousedown = Drag.start;\n o.root = oRoot && oRoot != null ? oRoot : o ;\n if (isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";\n if (isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";\n o.minX = typeof minX != 'undefined' ? minX : null;\n o.minY = typeof minY != 'undefined' ? minY : null;\n o.maxX = typeof maxX != 'undefined' ? maxX : null;\n o.maxY = typeof maxY != 'undefined' ? maxY : null;\n o.root.onDragStart = new Function();\n o.root.onDragEnd = new Function();\n o.root.onDrag = new Function();\n },\n\n start:\n function(e) {\n var o = Drag.obj = this;\n e = Drag.fixE(e);\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n o.root.onDragStart(x, y, Drag.obj.root);\n o.lastMouseX = e.clientX;\n o.lastMouseY = e.clientY;\n if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;\n if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;\n if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;\n if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;\n document.onmousemove = Drag.drag;\n document.onmouseup = Drag.end;\n Drag.obj.root.style["z-index"] = "10";\n return false;\n },\n\n drag:\n function(e) {\n e = Drag.fixE(e);\n var o = Drag.obj;\n var ey = e.clientY;\n var ex = e.clientX;\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n var nx, ny;\n if (o.minX != null) ex = Math.max(ex, o.minMouseX);\n if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);\n if (o.minY != null) ey = Math.max(ey, o.minMouseY);\n if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);\n nx = x + (ex - o.lastMouseX);\n ny = y + (ey - o.lastMouseY);\n Drag.obj.root.style["left"] = nx + "px";\n Drag.obj.root.style["top"] = ny + "px";\n Drag.obj.lastMouseX = ex;\n Drag.obj.lastMouseY = ey;\n Drag.obj.root.onDrag(nx, ny, Drag.obj.root);\n return false;\n },\n\n end:\n function() {\n document.onmousemove = null;\n document.onmouseup = null;\n Drag.obj.root.style["z-index"] = "0";\n Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]), Drag.obj.root);\n Drag.obj = null;\n },\n\n fixE:\n function(e) {\n if (typeof e == 'undefined') e = window.event;\n if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;\n if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;\n return e;\n }\n};\n//}}}\n
<<list tagged txtGTDReferenceContext any>>
Today, my lover called and said we needed to go out for lunch. We drove her car, but had to stop and get gas. I paid for it. \n\nWe stopped so I could get some pipe tobacco. She picked out 2 cigars for us to give to a friend. I paid for it.\n\nNext we went and had lunch. While sitting there she borrowed my phone to call a friend. Lunch was wonderful, decent conversation, etc. Then she realized that she had forgotten her wallet. I paid for it.\n\nTonight, she is going to pay for it...\n
/***\n|''Name:''|ReminderPlugin|\n|''Version:''|2.3.8.1 (Mar 24, 2006)|\n|''Source:''|http://www.geocities.com/allredfaq/reminderMacros.html|\n|''Author:''|Jeremy Sheeley(pop1280 [at] excite [dot] com)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|reminder, showreminders, displayTiddlersWithReminders, newReminder|\n|''TiddlyWiki:''|2.0+|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n\n!Description\nThis plugin provides macros for tagging a date with a reminder. Use the {{{reminder}}} macro to do this. The {{{showReminders}}} and {{{displayTiddlersWithReminder}}} macros automatically search through all available tiddlers looking for upcoming reminders.\n\n''This version contains a fix by Tom Otvos that modifies tag filtering when tiddlers contain no tags. In this version, if you are filtering showReminders by tag, and a tiddler has no tags, the filter will //not// match the tiddler. Do not copy this into your own TW documents unless you accept this change.''\n\n!Installation\n* Create a new tiddler in your tiddlywiki titled ReminderPlugin and give it the {{{systemConfig}}} tag. The tag is important because it tells TW that this is executable code.\n* Double click this tiddler, and copy all the text from the tiddler's body.\n* Paste the text into the body of the new tiddler in your TW.\n* Save and reload your TW.\n* You can copy some examples into your TW as well. See [[Simple examples]], [[Holidays]], [[showReminders]] and [[Personal Reminders]]\n\n!Syntax:\n|>|See [[ReminderSyntax]] and [[showRemindersSyntax]]|\n\n!Revision history\n* v2.3.8 (Mar 9, 2006)\n**Bug fix: A global variable had snuck in, which was killing FF 1.5.0.1\n**Feature: You can now use TIDDLER and TIDDLERNAME in a regular reminder format\n* v2.3.6 (Mar 1, 2006)\n**Bug fix: Reminders for today weren't being matched sometimes.\n**Feature: Solidified integration with DatePlugin and CalendarPlugin\n**Feature: Recurring reminders will now return multiple hits in showReminders and the calendar.\n**Feature: Added TIDDLERNAME to the replacements for showReminders format, for plugins that need the title without brackets.\n* v2.3.5 (Feb 8, 2006)\n**Bug fix: Sped up reminders lots. Added a caching mechanism for reminders that have already been matched.\n* v2.3.4 (Feb 7, 2006)\n**Bug fix: Cleaned up code to hopefully prevent the Firefox 1.5.0.1 crash that was causing lots of plugins \nto crash Firefox. Thanks to http://www.jslint.com\n* v2.3.3 (Feb 2, 2006)\n**Feature: newReminder now has drop down lists instead of text boxes.\n**Bug fix: A trailing space in a title would trigger an infinite loop.\n**Bug fix: using tag:"birthday !reminder" would filter differently than tag:"!reminder birthday"\n* v2.3.2 (Jan 21, 2006)\n**Feature: newReminder macro, which will let you easily add a reminder to a tiddler. Thanks to Eric Shulman (http://www.elsdesign.com) for the code to do this.\n** Bug fix: offsetday was not working sometimes\n** Bug fix: when upgrading to 2.0, I included a bit to exclude tiddlers tagged with excludeSearch. I've reverted back to searching through all tiddlers\n* v2.3.1 (Jan 7, 2006)\n**Feature: 2.0 compatibility\n**Feature AlanH sent some code to make sure that showReminders prints a message if no reminders are found.\n* v2.3.0 (Jan 3, 2006)\n** Bug Fix: Using "Last Sunday (-0)" as a offsetdayofweek wasn't working.\n** Bug Fix: Daylight Savings time broke offset based reminders (for example year:2005 month:8 day:23 recurdays:7 would match Monday instead of Tuesday during DST.\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// ReminderPlugin\n//============================================================================\n//============================================================================\n\nversion.extensions.ReminderPlugin = {major: 2, minor: 3, revision: 8, date: new Date(2006,3,9), source: "http://www.geocities.com/allredfaq/reminderMacros.html"};\n\n//============================================================================\n// Configuration\n// Modify this section to change the defaults for \n// leadtime and display strings\n//============================================================================\n\nconfig.macros.reminders = {};\nconfig.macros["reminder"] = {};\nconfig.macros["newReminder"] = {};\nconfig.macros["showReminders"] = {};\nconfig.macros["displayTiddlersWithReminders"] = {};\n\nconfig.macros.reminders["defaultLeadTime"] = [0,6000];\nconfig.macros.reminders["defaultReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY";\nconfig.macros.reminders["defaultShowReminderMessage"] = "DIFF: TITLE on DATE ANNIVERSARY -- TIDDLER";\nconfig.macros.reminders["defaultAnniversaryMessage"] = "(DIFF)";\nconfig.macros.reminders["untitledReminder"] = "Untitled Reminder";\nconfig.macros.reminders["noReminderFound"] = "Couldn't find a match for TITLE in the next LEADTIMEUPPER days."\nconfig.macros.reminders["todayString"] = "Today";\nconfig.macros.reminders["tomorrowString"] = "Tomorrow";\nconfig.macros.reminders["ndaysString"] = "DIFF days";\nconfig.macros.reminders["emtpyShowRemindersString"] = "There are no upcoming events";\n\n\n//============================================================================\n// Code\n// You should not need to edit anything \n// below this. Make sure to edit this tiddler and copy \n// the code from the text box, to make sure that \n// tiddler rendering doesn't interfere with the copy \n// and paste.\n//============================================================================\n\n// This line is to preserve 1.2 compatibility\n if (!story) var story=window; \n//this object will hold the cache of reminders, so that we don't\n//recompute the same reminder over again.\nvar reminderCache = {};\n\nconfig.macros.showReminders.handler = function showReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the \n //leadtime a few lines down.\n paramHash["leadtime"] = [-10000, 10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = "";\n if (arr.length == 0)\n {\n mess += config.macros.reminders.emtpyShowRemindersString; \n }\n for (var j = 0; j < arr.length; j++)\n {\n if (paramHash["format"] != null)\n {\n arr[j]["params"]["format"] = paramHash["format"];\n }\n else\n {\n arr[j]["params"]["format"] = config.macros.reminders["defaultShowReminderMessage"];\n }\n mess += getReminderMessageForDisplay(arr[j]["diff"], arr[j]["params"], arr[j]["matchedDate"], arr[j]["tiddler"]);\n mess += "\sn";\n }\n wikify(mess, elem, null, null);\n};\n\n\nconfig.macros.displayTiddlersWithReminders.handler = function displayTiddlersWithReminders(place,macroName,params)\n{\n var now = new Date().getMidnight();\n var paramHash = {};\n var leadtime = [0,14];\n paramHash = getParamsForReminder(params);\n var bProvidedDate = (paramHash["year"] != null) || \n (paramHash["month"] != null) || \n (paramHash["day"] != null) || \n (paramHash["dayofweek"] != null);\n if (paramHash["leadtime"] != null)\n {\n leadtime = paramHash["leadtime"];\n if (bProvidedDate)\n {\n //If they've entered a day, we need to make \n //sure to find it. We'll reset the leadtime \n //a few lines down.\n paramHash["leadtime"] = [-10000,10000];\n }\n }\n var matchedDate = now;\n if (bProvidedDate)\n {\n var leadTimeLowerBound = new Date().getMidnight().addDays(paramHash["leadtime"][0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(paramHash["leadtime"][1]);\n matchedDate = findDateForReminder(paramHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound); \n }\n var arr = findTiddlersWithReminders(matchedDate, leadtime, paramHash["tag"], paramHash["limit"]);\n for (var j = 0; j < arr.length; j++)\n {\n displayTiddler(null, arr[j]["tiddler"], 0, null, false, false, false);\n }\n};\n\nconfig.macros.reminder.handler = function reminder(place,macroName,params)\n{\n var dateHash = getParamsForReminder(params);\n if (dateHash["hidden"] != null)\n {\n return;\n }\n var leadTime = dateHash["leadtime"];\n if (leadTime == null)\n {\n leadTime = config.macros.reminders["defaultLeadTime"]; \n }\n var leadTimeLowerBound = new Date().getMidnight().addDays(leadTime[0]);\n var leadTimeUpperBound = new Date().getMidnight().addDays(leadTime[1]);\n var matchedDate = findDateForReminder(dateHash, new Date().getMidnight(), leadTimeLowerBound, leadTimeUpperBound);\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(place).id.substr(7);\n if (matchedDate != null)\n {\n var diff = matchedDate.getDifferenceInDays(new Date().getMidnight());\n var elem = createTiddlyElement(place,"span",null,null, null);\n var mess = getReminderMessageForDisplay(diff, dateHash, matchedDate, title);\n wikify(mess, elem, null, null);\n }\n else\n {\n createTiddlyElement(place,"span",null,null, config.macros.reminders["noReminderFound"].replace("TITLE", dateHash["title"]).replace("LEADTIMEUPPER", leadTime[1]).replace("LEADTIMELOWER", leadTime[0]).replace("TIDDLERNAME", title).replace("TIDDLER", "[[" + title + "]]") );\n }\n};\n\nconfig.macros.newReminder.handler = function newReminder(place,macroName,params)\n{\n var today=new Date().getMidnight();\n var formstring = '<html><form>Year: <select name="year"><option value="">Every year</option>';\n for (var i = 0; i < 5; i++)\n {\n formstring += '<option' + ((i == 0) ? ' selected' : '') + ' value="' + (today.getFullYear() +i) + '">' + (today.getFullYear() + i) + '</option>';\n }\n formstring += '</select> Month:<select name="month"><option value="">Every month</option>';\n for (i = 0; i < 12; i++)\n {\n formstring += '<option' + ((i == today.getMonth()) ? ' selected' : '') + ' value="' + (i+1) + '">' + config.messages.dates.months[i] + '</option>';\n }\n formstring += '</select> Day:<select name="day"><option value="">Every day</option>';\n for (i = 1; i < 32; i++)\n {\n formstring += '<option' + ((i == (today.getDate() )) ? ' selected' : '') + ' value="' + i + '">' + i + '</option>';\n }\n\nformstring += '</select> Reminder Title:<input type="text" size="40" name="title" value="please enter a title" onfocus="this.select();"><input type="button" value="ok" onclick="addReminderToTiddler(this.form)"></form></html>';\n\n var panel = config.macros.slider.createSlider(place,null,"New Reminder","Open a form to add a new reminder to this tiddler");\n wikify(formstring ,panel,null,store.getTiddler(params[1]));\n};\n\n// onclick: process input and insert reminder at 'marker'\nwindow.addReminderToTiddler = function(form) {\n if (!window.story) \n {\n window.story=window; \n }\n if (!store.getTiddler) \n {\n store.getTiddler=function(title) {return this.tiddlers[title];};\n }\n var title = window.story.findContainingTiddler(form).id.substr(7);\n var tiddler=store.getTiddler(title);\n var txt='\sn<<reminder ';\n if (form.year.value != "")\n txt += 'year:'+form.year.value + ' ';\n if (form.month.value != "")\n txt += 'month:'+form.month.value + ' ';\n if (form.day.value != "")\n txt += 'day:'+form.day.value + ' ';\n txt += 'title:"'+form.title.value+'" ';\n txt +='>>';\n tiddler.set(null,tiddler.text + txt);\n window.story.refreshTiddler(title,1,true);\n store.setDirty(true);\n};\n\nfunction hasTag(tiddlerTags, tagFilters)\n{\n //Make sure we respond well to empty tagFilterlists\n if (tagFilters.length==0) return true;\n \n var bHasTag = false;\n \n /*bNoPos says: "'till now there has been no check using a positive filter"\n Imagine a filterlist consisting of 1 negative filter:\n If the filter isn't matched, we want hasTag to be true.\n Yet bHasTag is still false ('cause only positive filters cause bHasTag to change)\n \n If no positive filters are present bNoPos is true, and no negative filters are matched so we have not returned false\n Thus: hasTag returns true.\n \n If at any time a positive filter is encountered, we want at least one of the tags to match it, so we turn bNoPos to false, which\n means bHasTag must be true for hasTag to return true*/\n var bNoPos=true;\n \n for (var t3 = 0; t3 < tagFilters.length; t3++)\n {\n var negTest = tagFilters[t3].length > 1 && tagFilters[t3].charAt(0) == '!';\n // do the positive filter test outside of the tag loop, in case there are no tags!\n if (bNoPos && !negTest) bNoPos = false;\n \n for(var t2=0; t2<tiddlerTags.length; t2++)\n {\n if (negTest) \n {\n if (tiddlerTags[t2] == tagFilters[t3].substring(1))\n {\n //If at any time a negative filter is matched, we return false\n return false;\n }\n }\n else \n {\n if (tiddlerTags[t2] == tagFilters[t3])\n {\n //A positive filter is matched. As long as no negative filter is matched, hasTag will return true\n bHasTag=true;\n }\n }\n }\n }\n return (bNoPos || bHasTag);\n};\n\n//This function searches all tiddlers for the reminder //macro. It is intended that other plugins (like //calendar) will use this function to query for \n//upcoming reminders.\n//The arguments to this function filter out reminders //based on when they will fire.\n//\n//ARGUMENTS:\n//baseDate is the date that is used as "now". \n//leadtime is a two element int array, with leadtime[0] \n// as the lower bound and leadtime[1] as the\n// upper bound. A reasonable default is [0,14]\n//tags is a space-separated list of tags to use to filter \n// tiddlers. If a tag name begins with an !, then \n// only tiddlers which do not have that tag will \n// be considered. For example "examples holidays" \n// will search for reminders in any tiddlers that \n// are tagged with examples or holidays and \n// "!examples !holidays" will search for reminders \n// in any tiddlers that are not tagged with \n// examples or holidays. Pass in null to search \n// all tiddlers.\n//limit. If limit is null, individual reminders can \n// override the leadtime specified earlier. \n// Pass in 1 in order to override that behavior.\n\nwindow.findTiddlersWithReminders = function findTiddlersWithReminders(baseDate, leadtime, tags, limit)\n{\n//function(searchRegExp,sortField,excludeTag)\n// var macroPattern = "<<([^>\s\s]+)(?:\s\s*)([^>]*)>>";\n var macroPattern = "<<(reminder)(.*)>>";\n var macroRegExp = new RegExp(macroPattern,"mg");\n var matches = store.search(macroRegExp,"title","");\n var arr = [];\n var tagsArray = null;\n if (tags != null)\n {\n tagsArray = tags.split(" ");\n }\n for(var t=matches.length-1; t>=0; t--)\n {\n if (tagsArray != null)\n {\n //If they specified tags to filter on, and this tiddler doesn't \n //match, skip it entirely.\n if ( ! hasTag(matches[t].tags, tagsArray))\n {\n continue;\n }\n }\n\n var targetText = matches[t].text;\n do {\n // Get the next formatting match\n var formatMatch = macroRegExp.exec(targetText);\n if(formatMatch && formatMatch[1] != null && formatMatch[1].toLowerCase() == "reminder")\n {\n //Find the matching date.\n \n var params = formatMatch[2] != null ? formatMatch[2].readMacroParams() : {};\n var dateHash = getParamsForReminder(params);\n if (limit != null || dateHash["leadtime"] == null)\n {\n if (leadtime == null)\n dateHash["leadtime"] = leadtime;\n else\n {\n dateHash["leadtime"] = [];\n dateHash["leadtime"][0] = leadtime[0];\n dateHash["leadtime"][1] = leadtime[1];\n }\n }\n if (dateHash["leadtime"] == null)\n dateHash["leadtime"] = config.macros.reminders["defaultLeadTime"]; \n var leadTimeLowerBound = baseDate.addDays(dateHash["leadtime"][0]);\n var leadTimeUpperBound = baseDate.addDays(dateHash["leadtime"][1]);\n var matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n while (matchedDate != null)\n {\n var hash = {};\n hash["diff"] = matchedDate.getDifferenceInDays(baseDate);\n hash["matchedDate"] = new Date(matchedDate.getFullYear(), matchedDate.getMonth(), matchedDate.getDate(), 0, 0);\n hash["params"] = cloneParams(dateHash);\n hash["tiddler"] = matches[t].title;\n hash["tags"] = matches[t].tags;\n arr.pushUnique(hash);\n if (dateHash["recurdays"] != null || (dateHash["year"] == null))\n {\n leadTimeLowerBound = leadTimeLowerBound.addDays(matchedDate.getDifferenceInDays(leadTimeLowerBound)+ 1);\n matchedDate = findDateForReminder(dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound);\n }\n else matchedDate = null;\n }\n }\n }while(formatMatch);\n }\n if(arr.length > 1) //Sort the array by number of days remaining.\n {\n arr.sort(function (a,b) {if(a["diff"] == b["diff"]) {return(0);} else {return (a["diff"] < b["diff"]) ? -1 : +1; } });\n }\n return arr;\n};\n\n//This function takes the reminder macro parameters and\n//generates the string that is used for display.\n//This function is not intended to be called by \n//other plugins.\n window.getReminderMessageForDisplay= function getReminderMessageForDisplay(diff, params, matchedDate, tiddlerTitle)\n{\n var anniversaryString = "";\n var reminderTitle = params["title"];\n if (reminderTitle == null)\n {\n reminderTitle = config.macros.reminders["untitledReminder"];\n }\n if (params["firstyear"] != null)\n {\n anniversaryString = config.macros.reminders["defaultAnniversaryMessage"].replace("DIFF", (matchedDate.getFullYear() - params["firstyear"]));\n }\n var mess = "";\n var diffString = "";\n if (diff == 0)\n {\n diffString = config.macros.reminders["todayString"];\n }\n else if (diff == 1)\n {\n diffString = config.macros.reminders["tomorrowString"];\n }\n else\n {\n diffString = config.macros.reminders["ndaysString"].replace("DIFF", diff);\n }\n var format = config.macros.reminders["defaultReminderMessage"];\n if (params["format"] != null)\n {\n format = params["format"];\n }\n mess = format;\n//HACK! -- Avoid replacing DD in TIDDLER with the date\n mess = mess.replace(/TIDDLER/g, "TIDELER");\n mess = matchedDate.formatStringDateOnly(mess);\n mess = mess.replace(/TIDELER/g, "TIDDLER");\n if (tiddlerTitle != null)\n {\n mess = mess.replace(/TIDDLERNAME/g, tiddlerTitle);\n mess = mess.replace(/TIDDLER/g, "[[" + tiddlerTitle + "]]");\n }\n \n mess = mess.replace("DIFF", diffString).replace("TITLE", reminderTitle).replace("DATE", matchedDate.formatString("DDD MMM DD, YYYY")).replace("ANNIVERSARY", anniversaryString);\n return mess;\n};\n\n// Parse out the macro parameters into a hashtable. This\n// handles the arguments for reminder, showReminders and \n// displayTiddlersWithReminders.\nwindow.getParamsForReminder = function getParamsForReminder(params)\n{\n var dateHash = {};\n var type = "";\n var num = 0;\n var title = "";\n for(var t=0; t<params.length; t++)\n {\n var split = params[t].split(":");\n type = split[0].toLowerCase();\n var value = split[1];\n for (var i=2; i < split.length; i++)\n {\n value += ":" + split[i];\n }\n if (type == "nolinks" || type == "limit" || type == "hidden")\n {\n num = 1;\n }\n else if (type == "leadtime")\n {\n var leads = value.split("...");\n if (leads.length == 1)\n {\n leads[1]= leads[0];\n leads[0] = 0;\n }\n leads[0] = parseInt(leads[0], 10);\n leads[1] = parseInt(leads[1], 10);\n num = leads;\n }\n else if (type == "offsetdayofweek")\n {\n if (value.substr(0,1) == "-")\n {\n dateHash["negativeOffsetDayOfWeek"] = 1;\n value = value.substr(1);\n }\n num = parseInt(value, 10);\n }\n else if (type != "title" && type != "tag" && type != "format")\n {\n num = parseInt(value, 10);\n }\n else\n {\n title = value;\n t++;\n while (title.substr(0,1) == '"' && title.substr(title.length - 1,1) != '"' && params[t] != undefined)\n {\n title += " " + params[t++];\n }\n //Trim off the leading and trailing quotes\n if (title.substr(0,1) == "\s"" && title.substr(title.length - 1,1)== "\s"")\n {\n title = title.substr(1, title.length - 2);\n t--;\n }\n num = title;\n }\n dateHash[type] = num;\n }\n //date is synonymous with day\n if (dateHash["day"] == null)\n {\n dateHash["day"] = dateHash["date"];\n }\n return dateHash;\n};\n\n//This function finds the date specified in the reminder \n//parameters. It will return null if no match can be\n//found. This function is not intended to be used by\n//other plugins.\nwindow.findDateForReminder= function findDateForReminder( dateHash, baseDate, leadTimeLowerBound, leadTimeUpperBound)\n{\n if (baseDate == null)\n {\n baseDate = new Date().getMidnight();\n }\n var hashKey = baseDate.convertToYYYYMMDDHHMM();\n for (var k in dateHash)\n {\n hashKey += "," + k + "|" + dateHash[k];\n }\n hashKey += "," + leadTimeLowerBound.convertToYYYYMMDDHHMM();\n hashKey += "," + leadTimeUpperBound.convertToYYYYMMDDHHMM();\n if (reminderCache[hashKey] == null)\n {\n //If we don't find a match in this run, then we will\n //cache that the reminder can't be matched.\n reminderCache[hashKey] = false;\n }\n else if (reminderCache[hashKey] == false)\n {\n //We've already tried this date and failed\n return null;\n }\n else\n {\n return reminderCache[hashKey];\n }\n \n var bOffsetSpecified = dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null || \n dateHash["recurdays"] != null;\n \n // If we are matching the base date for a dayofweek offset, look for the base date a \n //little further back.\n var tmp1leadTimeLowerBound = leadTimeLowerBound; \n if ( dateHash["offsetdayofweek"] != null)\n {\n tmp1leadTimeLowerBound = leadTimeLowerBound.addDays(-6); \n }\n var matchedDate = baseDate.findMatch(dateHash, tmp1leadTimeLowerBound, leadTimeUpperBound);\n if (matchedDate != null)\n {\n var newMatchedDate = matchedDate;\n if (dateHash["recurdays"] != null)\n {\n while (newMatchedDate.getTime() < leadTimeLowerBound.getTime())\n {\n newMatchedDate = newMatchedDate.addDays(dateHash["recurdays"]);\n }\n }\n else if (dateHash["offsetyear"] != null || \n dateHash["offsetmonth"] != null || \n dateHash["offsetday"] != null || \n dateHash["offsetdayofweek"] != null)\n {\n var tmpdateHash = cloneParams(dateHash);\n tmpdateHash["year"] = dateHash["offsetyear"];\n tmpdateHash["month"] = dateHash["offsetmonth"];\n tmpdateHash["day"] = dateHash["offsetday"];\n tmpdateHash["dayofweek"] = dateHash["offsetdayofweek"];\n var tmpleadTimeLowerBound = leadTimeLowerBound;\n var tmpleadTimeUpperBound = leadTimeUpperBound;\n if (tmpdateHash["offsetdayofweek"] != null)\n {\n if (tmpdateHash["negativeOffsetDayOfWeek"] == 1)\n {\n tmpleadTimeLowerBound = matchedDate.addDays(-6);\n tmpleadTimeUpperBound = matchedDate;\n\n }\n else\n {\n tmpleadTimeLowerBound = matchedDate;\n tmpleadTimeUpperBound = matchedDate.addDays(6);\n }\n\n }\n newMatchedDate = matchedDate.findMatch(tmpdateHash, tmpleadTimeLowerBound, tmpleadTimeUpperBound);\n //The offset couldn't be matched. return null.\n if (newMatchedDate == null)\n {\n return null;\n }\n }\n if (newMatchedDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n reminderCache[hashKey] = newMatchedDate;\n return newMatchedDate;\n }\n }\n return null;\n};\n\n//This does much the same job as findDateForReminder, but\n//this one doesn't deal with offsets or recurring \n//reminders.\nDate.prototype.findMatch = function findMatch(dateHash, leadTimeLowerBound, leadTimeUpperBound)\n{\n\n var bSpecifiedYear = (dateHash["year"] != null);\n var bSpecifiedMonth = (dateHash["month"] != null);\n var bSpecifiedDay = (dateHash["day"] != null);\n var bSpecifiedDayOfWeek = (dateHash["dayofweek"] != null);\n if (bSpecifiedYear && bSpecifiedMonth && bSpecifiedDay)\n {\n return new Date(dateHash["year"], dateHash["month"]-1, dateHash["day"], 0, 0);\n }\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedDay && bSpecifiedMonth && !bSpecifiedYear && !bSpecifiedDayOfWeek)\n {\n\n //Shortcut -- First try this year. If it's too small, try next year.\n var tmpMidnight = this.getMidnight();\n var tmpDate = new Date(this.getFullYear(), dateHash["month"]-1, dateHash["day"], 0,0);\n if (tmpDate.getTime() < leadTimeLowerBound.getTime())\n {\n tmpDate = new Date((this.getFullYear() + 1), dateHash["month"]-1, dateHash["day"], 0,0);\n }\n if ( tmpDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n return tmpDate;\n }\n else\n {\n return null;\n }\n }\n\n var newDate = leadTimeLowerBound; \n while (newDate.isBetween(leadTimeLowerBound, leadTimeUpperBound))\n {\n var tmp = testDate(newDate, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek);\n if (tmp != null)\n return tmp;\n newDate = newDate.addDays(1);\n }\n};\n\nfunction testDate(testMe, dateHash, bSpecifiedYear, bSpecifiedMonth, bSpecifiedDay, bSpecifiedDayOfWeek)\n{\n var bMatchedYear = !bSpecifiedYear;\n var bMatchedMonth = !bSpecifiedMonth;\n var bMatchedDay = !bSpecifiedDay;\n var bMatchedDayOfWeek = !bSpecifiedDayOfWeek;\n if (bSpecifiedYear)\n {\n bMatchedYear = (dateHash["year"] == testMe.getFullYear());\n }\n if (bSpecifiedMonth)\n {\n bMatchedMonth = ((dateHash["month"] - 1) == testMe.getMonth() );\n }\n if (bSpecifiedDay)\n {\n bMatchedDay = (dateHash["day"] == testMe.getDate());\n }\n if (bSpecifiedDayOfWeek)\n {\n bMatchedDayOfWeek = (dateHash["dayofweek"] == testMe.getDay());\n }\n\n if (bMatchedYear && bMatchedMonth && bMatchedDay && bMatchedDayOfWeek)\n {\n return testMe;\n }\n};\n\n//Returns true if the date is in between two given dates\nDate.prototype.isBetween = function isBetween(lowerBound, upperBound)\n{\n return (this.getTime() >= lowerBound.getTime() && this.getTime() <= upperBound.getTime());\n}\n//Return a new date, with the time set to midnight (0000)\nDate.prototype.getMidnight = function getMidnight()\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0);\n};\n// Add the specified number of days to a date.\nDate.prototype.addDays = function addDays(numberOfDays)\n{\n return new Date(this.getFullYear(), this.getMonth(), this.getDate() + numberOfDays, 0, 0);\n};\n//Return the number of days between two dates.\nDate.prototype.getDifferenceInDays = function getDifferenceInDays(otherDate)\n{\n//I have to do it this way, because this way ignores daylight savings\n var tmpDate = this.addDays(0);\n if (this.getTime() > otherDate.getTime())\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() > otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(-1);\n }\n return i;\n }\n else\n {\n var i = 0;\n for (i = 0; tmpDate.getTime() < otherDate.getTime(); i++)\n {\n tmpDate = tmpDate.addDays(1);\n }\n return i * -1;\n }\n return 0;\n};\nfunction cloneParams(what) {\n var tmp = {};\n for (var i in what) {\n tmp[i] = what[i];\n }\n return tmp;\n}\n// Substitute date components into a string\nDate.prototype.formatStringDateOnly = function formatStringDateOnly(template)\n{\n template = template.replace("YYYY",this.getFullYear());\n template = template.replace("YY",String.zeroPad(this.getFullYear()-2000,2));\n template = template.replace("MMM",config.messages.dates.months[this.getMonth()]);\n template = template.replace("0MM",String.zeroPad(this.getMonth()+1,2));\n template = template.replace("MM",this.getMonth()+1);\n template = template.replace("DDD",config.messages.dates.days[this.getDay()]);\n template = template.replace("0DD",String.zeroPad(this.getDate(),2));\n template = template.replace("DD",this.getDate());\n return template;\n};\n\n//}}}
The reminder macro can take the following arguments.\n\n!!!!date syntax\n* @@{{{year:NUMBER}}}@@ - The four digit representation of the year (for example {{{year:2046}}} or {{{year:1999}}}\n* @@{{{month:NUMBER}}}@@ - The numerical representation of the month (for example {{{month:1}}} for January, {{{month:12}}} for December)\n* @@{{{day:NUMBER}}}@@ - The numerical representation of the day of the month (for example {{{day:15}}} will match the 15th day of the month)\n* @@{{{dayofweek:NUMBER}}}@@ - The numerical representation of the day of the week. Valid values are in the range of 0-6. {{{dayofweek:0}}} will match Sunday, and {{{dayofweek:6}}} will match Saturday.\n\n!!!!offsets\n* @@{{{offsetdayofweek:NUMBER}}}@@ - The numerical representation of a day of the week. Valid values are in the range of 0-6. 0 will match Sunday, and 6 will match Saturday. If offsetdayofweek is specified, the year, month, day and dayofweek will be matched as usual, and the reminder will be set to the next occurence of the day of the week specified by offsetdayofweek. For example, the first Thursday of the month can be specified as {{{day:1 offsetdayofweek:4}}} and the second Thursday can be specified as {{{day:8 offsetdayofweek4}}} If offsetdayofweek is negative, the search will be performed backward. For example, the last Thursday in August can be found by {{{month:8 day:31 offsetdayofweek:-4}}}\n* @@{{{recurdays:NUMBER}}}@@ - If recurdays is set, then the reminder will fire on the base date specified by year, month, day, and dayofweek and also every N days afterward. For example, if the reminder is specified with {{{year:2005 month:8 day:16 recurdays:2}}} it will match August 16, 18, 20, etc. Please make sure that you fully specify year, month and day in any recurring reminder.\n\n!!!!leadtime\n* @@{{{leadtime:NUMBER}}}@@ - Use this to specify when this reminder will appear in [[showReminders]]. If a reminder has a leadtime of 2, it will only show up in showReminders if it will be matched in the next two days. Likewise, a reminder with a leadtime of 60 will show up in showReminders even if showReminders has a lower leadtime. showReminders can override this behavior with the limit argument.\n\n!!!!Reminder display options\n* @@{{{title:"STRING"}}}@@ - A string used to identify this reminder when it is shown in a list of reminders. For example, {{{title:"New Year's Day"}}} or {{{title:"Elvis' Birthday"}}}. You can put standard TiddlyWiki formatting in the title.\n* @@{{{format:"STRING"}}}@@ - Use this argument to override the default string used for display. You can put standard TiddlyWiki formatting in the format. The following substitutions will be made in the string before it is displayed.\n** DIFF will be replaced with the one of the strings "Today", "Tommorrow", or "N days", where N is the number of days between now and the date of the reminder. \n** TITLE will be replaced with the title of the reminder\n** DATE will be replaced with the matched date of the reminder.\n** ANNIVERSARY will be replaced with the number of years since between the matched date and firstyear\nThe default string is "DIFF: TITLE on DATE ANNIVERSARY"\n* @@{{{firstyear:NUMBER}}}@@ - The first year that a reminder occurred, in four digit format. For example {{{firstyear:2001}}}. This is used when calculating the number of years that a reminder has happened.\n* @@{{{hidden}}}@@ - If this option is present, the reminder will not be displayed in the regular view of the tiddler. You can use this to have reminders for [[displayTiddlersWithReminders]] to find, without having the countdown appear. See [[Season's Greetings example]] for an example.\n\n
\n+++![Overdue actions >>>]\n<<showReminders leadtime:-365...-1 tag:"action !done" format:"|DATE |DIFF |TITLE |TIDDLER |">>\n===\n!Things for today, tommorow and the next day\n<<showReminders leadtime:0...3 format:"|DATE |DIFF |TITLE |TIDDLER |">>\n+++![All reminders for the next 14 days >>>]\n<<showReminders leadtime:0...13 format:"|DATE |DIFF |TITLE |TIDDLER |">>\n===\n\n[[More Reminders]]
| !2006 | !2005 |!Day |\n| 1640 | 1420 |Day 1 |\n| 1396 | 1665 |Day 2 |\n| 2346 | 2648 |Day 3 |\n| 2317 | 1774 |Day 4 |\n| 2068 | 2832 |Day 5 |\n| 2510 | 2514 |Day 6 |\n| 2650 | 2203 |Day 7 |\n| | |Day 8 |\n| | |Day 9 |
<<newerTiddler button:"Add Rennie" name:"newRennie" tags:"contact,RenFaire" template:"newContactTemplate">> :: <<newerTiddler button:"Add Merchant" name:"newMerchant" tags:"contact,Merchant" template:"newContactTemplate">> :: <<newerTiddler button:"Add Entertainer" name:"newEntertainer" tags:"contact,Entertainer" template:"newContactTemplate">>\n+++![Rennies]\n<<tiddlerList tags:"contact,RenFaire" group:"tiddler.title.substr(0,1)">>\n=== \n+++![Merchants]\n<<tiddlerList tags:"contact,Merchant" group:"tiddler.title.substr(0,1)">>\n=== \n+++![Entertainers]\n<<tiddlerList tags:"contact,Entertainer" group:"tiddler.title.substr(0,1)">>\n===
<<newerTiddler button:"Add RenFaire Event" name:"newRenFaireEvent" tags:"reminder renfaire" template:"newEventTemplate">>\n!Current\n<<showReminders leadtime:31 tag:"renfaire">>\n+++![Rest of the year]\n<<showReminders leadtime:32...365 tag:"renfaire">>\n===\n+++![Past year]\n<<showReminders leadtime:-365...-1 tag:"renfaire">>\n===
<<newReminder>>\n<<reminder year:2006 month:5 day:27 title:"RenFaireDate" >>\n<<reminder year:2006 month:5 day:28 title:"RenFaireDate" >>\n<<reminder year:2006 month:5 day:29 title:"RenFaireDate" >>\n<<reminder year:2006 month:6 day:3 title:"RenFaireDate" >>\n<<reminder year:2006 month:6 day:4 title:"RenFaireDate" >>\n<<reminder year:2006 month:6 day:10 title:"RenFaireDate" >>\n<<reminder year:2006 month:6 day:11 title:"RenFaireDate" >>
\n!Average per Day by Weekend\n| |2006|2005|Difference per day|\n|First Weekend|1518|1542.5|-24.5|\n|Second Weekend|2243.7|2211|+32.3|\n|Third Weekend|2580|2516.3|+63.7|\n|Fourth Weekend| | | |\n\nEvery weekend we get more people per day, but last year we had a 3 day weekend for our 3rd weekend.\nI think this shows that our advertising is getting out there, we just started to late too fully affect the first weekend and had bad weather on Memorial Day weekend.\n\nWe make "Night of the Pirates" happen 2nd-3rd weekend of July, start the "Win free tickets" w/businesses idea ASAP, send flyers to every school we have kids at in Sept.\nCan we do a "Win a romantic picnic at the Ren Faire" thing with Fredrick's/Victoria's/Romanticโs/Pricillaโs? Cheap basket, bottle of wine, blanket, cheese, bread and food coupons?\nUse any left over program books as advertising as it draws the eyes. By using them for advertising I mean just drop one off any where folks might be just killing time (Coffee house, doctors office, mall food court). If you only leave one it looks like someone was looking at it and left it.\n\n
<<newerTiddler button:"Create new project" name:"NewProject" tags:"project renfaire" template:"NewProjectTemplate">>\n<<tiddlerList tags:"project,renfaire" order:"-created">>\n
<<reminder day:15 offsetdayofweek:3 title:"RensDay" >>\n\nRensDay is a regularly schedualed event in which all Rennies are invited to attend and keep strong the bonds of friendship we made over the last season. We might also use this time to ==plot== plan what we will do next year.
\n|Home Phone: | |\n|Cell Phone: | 630-310-6604|\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | |\n|Address: | |\n|City, State, Zip: | Chicago, IL|\n\nBirthdate: \n\nSee: ChrisGregory\n
|Name |KathyWelsh|\n|Company |Caravan Traders |\n|E-mail | |\n|Home Phone | |\n|Cell Phone | |\n|Work Phone | |\n|Website | |\n|Notes | |\n|Other notes | |\n\nAlso see: [[Caravan Traders]]
|Home Phone: | |\n|Cell Phone: | 501-258-9223|\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | |\n|Address: | |\n|City, State, Zip: | Omaha, NE|\n\nBirthdate: \n\n
\n|Home Phone: | |\n|Cell Phone: | 636-248-0051|\n|Work Phone: | 314-468-4142|\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | |\n|Address: | |\n|City, State, Zip: | MO|\n\nBirthdate: \n\n
Service: DJ / Graphic Artist\n----\n\n|Home Phone: | 816-455-3388|\n|Cell Phone: | |\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | http://parrackstudios.com/|\n|Address: | |\n|City, State, Zip: | Kansas City, KS|\n\nBirthdate: \n
Service: Locksmith\n----\n\n|Home Phone: | |\n|Cell Phone: | 314-616-1779|\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | |\n|Address: | |\n|City, State, Zip: | St. Louis, MO|\n\nBirthdate: \n
<html>\n<style>\n.rolodex table {\nborder: 0px solid;\nbackground-color:#FFFF99;\n}\n\n.rolodex tr, .rolodex td {\nborder: 0px solid;\n}\n</style>\n<span class="rolodex">\n <table>\n <tr>\n <td align="right"><b>Service:</b></td>\n <td colspan="3"><input name=service type=text style="width:95%" /></td></tr>\n <tr>\n <td align="right"><b>Price:</b></td>\n <td colspan="3"><input name=price type=text style="width:95%" /></td></tr>\n <tr>\n</table>\n</span>\n</html>\n
!It is not his real nme, but I don't know that one.\n\n|Home Phone: | |\n|Cell Phone: | |\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | http://www.livejournal.com/users/shamusmacgrego/|\n|Address: | |\n|City, State, Zip: | Warrenton, MO|\n\nBirthdate: <<reminder month:10 day:22 title:"ShamusMacgregor B-day">>\n\n!Details:\nScotsman. Weaver.\nElectrician.\nMarried 25+ years.\n\nSee: \n
\n!Be a Sheep. Wear it.\nSheep Brand Products is proud to introduce it's new clothing line; Ewe! 2007 will be all about Ewe! What makes Ewe different? We don't just make clothes, we make Futurized Urban Garments (F.U.G). More pockets to hold all you tech toys and hidden tubes to run your wires through. We even have a human powered recharge system that will allow you to charge your iPod & cell phone while walking, running or dancing by using static electricity. Who said polyester wasn't cool!\n\nRight now we can't give our stuff away, but once we get some big name stars to wear it we know that you will all want to become Sheep and wear it as well. That is why we are currently in negotiations with some of the top names in the industry to get them to wear our products. Soon if you ask Christinia, 50 Cents, or that Hilton chick about thier clothes they will look at you and say 'F.U.G. Ewe'.\n\nOur accounting firm asked how we will be able to afford paying $1,000,000 to some big name star. The answer is really quite simple. We know that all of you future Sheep will gladly pay $20 for a t-shirt just like the one that big name star wears. Since it only cost us $1.50 to make the shirt (by employing third world child labor), and we sell it to the stores for $10 that means that we make $8.50 for every shirt. All we need to sell is 18,000 shirts and we have made our money back. Once we get them on to MTV and into WalMart we are guarenteed to sell at least 100,000.\n\nWe are also looking to team up with MySpace. That seems like such a natural market for Sheep Brand Products. \n\nOne of our other big marketing moves is to give $50 gift certificates to the head cheerleaders at all high schools in the US. Reasearch shows us that that $50 of advertising on a hawt girl's body will make us more then $1000 in sales over the next 6 months. And each one of the people who buys a shirt or pair of pants is just more advertising for us. And all of that secondary advertising is them paying us for the right to promote our product.\n\nWe are also looking at coming out with clubwear under the name ''Mii'' using the Japanese/Sony pronunciation. These will also continue the F.U.G. styling. Keep your ears open for people to be demanding 'F.U.G. Mii' in the near future.\n!Be a Sheep. Wear it.
Do you need to <<newerTiddler button:"Add a Grocery Item" name:"newGroceryItem" tags:"grocery">>? Or you could [[Click here to get your full shopping list|BuyThis]]\n----\n<<forEachTiddler where tiddler.tags.contains('grocery') sortBy '(tiddler.title.toLowerCase())' write ' "|<<toggleTag buy [["+tiddler.title+"]]$)) |" + store.getTiddlerText(tiddler.title).substr(0,40) + " |\sn"'>>\n
Do you need to <<newerTiddler button:"Add A Grocery Item" tooltip:"Just click here to add it to the list" name:"New Grocery Item?" tags:"grocery" text:"What and how many?">>?\nOr you could [[Click here to get your full shopping list|BuyThis]]\n----\n<<forEachTiddler where tiddler.tags.contains('grocery') sortBy '(tiddler.title.toLowerCase())' write ' "|<<toggleTag buy [["+tiddler.title+"]]$)) |" + store.getTiddlerText(tiddler.title).substr(0,40) + " |\sn"'>>
/***\n!Example Usage\n| Local|{{{<<showClock>>}}}|<<showClock>>|\n| Queensland|{{{<<showClock +10>>}}}|<<showClock +10>>|\n| England (DST)|{{{<<showClock +1>>}}}|<<showClock +1>>|\n| California (DST)|{{{<<showClock -7>>}}}|<<showClock -7>>|\n\n{{{<<showClock -7 myClock>>}}} or {{{<<showClock '' myClock>>}}} gives the CSS class\nmyClock instead of the default \n\n***/\n//{{{\nversion.extensions.ShowClockMacro = { major: 0, minor: 0, revision: 1, date: new Date(2006,7,12),\n source: "http://tiddlyspot.com/timezones/#ShowClockMacro"\n};\n\nconfig.macros.showClock = {\n\n defaultClass: 'clock',\n tickDelay: 1000, \n format: "0hh:0mm:0ss",\n\n styles: \n ".clock {\sn"+\n " padding:0 0.5em;\sn"+\n "}\sn" +\n ".clock .dow { color:#000; }\sn" +\n ".clock .time { color:#000; }\sn" +\n ".clock .offset { color:#999; }\sn" +\n "",\n\n count: 0,\n\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var offset = params[0] || '';\n var useClass = params[1] || this.defaultClass;\n var c = this.count++;\n var clockElement = createTiddlyElement(place, "span", "clock" + c, useClass);\n clockElement.setAttribute("offset",offset);\n this.refreshDisplay(c);\n this.waitForTick(c);\n },\n\n waitForTick: function(c) {\n setTimeout("config.macros.showClock.tick(" + c + ")", this.tickDelay);\n },\n\n tick: function(c) {\n if (this.stillHere(c)) {\n this.refreshDisplay(c)\n this.waitForTick(c);\n }\n },\n\n getClock: function(c) {\n return document.getElementById("clock" + c);\n },\n\n stillHere: function(c) {\n return this.getClock(c) != null;\n },\n\n refreshDisplay: function(c) {\n var clock = this.getClock(c);\n var offset = clock.getAttribute("offset");\n var now = new Date();\n //var label = "local";\n var label = "";\n if (offset && offset != '') {\n var offsetInt = parseInt(offset);\n now.setHours(now.getHours() + (now.getTimezoneOffset() / 60) + offsetInt);\n label = "GMT " + (offsetInt == 0 ? "" : offsetInt > 0 ? "+"+offsetInt : offsetInt);\n }\n clock.innerHTML =\n '<span class="dow">' + now.formatString("DDD").substr(0,3) + ' </span>' +\n '<span class="time">' + now.formatString(this.format) + '</span>' + \n '<span class="offset"> ' + label + '</span>'\n }\n\n};\n\nsetStylesheet(config.macros.showClock.styles,"showClockStyles");\n\n//}}}\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<upload http://tiddlyspot.com/BrainDump/store.php index.html . . BrainDump>><<option txtUserName>>\n<<option pasUploadPassword>> >><<slider chkSliderOptionsPanel OptionsPanel 'options ยป' 'Change TiddlyWiki advanced options'>><<slider chkSliderTimeline SideBarTabs 'tabs ยป' 'Show timeline and other tabs'>>
The place I try to hold it together
BrainDump
http://tiddlyspot.com/BrainDump/
The following items are tagged for indefinite future action, using the configuration-specified "someday" context. Note that items here should ''not'' be actions or projects, but rather generic tiddlers with whatever supporting content is appropriate.\n\n<<list tagged txtGTDSomedayContext any>>\n
config.macros.sortit = {}\nconfig.macros.sortit.handler = function(place,macroName,params,wikifier,paramString,callingTiddler){\n var tableId = params[0];\nif (document.getElementById(tableId))\n{config.macros.sortableGridPlugin.ts_makeSortable(document.getElementById(tableId))}\n}
// Begin SORTABLE.JS//\n// This Code is://\n// Code downloaded from the Browser Experiments section of kryogenix.org is licenced under the so-called MIT licence. The license is below.//\n////\n// Copyright (c) 1997-date Stuart Langridge//\n////\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this //\n// software and associated documentation files (the "Software"), to deal in the Software //\n// without restriction, including without limitation the rights to use, copy, modify, merge, //\n// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons //\n// to whom the Software is furnished to do so, subject to the following conditions://\n////\n// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, //\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR //\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE //\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR //\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER //\n// DEALINGS IN THE SOFTWARE.//\n// //\n// //\n// Modified under the same aforementioned terms by Demian Johnston, 2006//\n/*\n! Test Cases\nSortable\nGrid requires the header row to be marked "|h"\n\n|Name |Salary|Extension |Start date|h\n|Bloggs, Fred |$12000.00 |1353|08/19/2003|\n|Bloggs, Fred |$12000.00 |1353|09/18/2003|\n|Bloggs, Fred |$12000.00 |1353|08/18/2003|\n|Bloggs, Fred |$12000.00 |1353|07/18/2003|\n|Bloggs, Fred |$12000.00 |1353|08/17/2003|\n|Turvey, Kevin |$191200.00 |2342 |02/05/1979|\n|Mbogo, Arnold |$32010.12 |2755 |09/08/1998|\n|Shakespeare, Bill |$122000.00|3211 |12/11/1961|\n|Shakespeare, Hamnet |$9000 |9005|01/01/2002|\n|Fitz, Marvin |$3300 |5554 |05/22/1995|\n\nUnsortableGrid (doesn't mark header row)\n\n|Name |Salary|Extension |Start date|\n|Bloggs, Fred |$12000.00 |1353|08/19/2003|\n|Bloggs, Fred |$12000.00 |1353|09/18/2003|\n|Bloggs, Fred |$12000.00 |1353|08/18/2003|\n|Bloggs, Fred |$12000.00 |1353|07/18/2003|\n|Bloggs, Fred |$12000.00 |1353|08/17/2003|\n|Turvey, Kevin |$191200.00 |2342 |02/05/1979|\n|Mbogo, Arnold |$32010.12 |2755 |09/08/1998|\n|Shakespeare, Bill |$122000.00|3211 |12/11/1961|\n|Shakespeare, Hamnet |$9000 |9005|01/01/2002|\n|Fitz, Marvin |$3300 |5554 |05/22/1995|\n\nCredit to Stuart Langridge,November 2003\nhttp://www.kryogenix.org/code/browser/sorttable/\n*/\n//{{{\nversion.extensions.sortableGrid= {major: 1, minor: 0, revision: 0, date: new Date(2006,2,14)};\n//}}}\n//{{{\nconfig.macros.sortableGridPlugin = {SORT_COLUMN_INDEX: 0};\n\nconfig.macros.sortableGridPlugin.ts_makeSortable=function(table) {\n var firstRow;\n if (table.rows && table.rows.length > 0) {\n 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 = config.macros.sortableGridPlugin.ts_getInnerText(cell);\n cell.innerHTML = '<a href="#" class="sortheader" onclick="config.macros.sortableGridPlugin.ts_resortTable(this);return false;">'+txt+'<span class="sortarrow"> </span></a>';\n }\n};\n//}}}\n\n//{{{\nconfig.macros.sortableGridPlugin.ts_getInnerText=function(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 += config.macros.sortableGridPlugin.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\nconfig.macros.sortableGridPlugin.getParent=function(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 config.macros.sortableGridPlugin.getParent(el.parentNode, pTagName);\n};\n//}}}\n\n//{{{\nconfig.macros.sortableGridPlugin.ts_resortTable=function(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 td = lnk.parentNode;\n var column = td.cellIndex;\n var table = config.macros.sortableGridPlugin.getParent(td,'TABLE');\n \n // Work out a type for the column\n if (table.rows.length <= 1) return;\n var itm = config.macros.sortableGridPlugin.ts_getInnerText(table.rows[1].cells[column]);\n var sortfn = config.macros.sortableGridPlugin.ts_sort_caseinsensitive;\n if (itm.match(/^\sd\sd[\s/-]\sd\sd[\s/-]\sd\sd\sd\sd$/)) sortfn = config.macros.sortableGridPlugin.ts_sort_date;\n if (itm.match(/^\sd\sd[\s/-]\sd\sd[\s/-]\sd\sd$/)) sortfn = config.macros.sortableGridPlugin.ts_sort_date;\n if (itm.match(/^[?$]/)) sortfn = config.macros.sortableGridPlugin.ts_sort_currency;\n if (itm.match(/^[\sd\s.]+$/)) sortfn = config.macros.sortableGridPlugin.ts_sort_numeric;\n config.macros.sortableGridPlugin.SORT_COLUMN_INDEX = column;\n var firstRow = new Array();\n var newRows = new Array();\n for (var i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }\n for (var j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }\n\n newRows.sort(sortfn);\n var ARROW;\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 ( ci=0;ci<allspans.length;ci++) {\n if (allspans[ci].className == 'sortarrow') {\n if (config.macros.sortableGridPlugin.getParent(allspans[ci],"table") == config.macros.sortableGridPlugin.getParent(lnk,"table")) { // in the same table as us?\n allspans[ci].innerHTML = ' ';\n }\n }\n }\n \n span.innerHTML = ARROW;\n};\n//}}}\n\n//{{{\n config.macros.sortableGridPlugin.ts_sort_date=function(a,b) {\n // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX\n var mmdd=1; // US Mode (set to 0) for dd/mm/yyyy\n\n var aa = config.macros.sortableGridPlugin.ts_getInnerText(a.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]);\n var bb = config.macros.sortableGridPlugin.ts_getInnerText(b.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]);\n var dt1;\n var dt2;\n var yr;\n if (aa.length == 10) {\n if (mmdd)\n dt1 = aa.substr(6,4)+aa.substr(0,2)+aa.substr(3,2);\n else\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 if (mmdd)\n dt1 = yr+aa.substr(0,2)+aa.substr(3,2);\n else\n dt1 = yr+aa.substr(3,2)+aa.substr(0,2);\n }\n if (bb.length == 10) {\n if (mmdd)\n dt2 = bb.substr(6,4)+bb.substr(0,2)+bb.substr(3,2);\n else\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 if (mmdd)\n dt2 = yr+bb.substr(0,2)+bb.substr(3,2);\n else\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\n config.macros.sortableGridPlugin.ts_sort_currency=function(a,b) { \n var aa = config.macros.sortableGridPlugin.ts_getInnerText(a.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n var bb = config.macros.sortableGridPlugin.ts_getInnerText(b.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');\n return parseFloat(aa) - parseFloat(bb);\n};\n\n config.macros.sortableGridPlugin.ts_sort_numeric=function(a,b) { \n var aa = parseFloat(config.macros.sortableGridPlugin.ts_getInnerText(a.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]));\n if (isNaN(aa)) aa = 0;\n var bb = parseFloat(config.macros.sortableGridPlugin.ts_getInnerText(b.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX])); \n if (isNaN(bb)) bb = 0;\n return aa-bb;\n};\n\n config.macros.sortableGridPlugin.ts_sort_caseinsensitive=function(a,b) {\n var aa = config.macros.sortableGridPlugin.ts_getInnerText(a.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]).toLowerCase();\n var bb = config.macros.sortableGridPlugin.ts_getInnerText(b.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]).toLowerCase();\n if (aa==bb) return 0;\n if (aa<bb) return -1;\n return 1;\n};\n\n config.macros.sortableGridPlugin.ts_sort_default=function(a,b) {\n var aa = config.macros.sortableGridPlugin.ts_getInnerText(a.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]);\n var bb = config.macros.sortableGridPlugin.ts_getInnerText(b.cells[config.macros.sortableGridPlugin.SORT_COLUMN_INDEX]);\n if (aa==bb) return 0;\n if (aa<bb) return -1;\n return 1;\n};\n//}}}\n\n// end Code downloaded from the Browser Experiments section of kryogenix.org is licenced under the so-called MIT licence. The license is below.//\n// //\n// end Copyright (c) 1997-date Stuart Langridge//\n// END SORTABLE.JS//\n\n\n\n//{{{\nconfig.formatters[0].handler=function(w)\n {\n var table = createTiddlyElement(w.output,"table");\n w.nextMatch = w.matchStart;\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n var currRowType = null, nextRowType;\n var rowContainer, rowElement;\n var prevColumns = [];\n var rowCount = 0;\n var want_sortable=0;\n do {\n lookaheadRegExp.lastIndex = w.nextMatch;\n var lookaheadMatch = lookaheadRegExp.exec(w.source);\n var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;\n if(matched)\n {\n nextRowType = lookaheadMatch[2];\nif(nextRowType == "k")\n {\n table.className = lookaheadMatch[1];\n w.nextMatch += lookaheadMatch[0].length+1;\n continue;\n }\n if(nextRowType != currRowType)\n rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);\n currRowType = nextRowType;\n if(currRowType == "c")\n {\n if(rowCount == 0)\n rowContainer.setAttribute("align","top");\n else\n rowContainer.setAttribute("align","bottom");\n w.nextMatch = w.nextMatch + 1;\n w.subWikify(rowContainer,this.rowTerminator);\n table.insertBefore(rowContainer,table.firstChild);\n }\n else\n {\n var rowClass = (rowCount & 1) ? "oddRow" : "evenRow";\n rowElement = createTiddlyElement(rowContainer,"tr",null,rowClass);\n this.rowHandler(w,rowElement,prevColumns);\n }\n if(currRowType == "h") {\n want_sortable=1;\n }\n rowCount++;\n }\n } while(matched);\n if (want_sortable) {\n table.setAttribute("class","sortable");\n config.macros.sortableGridPlugin.ts_makeSortable(table);\n }\n };\n\n//}}}
/***\n\n''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''\n\n|Name|SplashScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#SplashScreenPlugin|\n|Version|0.2 |\n|Requires|~TW2.08+|\n!Description:\nProvides a simple splash screen that is visible while the TW is loading.\n\n!Installation\nCopy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.\n\n!Customizing\nOnce the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.\n\n!History\n* 26-06-06 : version 0.2, first release\n\n!Code\n***/\n//{{{\nvar old_lewcid_splash_restart=restart;\n\nrestart = function()\n{ if (document.getElementById("SplashScreen"))\n document.getElementById("SplashScreen").style.display = "none";\n \n old_lewcid_splash_restart();\n \n if (splashScreenInstall)\n {if(config.options.chkAutoSave)\n {saveChanges();}\n displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");\n }\n}\n\n\nvar oldText = store.getTiddlerText("MarkupPreHead");\nif (oldText.indexOf("SplashScreen")==-1)\n {var siteTitle = store.getTiddlerText("SiteTitle");\n var splasher='\sn\sn<div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';\n if (! store.tiddlerExists("MarkupPreHead"))\n {var myTiddler = store.createTiddler("MarkupPreHead");}\n else\n {var myTiddler = store.getTiddler("MarkupPreHead");}\n myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);\n store.setDirty(true);\n var splashScreenInstall = true;\n}\n//}}}
When: Sat & Sun, May 20 - June 11, 2006, including Memorial Day\nWhere: Rotary Park, Wentzville, MO 45 Min from Downtown St. Louis!\nIt's your best chance to step into an era when Kings ruled, Knights defended! Don't miss this great opportunity!\n\nhttp://www.stlrenfaire.com\n\nSee: RenFaireOffice DougGlenn MidWintersBall
[[Greater St.Louis Rennasaince Faire|http://stlrenfaire.com]]\n<<reminder date:18 month:5 year:2007 title:"StLouisRenFaire Kids Day">>\n<<reminder date:19 month:5 year:2007 title:"StLouisRenFaire">>\n<<reminder date:20 month:5 year:2007 title:"StLouisRenFaire">>\n<<reminder date:21 month:5 year:2007 title:"StLouisRenFaire Kids Day">>\n<<reminder date:26 month:5 year:2007 title:"StLouisRenFaire">>\n<<reminder date:27 month:5 year:2007 title:"StLouisRenFaire">>\n<<reminder date:28 month:5 year:2007 title:"StLouisRenFaire">>\n<<reminder date:2 month:6 year:2007 title:"StLouisRenFaire">>\n<<reminder date:3 month:6 year:2007 title:"StLouisRenFaire">>\n<<reminder date:9 month:6 year:2007 title:"StLouisRenFaire">>\n<<reminder date:10 month:6 year:2007 title:"StLouisRenFaire">>\n\n\n
Taking the boy to school today and once again he was planning on gettting there at the last minute. Mind you he always fears being late but doesn't plan to leave till the last minute.\n\nOn the ride back home I came up with the following:\n{{{\nIf EstimatedTravelTime < 2.5 hours\n then StressFreeTravelTime = EstimatedTravelTime + 0.25 hour (15 minutes)\n else StressFreeTravelTime = EstimatedTravelTime * 1.1 (add 10%)\n\nIn Excel: =IF(b2<2.5,b2+0.25,b26*1.1)\nb2 is the cell where estmated travel time is entered\n}}}\n\nGive it a try and see if it doesn't help in your life. What is the worst that happens? You get there a little early?
\n!Everything should be handicap accessable. \nIn therory this makes perfect sense, in reality it is stupidity. \n\nIf you take a blind man and place him in a museum where everything is behind glass, what does he get out of it? Not much. \n\nCan Stephen Hawkings go moutain climing? Unless someone is going to strap him to their back, no. \n\nDo I need a ADA compliant ramp (8.3% incline or 1:12) for a booth that is on a hill that is 15%-20%+ incline. Damn skippy I do. Sure we get a couple of folks in wheelchairs out there (One is 500lbs+ and I am not sure he fits in a 3 foot wide passage way), but the real reason is we get lots of families out there with strollers, and we want them to come in and buy.
/***\nCosmetic fixes that probably should be included in a future TW...\n***/\n/*{{{*/\n.viewer .listTitle { list-style-type:none; margin-left:-2em; }\n.editorFooter .button { padding-top: 0px; padding-bottom:0px; }\n/*}}}*/\n/***\n\n/***\nClint's fix for weird IE behaviours\n***/\n/*{{{*/\nbody {position:static;}\n.tagClear{margin-top:1em;clear:both;}\n/*}}}*/\n/***\nJust colours, fonts, tweaks etc. See SideBarWhiteAndGrey\n***/\n/*{{{*/\n/* not required, but the menu looks a whole lot nicer flushed left */\n#mainMenu { text-align: left; border-right: 1px solid #ffbf00;}\n/* make input fields in viewer (options) show up in correct size */\n.viewer input { font-size: 0.9em; }\n.viewer hr {\n border: 0;\n border-top: solid 1px #999;\n color: #666;\n}\n/*}}}*/\n/***\n!Personal preferences\n***/\n/*{{{*/\n/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */ \nnoscript {display:none;} \n\n#adsense {\n margin: 1em 15.7em 0em 1em; border:1px solid #ddd;\n background:#f8f8f8; text-align:center; margin-bottom:1em;\n overflow:hidden;padding:0.5em;} \n\n/*}}}*/\n/***\n!Headers\n***/\n/*{{{*/\n.h1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n margin-bottom: 0.4em;\n margin-top: 0.4em;\n background:#ffbf00;\n border: #000 solid 1px;\n}\n/*}}}*/\n/***\n!tagCloud\n***/\n/*{{{*/\n.tagCloud span {height: 1.5em; margin: 3px; color:red}\n.tagCloud1 {font-size: .7em; color:red}\n.tagCloud2 {font-size: .8em; color:red}\n.tagCloud3 {font-size: .9em; color:red}\n.tagCloud4 {font-size: 1.0em; color:red}\n.tagCloud5 {font-size: 1.1em; color:red}\n/*}}}*/\n/***\n!breadCrumb\n***/\n/*{{{*/\n#breadCrumb {\n margin-bottom: 1em;\n visibility: visible;\n}\n.crumbArea {\n visibility: visible;\n}\n/*}}}*/\n/***\n!BottomMenu\n***/\n/*{{{*/\n#bottomMenu {\n text-align: center;\n line-height: 1.1em;\n border-top: 1px solid #ffbf00;\n margin-top: 2em;\n}\n#bottomMenu .button{\n border: 1px #000 solid;\n background: #ffbf00;\n margin-right: 0.1em;\n padding: 2px;\n}\n/*}}}*/\n/***\n!Calendar Styles\n***/\n/*{{{*/\n.calendar, .calendar table, .calendar th, .calendar tr, .calendar td { font-size:10pt; text-align:center; } \n.calendar { margin:0px !important; }\n.calendar .weekendbg {#11eebb;}\n.calendar th {background: #111;}\n.calendar.holidaybg {#ffc0c0;}\n\n/*}}}*/\n\n/*{{{*/\n/* for testing clint's new formatter. eg {{red{asdfaf}}} */\n.red { color:white; background:red; display:block; padding:1em; } \n\n/* FF doesn't need this. but IE seems to want to make first one white */\n.txtMainTab .tabset { background:#eee; }\n.txtMoreTab .tabset { background:transparent; }\n\n/*}}}*/\n
/***\n!Colors Used\n*@@bgcolor(#8cf): #8cf - Background blue@@\n*@@bgcolor(#18f): #18f - Top blue@@\n*@@bgcolor(#04b): #04b - Mid blue@@\n*@@bgcolor(#014):color(#fff): #014 - Bottom blue@@\n*@@bgcolor(#ffc): #ffc - Bright yellow@@\n*@@bgcolor(#fe8): #fe8 - Highlight yellow@@\n*@@bgcolor(#db4): #db4 - Background yellow@@\n*@@bgcolor(#841): #841 - Border yellow@@\n*@@bgcolor(#703):color(#fff): #703 - Title red@@\n*@@bgcolor(#866): #866 - Subtitle grey@@\n*@@bgcolor(#ffbf00): #ffbf00 - Gold@@ \n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n background: #eee;\n color: #000;\n}\n\na{\n color: #04b;\n}\n\na:hover{\n background: #04b;\n color: #fff;\n}\n\na img{\n border: 0;\n}\n\nh1,h2,h3,h4,h5 {\n color: #703;\n background: #8cf;\n}\n\n.button {\n color: #014;\n border: 1px solid #fff;\n}\n\n.button:hover {\n color: #014;\n background: #fe8;\n border-color: #db4;\n}\n\n.button:active {\n color: #fff;\n background: #db4;\n border: 1px solid #841;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n.header {\n background: #04b;\n border-bottom: 3px solid #ffbf00;\n}\n\n.headerShadow {\n color: #703;\n}\n\n.headerShadow a {\n font-weight: normal;\n color: #703;\n}\n\n.headerForeground {\n color: #ffbf00;\n}\n\n.headerForeground a {\n font-weight: normal;\n color: #8cf;\n}\n\n/*}}}*/\n/***\n!General tabs /%=================================================%/\n***/\n/*{{{*/\n\n.tabSelected{\n color: #014;\n background: #eee;\n border-left: 1px solid #ccc;\n border-top: 1px solid #ccc;\n border-right: 1px solid #ccc;\n}\n\n.tabUnselected {\n color: #fff;\n background: #999;\n}\n\n.tabContents {\n color: #014;\n background: #eee;\n border: 1px solid #ccc;\n}\n\n.tabContents .button {\n border: 0;}\n\n/*}}}*/\n/***\n!Sidebar options /%=================================================%/\n~TiddlyLinks and buttons are treated identically in the sidebar and slider panel\n***/\n/*{{{*/\n#sidebar {\n}\n\n#sidebarOptions input {\n border: 1px solid #04b;\n}\n\n#sidebarOptions .sliderPanel {\n background: #8cf;\n}\n\n#sidebarOptions .sliderPanel a {\n border: none;\n color: #04b;\n}\n\n#sidebarOptions .sliderPanel a:hover {\n color: #fff;\n background: #04b;\n}\n\n#sidebarOptions .sliderPanel a:active {\n color: #04b;\n background: #fff;\n}\n/*}}}*/\n/***\n!Message Area /%=================================================%/\n***/\n/*{{{*/\n#messageArea {\n border: 1px solid #841;\n background: #db4;\n color: #014;\n}\n\n#messageArea .button {\n padding: 0.2em 0.2em 0.2em 0.2em;\n color: #014;\n background: #fff;\n}\n\n/*}}}*/\n/***\n!Popup /%=================================================%/\n***/\n/*{{{*/\n.popup {\n background: #18f;\n border: 1px solid #04b;\n}\n\n.popup hr {\n color: #014;\n background: #014;\n border-bottom: 1px;\n}\n\n.popup li.disabled {\n color: #04b;\n}\n\n.popup li a, .popup li a:visited {\n color: #eee;\n border: none;\n}\n\n.popup li a:hover {\n background: #014;\n color: #fff;\n border: none;\n}\n/*}}}*/\n/***\n!Tiddler Display /%=================================================%/\n***/\n/*{{{*/\n.tiddler .defaultCommand {\n font-weight: bold;\n}\n\n.shadow .title {\n color: #866;\n}\n\n.title {\n color: #703;\n}\n\n.subtitle {\n color: #866;\n}\n\n.toolbar {\n color: #04b;\n}\n\n.tagging, .tagged {\n border: 1px solid #eee;\n background-color: #eee;\n}\n\n.selected .tagging, .selected .tagged {\n background-color: #ddd;\n border: 1px solid #bbb;\n}\n\n.tagging .listTitle, .tagged .listTitle {\n color: #014;\n}\n\n.tagging .button, .tagged .button {\n border: none;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selected .footer {\n color: #888;\n}\n\n.sparkline {\n background: #8cf;\n border: 0;\n}\n\n.sparktick {\n background: #014;\n}\n\n.errorButton {\n color: #ff0;\n background: #f00;\n}\n\n.cascade {\n background: #eef;\n color: #aac;\n border: 1px solid #aac;\n}\n\n.imageLink, #displayArea .imageLink {\n background: transparent;\n}\n\n/*}}}*/\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n\n.viewer .listTitle {list-style-type: none; margin-left: -2em;}\n\n.viewer .button {\n border: 1px solid #db4;\n}\n\n.viewer blockquote {\n border-left: 3px solid #666;\n}\n\n.viewer table {\n border: 2px solid #333;\n}\n\n.viewer th, thead td {\n background: #db4;\n border: 1px solid #666;\n color: #fff;\n}\n\n.viewer td, .viewer tr {\n border: 1px solid #666;\n}\n\n.viewer pre {\n border: 1px solid #fe8;\n background: #ffc;\n}\n\n.viewer code {\n color: #703;\n}\n\n.viewer hr {\n border: 0;\n border-top: dashed 1px #666;\n color: #666;\n}\n\n.highlight, .marked {\n background: #fe8;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor input {\n border: 1px solid #04b;\n}\n\n.editor textarea {\n border: 1px solid #04b;\n width: 100%;\n}\n\n.editorFooter {\n color: #aaa;\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: .9em 0em 1em 1em;\n left: -2px;\n top: -2px;\n}\n\n.headerForeground {\n position: absolute;\n padding: .9em 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: visible;\n margin-bottom: 4px;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.toolbar .button{\n border: 1px #000 solid;\n background: #ffbf00;\n margin-right: 0.1em;\n}\n\n.tiddler {\n padding: 1em 1em 1em 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 {\n padding-top: 0px; \n padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\n padding: 0;\n margin: 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/*}}}*/
/***\n''Name:'' TWUpdate\n''Author:'' Tom Otvos\n''Version:'' 1.0\n\n***/\n//{{{\n\nversion.extensions.twupdate = {major: 1, minor: 0, revision: 0, date: new Date(2006,4,23,0,0,0,0), source: "http://www.dcubed.ca/"};\n\nconfig.macros.twupdate = { \n label: "update",\n sourceUrl: "http://www.tiddlywiki.com/empty.html", \n lingo: {\n prompt: "Update this TiddlyWiki from TiddlyWiki.com", \n warning: "Are you sure you want to update this document with the latest version of TiddlyWiki (and do you know that all your plugins are compatible)?\sn\snIf you want to continue, your document will first be saved with a backup.",\n success: "Update was successful. Click on 'OK' to reload the document",\n errNoHttp: "Unable to allocate an HTTP request object for the update",\n errIncompatible: "This version of TiddlyWiki cannot be updated by this plugin. Sorry.",\n progressLoading: "Getting update from TiddlyWiki.com...",\n progressLoadSuccess: "File successfully loaded",\n progressLoadFailure: "File was not loaded successfully (%0)",\n progressMerging: "Merging with existing document..."\n }\n}\n\nconfig.macros.twupdate.handler = function(place,macroName,params)\n{\n if(!readOnly) {\n var label = params[0] ? params[0] : this.label;\n createTiddlyButton(place, label, this.lingo.prompt, this.onClick, null, null, null);\n }\n}\n\nconfig.macros.twupdate.onClick = function(e)\n{\n if (version.major != 2 || version.minor != 0 || version.revision < 7) {\n alert(config.macros.twupdate.lingo.errIncompatible);\n return;\n }\n \n if (!confirm(config.macros.twupdate.lingo.warning)) return;\n\n try {\n // force a save with backup\n var saveBackups = config.options.chkSaveBackups;\n config.options.chkSaveBackups = true;\n saveChanges();\n config.options.chkSaveBackups = saveBackups;\n \n var ajax = new AjaxHelper();\n displayMessage(config.macros.twupdate.lingo.progressLoading);\n ajax.getText(config.macros.twupdate.sourceUrl, config.macros.twupdate.performUpdate); \n }\n catch (e) {\n alert(e);\n }\n\n return false;\n}\n\n// Courtesy of http://www.worldtimzone.com/res/encode/...\nfunction utf8(wide) {\n var c, s;\n var enc = "";\n var i = 0;\n while(i<wide.length) {\n c= wide.charCodeAt(i++);\n // handle UTF-16 surrogates\n if (c>=0xDC00 && c<0xE000) continue;\n if (c>=0xD800 && c<0xDC00) {\n if (i>=wide.length) continue;\n s= wide.charCodeAt(i++);\n if (s<0xDC00 || c>=0xDE00) continue;\n c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;\n }\n // output value\n if (c<0x80) enc += String.fromCharCode(c);\n else if (c<0x800) enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));\n else if (c<0x10000) enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));\n else enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F));\n }\n return enc;\n}\n\nconfig.macros.twupdate.performUpdate = function(emptyHtml, status, statusText)\n{\n // note that this is begin called from a callback from an event handler, so\n // "this" is most definitely not defined!\n \n if (status == 200)\n displayMessage(config.macros.twupdate.lingo.progressLoadSuccess);\n else {\n displayMessage(config.macros.twupdate.lingo.progressLoadFailure.format([statusText]));\n return;\n }\n displayMessage(config.macros.twupdate.lingo.progressMerging);\n \n // very important...convert the response to UTF-8 to be fully TW-compatible\n var re = /[^\su0000-\su007F]/g ;\n emptyHtml = emptyHtml.replace(re, function($0) {return(utf8($0));});\n \n // the bulk of this is cribbed from saveChanges()...\n var originalPath = document.location.toString();\n // Check we were loaded from a file URL\n if (originalPath.substr(0,5) != "file:") {\n alert(config.messages.notFileUrlError);\n if (store.tiddlerExists(config.messages.saveInstructions))\n displayTiddler(null,config.messages.saveInstructions);\n return;\n }\n var localPath = getLocalPath(originalPath);\n\n // Locate the storeArea div's\n var posOpeningDiv = emptyHtml.indexOf(startSaveArea);\n var posClosingDiv = emptyHtml.lastIndexOf(endSaveArea);\n if ((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n alert(config.messages.invalidFileError.format(['empty.html']));\n return;\n }\n\n // Save new file\n var revised = emptyHtml.substr(0,posOpeningDiv + startSaveArea.length) + \n convertUnicodeToUTF8(allTiddlersAsHtml()) + "\sn\st\st" +\n emptyHtml.substr(posClosingDiv);\n var newSiteTitle = convertUnicodeToUTF8((wikifyPlain("SiteTitle") + " - " + wikifyPlain("SiteSubtitle")).htmlEncode());\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n var save = saveFile(localPath, revised);\n if (save) {\n displayMessage(config.messages.mainSaved, "file://" + localPath);\n store.setDirty(false);\n alert(config.macros.twupdate.lingo.success);\n document.location.reload();\n }\n else\n alert(config.messages.mainFailed);\n}\n\nfunction AjaxHelper()\n{\n this.http = null;\n \n try\n {\n this.http = new XMLHttpRequest()\n }\n \n catch(e)\n {\n // if we don't get an internal object, try allocating it using ActiveX, with successive\n // fallbacks to earlier MSXML versions as necessary\n try\n {\n this.http = new ActiveXObject("Msxml2.XMLHTTP.4.0")\n } \n catch(e) \n {\n try\n {\n this.http = new ActiveXObject("MSXML2.XMLHTTP")\n } \n catch(e) \n {\n try\n {\n this.http = new ActiveXObject("Microsoft.XMLHTTP")\n } \n catch(e) \n {\n this.http = null\n }\n }\n }\n }\n \n if (!this.http) throw 'Unable to allocate an HTTP request object';\n}\n\nAjaxHelper.prototype.getText = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("GET", url, callback, async, true, false);\n}\n\nAjaxHelper.prototype.getXML = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("GET", url, callback, async, true, true);\n}\n\nAjaxHelper.prototype.getHead = function(url, callback, async, force)\n{\n if (!this.http) return;\n if (async == undefined) async = true;\n if (force == undefined) force = false;\n // ??? right now, we are not handling "forced" requests\n this._request("HEAD", url, callback, async, false, false);\n}\n\nAjaxHelper.prototype.abort = function()\n{\n if (this.http) this.http.abort();\n}\n\nAjaxHelper.prototype.setRequestHeader = function(name, value)\n{\n if (this.http) this.http.setRequestHeader(name, value);\n}\n\nAjaxHelper.prototype._request = function(method, url, callback, async, hasResponse, hasResponseXML)\n{\n if (!this.http) return;\n \n // get reference to request object so we can use it in closure\n var xmlHttp = this.http, helper = this;\n xmlHttp.onreadystatechange = function()\n {\n if (!async) return;\n if (xmlHttp.readyState == 4)\n callback((hasResponse ? (hasResponseXML ? xmlHttp.responseXML : xmlHttp.responseText) : null), xmlHttp.status, xmlHttp.statusText, helper._parsedResponseHeaders());\n }\n \n try {\n // need some cross-domain privileges for Firefox\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n } \n catch (e) \n {\n }\n \n xmlHttp.open(method, url, async);\n xmlHttp.send(null);\n if (!async) callback((hasResponse ? (hasResponseXML ? xmlHttp.responseXML : xmlHttp.responseText) : null), xmlHttp.status, xmlHttp.statusText, this._parsedResponseHeaders());\n }\n \n catch (e)\n {\n alert(e);\n }\n}\n\nAjaxHelper.prototype._parsedResponseHeaders = function()\n{\n if (this.http) {\n var headersArray = new Array();\n var headers = this.http.getAllResponseHeaders().split("\sn");\n for (var i = 0; i < headers.length; i++) {\n var h = headers[i].trim();\n if (h.length == 0) continue;\n // value can have ':' so do not use split here!\n var sep = h.indexOf(':');\n headersArray[h.substring(0, sep).trim()] = h.substr(sep + 1).trim();\n }\n return headersArray;\n }\n else\n return null;\n}\n\n//}}}\n
+++[Timeline]\n<<timeline>>\n===
/***\n''Plugin:'' Tag Cloud Macro\n''Author:'' Clint Checketts\n''Source URL:''\n\n!Usage\n<<tagCloud>>\n\n!Code\n***/\n//{{{\nversion.extensions.tagCloud = {major: 1, minor: 0 , revision: 0, date: new Date(2006,2,04)};\n//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman\n\nconfig.macros.tagCloud = {\n noTags: "No tag cloud created because there are no tags.",\n tooltip: "%1 tiddlers tagged with '%0'"\n};\n\nconfig.macros.tagCloud.handler = function(place,macroName,params) {\n \nvar tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);\n\nvar tags = store.getTags();\nfor (var t=0; t<tags.length; t++) {\n for (var p=0;p<params.length; p++) if (tags[t][0] == params[p]) tags[t][0] = "";\n}\n\n if(tags.length == 0) \n createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);\n //Findout the maximum number of tags\n var mostTags = 0;\n for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n if (tags[t][1] > mostTags) mostTags = tags[t][1];\n }\n //divide the mostTags into 4 segments for the 4 different tagCloud sizes\n var tagSegment = mostTags / 4;\n\n for (var t=0; t<tags.length; t++) if (tags[t][0].length > 0){\n var tagCloudElement = createTiddlyElement(tagCloudWrapper,"span",null,null,null);\n tagCloudWrapper.appendChild(document.createTextNode(" "));\n var theTag = createTiddlyButton(tagCloudElement,tags[t][0],this.tooltip.format(tags[t]),onClickTag,"tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1));\n theTag.setAttribute("tag",tags[t][0]);\n }\n\n};\n\nsetStylesheet(".tagCloud span{height: 1.8em;margin: 3px;}.tagCloud1{font-size: 1.2em;}.tagCloud2{font-size: 1.4em;}.tagCloud3{font-size: 1.6em;}.tagCloud4{font-size: 1.8em;}.tagCloud5{font-size: 1.8em;font-weight: bold;}","tagCloudsStyles");\n//}}}
\n|Home Phone: | |\n|Cell Phone: | |\n|Work Phone: | |\n|E-mail: | <<email TDuncan252 at aol dot com>>|\n|IM Handle: | |\n|Website: | |\n|Address: | |\n|City, State, Zip: | MO|\n\nBirthdate: <<reminder month:1 day:1 title="fake">>\n\n!Details:\nVollunteer Coordinator at Fare.\n\nSee: \n
by Lao-tzu \ntranslation by S. Mitchell \n\n!1\nThe tao that can be told \nis not the eternal Tao \nThe name that can be named \nis not the eternal Name. \n\nThe unnamable is the eternally real. \nNaming is the origin \nof all particular things. \n\nFree from desire, you realize the mystery. \nCaught in desire, you see only the manifestations. \n\nYet mystery and manifestations \narise from the same source. \nThis source is called darkness. \n\nDarkness within darkness. \nThe gateway to all understanding. \n\n!2\nWhen people see some things as beautiful, \nother things become ugly. \nWhen people see some things as good, \nother things become bad. \n\nBeing and non-being create each other. \nDifficult and easy support each other. \nLong and short define each other. \nHigh and low depend on each other. \nBefore and after follow each other. \n\nTherefore the Master \nacts without doing anything \nand teaches without saying anything. \nThings arise and she lets them come; \nthings disappear and she lets them go. \nShe has but doesn't possess, \nacts but doesn't expect. \nWhen her work is done, she forgets it. \nThat is why it lasts forever. \n\n!3\nIf you overesteem great men, \npeople become powerless. \nIf you overvalue possessions, \npeople begin to steal. \n\nThe Master leads \nby emptying people's minds \nand filling their cores, \nby weakening their ambition \nand toughening their resolve. \nHe helps people lose everything \nthey know, everything they desire, \nand creates confusion \nin those who think that they know. \n\nPractice not-doing, \nand everything will fall into place. \n\n!4\nThe Tao is like a well: \nused but never used up. \nIt is like the eternal void: \nfilled with infinite possibilities. \n\nIt is hidden but always present. \nI don't know who gave birth to it. \nIt is older than God. \n\n!5\nThe Tao doesn't take sides; \nit gives birth to both good and evil. \nThe Master doesn't take sides; \nshe welcomes both saints and sinners. \n\nThe Tao is like a bellows: \nit is empty yet infinitely capable. \nThe more you use it, the more it produces; \nthe more you talk of it, the less you understand. \n\nHold on to the center. \n\n!6\nThe Tao is called the Great Mother: \nempty yet inexhaustible, \nit gives birth to infinite worlds. \n\nIt is always present within you. \nYou can use it any way you want. \n\n!7\nThe Tao is infinite, eternal. \nWhy is it eternal? \nIt was never born; \nthus it can never die. \nWhy is it infinite? \nIt has no desires for itself; \nthus it is present for all beings. \n\nThe Master stays behind; \nthat is why she is ahead. \nShe is detached from all things; \nthat is why she is one with them. \nBecause she has let go of herself, \nshe is perfectly fulfilled. \n\n!8\nThe supreme good is like water, \nwhich nourishes all things without trying to. \nIt is content with the low places that people disdain. \nThus it is like the Tao. \n\nIn dwelling, live close to the ground. \nIn thinking, keep to the simple. \nIn conflict, be fair and generous. \nIn governing, don't try to control. \nIn work, do what you enjoy. \nIn family life, be completely present. \n\nWhen you are content to be simply yourself \nand don't compare or compete, \neverybody will respect you. \n\n!9\nFill your bowl to the brim \nand it will spill. \nKeep sharpening your knife \nand it will blunt. \nChase after money and security \nand your heart will never unclench. \nCare about people's approval \nand you will be their prisoner. \n\nDo your work, then step back. \nThe only path to serenity. \n\n!10\nCan you coax your mind from its wandering \nand keep to the original oneness? \nCan you let your body become \nsupple as a newborn child's? \nCan you cleanse your inner vision \nuntil you see nothing but the light? \nCan you love people and lead them \nwithout imposing your will? \nCan you deal with the most vital matters \nby letting events take their course? \nCan you step back from you own mind \nand thus understand all things? \n\nGiving birth and nourishing, \nhaving without possessing, \nacting with no expectations, \nleading and not trying to control: \nthis is the supreme virtue. \n\n!11\nWe join spokes together in a wheel, \nbut it is the center hole \nthat makes the wagon move. \n\nWe shape clay into a pot, \nbut it is the emptiness inside \nthat holds whatever we want. \n\nWe hammer wood for a house, \nbut it is the inner space \nthat makes it livable. \n\nWe work with being, \nbut non-being is what we use. \n\n!12\nColors blind the eye. \nSounds deafen the ear. \nFlavors numb the taste. \nThoughts weaken the mind. \nDesires wither the heart. \n\nThe Master observes the world \nbut trusts his inner vision. \nHe allows things to come and go. \nHis heart is open as the sky. \n\n!13\nSuccess is as dangerous as failure. \nHope is as hollow as fear. \n\nWhat does it mean that success is as dangerous as failure? \nWhether you go up the ladder or down it, \nyou position is shaky. \nWhen you stand with your two feet on the ground, \nyou will always keep your balance. \n\nWhat does it mean that hope is as hollow as fear? \nHope and fear are both phantoms \nthat arise from thinking of the self. \nWhen we don't see the self as self, \nwhat do we have to fear? \n\nSee the world as your self. \nHave faith in the way things are. \nLove the world as your self; \nthen you can care for all things. \n\n!14\nLook, and it can't be seen. \nListen, and it can't be heard. \nReach, and it can't be grasped. \n\nAbove, it isn't bright. \nBelow, it isn't dark. \nSeamless, unnamable, \nit returns to the realm of nothing. \nForm that includes all forms, \nimage without an image, \nsubtle, beyond all conception. \n\nApproach it and there is no beginning; \nfollow it and there is no end. \nYou can't know it, but you can be it, \nat ease in your own life. \nJust realize where you come from: \nthis is the essence of wisdom. \n\n!15\nThe ancient Masters were profound and subtle. \nTheir wisdom was unfathomable. \nThere is no way to describe it; \nall we can describe is their appearance. \n\nThey were careful \nas someone crossing an iced-over stream. \nAlert as a warrior in enemy territory. \nCourteous as a guest. \nFluid as melting ice. \nShapable as a block of wood. \nReceptive as a valley. \nClear as a glass of water. \n\nDo you have the patience to wait \ntill your mud settles and the water is clear? \nCan you remain unmoving \ntill the right action arises by itself? \n\nThe Master doesn't seek fulfillment. \nNot seeking, not expecting, \nshe is present, and can welcome all things. \n\n!16\nEmpty your mind of all thoughts. \nLet your heart be at peace. \nWatch the turmoil of beings, \nbut contemplate their return. \n\nEach separate being in the universe \nreturns to the common source. \nReturning to the source is serenity. \n\nIf you don't realize the source, \nyou stumble in confusion and sorrow. \nWhen you realize where you come from, \nyou naturally become tolerant, \ndisinterested, amused, \nkindhearted as a grandmother, \ndignified as a king. \nImmersed in the wonder of the Tao, \nyou can deal with whatever life brings you, \nand when death comes, you are ready. \n\n!17\nWhen the Master governs, the people \nare hardly aware that he exists. \nNext best is a leader who is loved. \nNext, one who is feared. \nThe worst is one who is despised. \n\nIf you don't trust the people, \nyou make them untrustworthy. \n\nThe Master doesn't talk, he acts. \nWhen his work is done, \nthe people say, "Amazing: \nwe did it, all by ourselves!" \n\n18\nWhen the great Tao is forgotten, \ngoodness and piety appear. \nWhen the body's intelligence declines, \ncleverness and knowledge step forth. \nWhen there is no peace in the family, \nfilial piety begins. \nWhen the country falls into chaos, \npatriotism is born. \n\n19\nThrow away holiness and wisdom, \nand people will be a hundred times happier. \nThrow away morality and justice, \nand people will do the right thing. \nThrow away industry and profit, \nand there won't be any thieves. \n\nIf these three aren't enough, \njust stay at the center of the circle \nand let all things take their course. \n\n20\nStop thinking, and end your problems. \nWhat difference between yes and no? \nWhat difference between success and failure? \nMust you value what others value, \navoid what others avoid? \nHow ridiculous! \n\nOther people are excited, \nas though they were at a parade. \nI alone don't care, \nI alone am expressionless, \nlike an infant before it can smile. \n\nOther people have what they need; \nI alone possess nothing. \nI alone drift about, \nlike someone without a home. \nI am like an idiot, my mind is so empty. \n\nOther people are bright; \nI alone am dark. \nOther people are sharper; \nI alone am dull. \nOther people have a purpose; \nI alone don't know. \nI drift like a wave on the ocean, \nI blow as aimless as the wind. \n\nI am different from ordinary people. \nI drink from the Great Mother's breasts. \n\n21\nThe Master keeps her mind \nalways at one with the Tao; \nthat is what gives her her radiance. \n\nThe Tao is ungraspable. \nHow can her mind be at one with it? \nBecause she doesn't cling to ideas. \n\nThe Tao is dark and unfathomable. \nHow can it make her radiant? \nBecause she lets it. \n\nSince before time and space were, \nthe Tao is. \nIt is beyond is and is not. \nHow do I know this is true? \nI look inside myself and see. \n\n22\nIf you want to become whole, \nlet yourself be partial. \nIf you want to become straight, \nlet yourself be crooked. \nIf you want to become full, \nlet yourself be empty. \nIf you want to be reborn, \nlet yourself die. \nIf you want to be given everything, \ngive everything up. \n\nThe Master, by residing in the Tao, \nsets an example for all beings. \nBecause he doesn't display himself, \npeople can see his light. \nBecause he has nothing to prove, \npeople can trust his words. \nBecause he doesn't know who he is, \npeople recognize themselves in him. \nBecause he has no goad in mind, \neverything he does succeeds. \n\nWhen the ancient Masters said, \n"If you want to be given everything, \ngive everything up," \nthey weren't using empty phrases. \nOnly in being lived by the Tao can you be truly yourself. \n\n23\nExpress yourself completely, \nthen keep quiet. \nBe like the forces of nature: \nwhen it blows, there is only wind; \nwhen it rains, there is only rain; \nwhen the clouds pass, the sun shines through. \n\nIf you open yourself to the Tao, \nyou are at one with the Tao \nand you can embody it completely. \nIf you open yourself to insight, \nyou are at one with insight \nand you can use it completely. \nIf you open yourself to loss, \nyou are at one with loss \nand you can accept it completely. \n\nOpen yourself to the Tao, \nthen trust your natural responses; \nand everything will fall into place. \n\n24\nHe who stands on tiptoe \ndoesn't stand form. \nHe who rushes ahead \ndoesn't go far. \nHe who tries to shine \ndims his own light. \nHe who defines himself \ncan't know who he really is. \nHe who has power over others \ncan't empower himself. \nHe who clings to his work \nwill create nothing that endures. \n\nIf you want to accord with the Tao, \njust do your job, then let go. \n\n25\nThere was something formless and perfect \nbefore the universe was born. \nIt is serene. Empty. \nSolitary. Unchanging. \nInfinite. Eternally present. \nIt is the mother of the universe. \nFor lack of a better name, \nI call it the Tao. \n\nIt flows through all things, \ninside and outside, and returns \nto the origin of all things. \n\nThe Tao is great. \nThe universe is great. \nEarth is great. \nMan is great. \nThese are the four great powers. \n\nMan follows the earth. \nEarth follows the universe. \nThe universe follows the Tao. \nThe Tao follows only itself. \n\n26\nThe heavy is the root of the light. \nThe unmoved is the source of all movement. \n\nThus the Master travels all day \nwithout leaving home. \nHowever splendid the views, \nshe stays serenely in herself. \n\nWhy should the lord of the country \nflit about like a fool? \nIf you let yourself be blown to and fro, \nyou lose touch with your root. \nIf you let restlessness move you, \nyou lose touch with who you are. \n\n27\nA good traveler has no fixed plans \nand is not intent upon arriving. \nA good artist lets his intuition \nlead him wherever it wants. \nA good scientist has freed himself of concepts \nand keeps his mind open to what is. \n\nThus the Master is available to all people \nand doesn't reject anyone. \nHe is ready to use all situations \nand doesn't waste anything. \nThis is called embodying the light. \n\nWhat is a good man but a bad man's teacher? \nWhat is a bad man but a good man's job? \nIf you don't understand this, you will get lost, \nhowever intelligent you are. \nIt is the great secret. \n\n28\nKnow the male, \nyet keep to the female: \nreceive the world in your arms. \nIf you receive the world, \nthe Tao will never leave you \nand you will be like a little child. \n\nKnow the white, \nyet keep to the black: \nbe a pattern for the world. \nIf you are a pattern for the world, \nthe Tao will be strong inside you \nand there will be nothing you can't do. \n\nKnow the personal, \nyet keep to the impersonal: \naccept the world as it is. \nIf you accept the world, \nthe Tao will be luminous inside you \nand you will return to your primal self. \n\nThe world is formed from the void, \nlike utensils from a block of wood. \nThe Master knows the utensils, \nyet keeps to the block: \nthus she can use all things. \n\n29\nDo you want to improve the world? \nI don't think it can be done. \n\nThe world is sacred. \nIt can't be improved. \nIf you tamper with it, you'll ruin it. \nIf you treat it like an object, you'll lose it. \n\nThere is a time for being ahead, \na time for being behind; \na time for being in motion, \na time for being at rest; \na time for being vigorous, \na time for being exhausted; \na time for being safe, \na time for being in danger. \n\nThe Master sees things as they are, \nwithout trying to control them. \nShe lets them go their own way, \nand resides at the center of the circle. \n\n30\nWhoever relies on the Tao in governing men \ndoesn't try to force issues \nor defeat enemies by force of arms. \nFor every force there is a counterforce. \nViolence, even well intentioned, \nalways rebounds upon oneself. \n\nThe Master does his job \nand then stops. \nHe understands that the universe \nis forever out of control, \nand that trying to dominate events \ngoes against the current of the Tao. \nBecause he believes in himself, \nhe doesn't try to convince others. \nBecause he is content with himself, \nhe doesn't need others' approval. \nBecause he accepts himself, \nthe whole world accepts him. \n\n31\nWeapons are the tools of violence; \nall decent men detest them. \n\nWeapons are the tools of fear; \na decent man will avoid them \nexcept in the direst necessity \nand, if compelled, will use them \nonly with the utmost restraint. \nPeace is his highest value. \nIf the peace has been shattered, \nhow can he be content? \nHis enemies are not demons, \nbut human beings like himself. \nHe doesn't wish them personal harm. \nNor does he rejoice in victory. \nHow could he rejoice in victory \nand delight in the slaughter of men? \n\nHe enters a battle gravely, \nwith sorrow and with great compassion, \nas if he were attending a funeral. \n\n32\nThe Tao can't be perceived. \nSmaller than an electron, \nit contains uncountable galaxies. \n\nIf powerful men and women \ncould remain centered in the Tao, \nall things would be in harmony. \nThe world would become a paradise. \nAll people would be at peace, \nand the law would be written in their hearts. \n\nWhen you have names and forms, \nknow that they are provisional. \nWhen you have institutions, \nknow where their functions should end. \nKnowing when to stop, \nyou can avoid any danger. \n\nAll things end in the Tao \nas rivers flow into the sea. \n\n33\nKnowing others is intelligence; \nknowing yourself is true wisdom. \nMastering others is strength; \nmastering yourself is true power. \n\nIf you realize that you have enough, \nyou are truly rich. \nIf you stay in the center \nand embrace death with your whole heart, \nyou will endure forever. \n\n34\nThe great Tao flows everywhere. \nAll things are born from it, \nyet it doesn't create them. \nIt pours itself into its work, \nyet it makes no claim. \nIt nourishes infinite worlds, \nyet it doesn't hold on to them. \nSince it is merged with all things \nand hidden in their hearts, \nit can be called humble. \nSince all things vanish into it \nand it alone endures, \nit can be called great. \nIt isn't aware of its greatness; \nthus it is truly great. \n\n\n35\nShe who is centered in the Tao \ncan go where she wishes, without danger. \nShe perceives the universal harmony, \neven amid great pain, \nbecause she has found peace in her heart. \n\nMusic or the smell of good cooking \nmay make people stop and enjoy. \nBut words that point to the Tao \nseem monotonous and without flavor. \nWhen you look for it, there is nothing to see. \nWhen you listen for it, there is nothing to hear. \nWhen you use it, it is inexhaustible. \n\n36\nIf you want to shrink something, \nyou must first allow it to expand. \nIf you want to get rid of something, \nyou must first allow it to flourish. \nIf you want to take something, \nyou must first allow it to be given. \nThis is called the subtle perception \nof the way things are. \n\nThe soft overcomes the hard. \nThe slow overcomes the fast. \nLet your workings remain a mystery. \nJust show people the results. \n\n37\nThe Tao never does anything, \nyet through it all things are done. \n\nIf powerful men and women \ncould center themselves in it, \nthe whole world would be transformed \nby itself, in its natural rhythms. \nPeople would be content \nwith their simple, everyday lives, \nin harmony, and free of desire. \n\nWhen there is no desire, \nall things are at peace. \n\n38\nThe Master doesn't try to be powerful; \nthus he is truly powerful. \nThe ordinary man keeps reaching for power; \nthus he never has enough. \n\nThe Master does nothing, \nyet he leaves nothing undone. \nThe ordinary man is always doing things, \nyet many more are left to be done. \n\nThe kind man does something, \nyet something remains undone. \nThe just man does something, \nand leaves many things to be done. \nThe moral man does something, \nand when no one responds \nhe rolls up his sleeves and uses force. \n\nWhen the Tao is lost, there is goodness. \nWhen goodness is lost, there is morality. \nWhen morality is lost, there is ritual. \nRitual is the husk of true faith, \nthe beginning of chaos. \n\nTherefore the Master concerns himself \nwith the depths and not the surface, \nwith the fruit and not the flower. \nHe has no will of his own. \nHe dwells in reality, \nand lets all illusions go. \n\n39\nIn harmony with the Tao, \nthe sky is clear and spacious, \nthe earth is solid and full, \nall creature flourish together, \ncontent with the way they are, \nendlessly repeating themselves, \nendlessly renewed. \n\nWhen man interferes with the Tao, \nthe sky becomes filthy, \nthe earth becomes depleted, \nthe equilibrium crumbles, \ncreatures become extinct. \n\nThe Master views the parts with compassion, \nbecause he understands the whole. \nHis constant practice is humility. \nHe doesn't glitter like a jewel \nbut lets himself be shaped by the Tao, \nas rugged and common as stone. \n\n40\nReturn is the movement of the Tao. \nYielding is the way of the Tao. \n\nAll things are born of being. \nBeing is born of non-being. \n\n41\nWhen a superior man hears of the Tao, \nhe immediately begins to embody it. \nWhen an average man hears of the Tao, \nhe half believes it, half doubts it. \nWhen a foolish man hears of the Tao, \nhe laughs out loud. \nIf he didn't laugh, \nit wouldn't be the Tao. \n\nThus it is said: \nThe path into the light seems dark, \nthe path forward seems to go back, \nthe direct path seems long, \ntrue power seems weak, \ntrue purity seems tarnished, \ntrue steadfastness seems changeable, \ntrue clarity seems obscure, \nthe greatest are seems unsophisticated, \nthe greatest love seems indifferent, \nthe greatest wisdom seems childish. \n\nThe Tao is nowhere to be found. \nYet it nourishes and completes all things. \n\n42\nThe Tao gives birth to One. \nOne gives birth to Two. \nTwo gives birth to Three. \nThree gives birth to all things. \n\nAll things have their backs to the female \nand stand facing the male. \nWhen male and female combine, \nall things achieve harmony. \n\nOrdinary men hate solitude. \nBut the Master makes use of it, \nembracing his aloneness, realizing \nhe is one with the whole universe. \n\n43\nThe gentlest thing in the world \novercomes the hardest thing in the world. \nThat which has no substance \nenters where there is no space. \nThis shows the value of non-action. \n\nTeaching without words, \nperforming without actions: \nthat is the Master's way. \n\n44\nFame or integrity: which is more important? \nMoney or happiness: which is more valuable? \nSuccess of failure: which is more destructive? \n\nIf you look to others for fulfillment, \nyou will never truly be fulfilled. \nIf your happiness depends on money, \nyou will never be happy with yourself. \n\nBe content with what you have; \nrejoice in the way things are. \nWhen you realize there is nothing lacking, \nthe whole world belongs to you. \n\n45\nTrue perfection seems imperfect, \nyet it is perfectly itself. \nTrue fullness seems empty, \nyet it is fully present. \n\nTrue straightness seems crooked. \nTrue wisdom seems foolish. \nTrue art seems artless. \n\nThe Master allows things to happen. \nShe shapes events as they come. \nShe steps out of the way \nand lets the Tao speak for itself. \n\n46\nWhen a country is in harmony with the Tao, \nthe factories make trucks and tractors. \nWhen a country goes counter to the Tao, \nwarheads are stockpiled outside the cities. \n\nThere is no greater illusion than fear, \nno greater wrong than preparing to defend yourself, \nno greater misfortune than having an enemy. \n\nWhoever can see through all fear \nwill always be safe. \n\n47\nWithout opening your door, \nyou can open your heart to the world. \nWithout looking out your window, \nyou can see the essence of the Tao. \n\nThe more you know, \nthe less you understand. \n\nThe Master arrives without leaving, \nsees the light without looking, \nachieves without doing a thing. \n\n48\nIn pursuit of knowledge, \nevery day something is added. \nIn the practice of the Tao, \nevery day something is dropped. \nLess and less do you need to force things, \nuntil finally you arrive at non-action. \nWhen nothing is done, \nnothing is left undone. \n\nTrue mastery can be gained \nby letting things go their own way. \nIt can't be gained by interfering. \n\n49\nThe Master has no mind of her own. \nShe works with the mind of the people. \n\nShe is good to people who are good. \nShe is also good to people who aren't good. \nThis is true goodness. \n\nShe trusts people who are trustworthy. \nShe also trusts people who aren't trustworthy. \nThis is true trust. \n\nThe Master's mind is like space. \nPeople don't understand her. \nThey look to her and wait. \nShe treats them like her own children. \n\n50\nThe Master gives himself up \nto whatever the moment brings. \nHe knows that he is going to die, \nand her has nothing left to hold on to: \nno illusions in his mind, \nno resistances in his body. \nHe doesn't think about his actions; \nthey flow from the core of his being. \nHe holds nothing back from life; \ntherefore he is ready for death, \nas a man is ready for sleep \nafter a good day's work. \n\n51\nEvery being in the universe \nis an expression of the Tao. \nIt springs into existence, \nunconscious, perfect, free, \ntakes on a physical body, \nlets circumstances complete it. \nThat is why every being \nspontaneously honors the Tao. \n\nThe Tao gives birth to all beings, \nnourishes them, maintains them, \ncares for them, comforts them, protects them, \ntakes them back to itself, \ncreating without possessing, \nacting without expecting, \nguiding without interfering. \nThat is why love of the Tao \nis in the very nature of things. \n\n!52\nIn the beginning was the Tao. \nAll things issue from it; \nall things return to it. \n\nTo find the origin, \ntrace back the manifestations. \nWhen you recognize the children \nand find the mother, \nyou will be free of sorrow. \n\nIf you close your mind in judgements \nand traffic with desires, \nyour heart will be troubled. \nIf you keep your mind from judging \nand aren't led by the senses, \nyour heart will find peace. \n\nSeeing into darkness is clarity. \nKnowing how to yield is strength. \nUse your own light \nand return to the source of light. \nThis is called practicing eternity. \n\n!53\nThe great Way is easy, \nyet people prefer the side paths. \nBe aware when things are out of balance. \nStay centered within the Tao. \n\nWhen rich speculators prosper \nWhile farmers lose their land; \nwhen government officials spend money \non weapons instead of cures; \nwhen the upper class is extravagant and irresponsible \nwhile the poor have nowhere to turn- \nall this is robbery and chaos. \nIt is not in keeping with the Tao. \n\n!54\nWhoever is planted in the Tao \nwill not be rooted up. \nWhoever embraces the Tao \nwill not slip away. \nHer name will be held in honor \nfrom generation to generation. \n\nLet the Tao be present in your life \nand you will become genuine. \nLet it be present in your family \nand your family will flourish. \nLet it be present in your country \nand your country will be an example \nto all countries in the world. \nLet it be present in the universe \nand the universe will sing. \n\nHow do I know this is true? \nBy looking inside myself. \n\n!55\nHe who is in harmony with the Tao \nis like a newborn child. \nIts bones are soft, its muscles are weak, \nbut its grip is powerful. \nIt doesn't know about the union \nof male and female, \nyet its penis can stand erect, \nso intense is its vital power. \nIt can scream its head off all day, \nyet it never becomes hoarse, \nso complete is its harmony. \n\nThe Master's power is like this. \nHe lets all things come and go \neffortlessly, without desire. \nHe never expects results; \nthus he is never disappointed. \nHe is never disappointed; \nthus his spirit never grows old. \n\n!56\nThose who know don't talk. \nThose who talk don't know. \n\nClose your mouth, \nblock off your senses, \nblunt your sharpness, \nuntie your knots, \nsoften your glare, \nsettle your dust. \nThis is the primal identity. \n\nBe like the Tao. \nIt can't be approached or withdrawn from, \nbenefited or harmed, \nhonored or brought into disgrace. \nIt gives itself up continually. \nThat is why it endures. \n\n!57\nIf you want to be a great leader, \nyou must learn to follow the Tao. \nStop trying to control. \nLet go of fixed plans and concepts, \nand the world will govern itself. \n\nThe more prohibitions you have, \nthe less virtuous people will be. \nThe more weapons you have, \nthe less secure people will be. \nThe more subsidies you have, \nthe less self-reliant people will be. \n\nTherefore the Master says: \nI let go of the law, \nand people become honest. \nI let go of economics, \nand people become prosperous. \nI let go of religion, \nand people become serene. \nI let go of all desire for the common good, \nand the good becomes common as grass. \n\n!58\nIf a country is governed with tolerance, \nthe people are comfortable and honest. \nIf a country is governed with repression, \nthe people are depressed and crafty. \n\nWhen the will to power is in charge, \nthe higher the ideals, the lower the results. \nTry to make people happy, \nand you lay the groundwork for misery. \nTry to make people moral, \nand you lay the groundwork for vice. \n\nThus the Master is content \nto serve as an example \nand not to impose her will. \nShe is pointed, but doesn't pierce. \nStraightforward, but supple. \nRadiant, but easy on the eyes. \n\n!59\nFor governing a country well \nthere is nothing better than moderation. \n\nThe mark of a moderate man \nis freedom from his own ideas. \nTolerant like the sky, \nall-pervading like sunlight, \nfirm like a mountain, \nsupple like a tree in the wind, \nhe has no destination in view \nand makes use of anything \nlife happens to bring his way. \n\nNothing is impossible for him. \nBecause he has let go, \nhe can care for the people's welfare \nas a mother cares for her child. \n\n!60\nGoverning a large country \nis like frying a small fish. \nYou spoil it with too much poking. \n\nCenter your country in the Tao \nand evil will have no power. \nNot that it isn't there, \nbut you'll be able to step out of its way. \n\nGive evil nothing to oppose \nand it will disappear by itself. \n\n!61\nWhen a country obtains great power, \nit becomes like the sea: \nall streams run downward into it. \nThe more powerful it grows, \nthe greater the need for humility. \nHumility means trusting the Tao, \nthus never needing to be defensive. \n\nA great nation is like a great man: \nWhen he makes a mistake, he realizes it. \nHaving realized it, he admits it. \nHaving admitted it, he corrects it. \nHe considers those who point out his faults \nas his most benevolent teachers. \nHe thinks of his enemy \nas the shadow that he himself casts. \n\nIf a nation is centered in the Tao, \nif it nourishes its own people \nand doesn't meddle in the affairs of others, \nit will be a light to all nations in the world. \n\n!62\nThe Tao is the center of the universe, \nthe good man's treasure, \nthe bad man's refuge. \n\nHonors can be bought with fine words, \nrespect can be won with good deeds; \nbut the Tao is beyond all value, \nand no one can achieve it. \n\nThus, when a new leader is chosen, \ndon't offer to help him \nwith your wealth or your expertise. \nOffer instead \nto teach him about the Tao. \n\nWhy did the ancient Masters esteem the Tao? \nBecause, being one with the Tao, \nwhen you seek, you find; \nand when you make a mistake, you are forgiven. \nThat is why everybody loves it. \n\n!63\nAct without doing; \nwork without effort. \nThink of the small as large \nand the few as many. \nConfront the difficult \nwhile it is still easy; \naccomplish the great task \nby a series of small acts. \n\nThe Master never reaches for the great; \nthus she achieves greatness. \nWhen she runs into a difficulty, \nshe stops and gives herself to it. \nShe doesn't cling to her own comfort; \nthus problems are no problem for her. \n\n!64\nWhat is rooted is easy to nourish. \nWhat is recent is easy to correct. \nWhat is brittle is easy to break. \nWhat is small is easy to scatter. \n\nPrevent trouble before it arises. \nPut things in order before they exist. \nThe giant pine tree \ngrows from a tiny sprout. \nThe journey of a thousand miles \nstarts from beneath your feet. \n\nRushing into action, you fail. \nTrying to grasp things, you lose them. \nForcing a project to completion, \nyou ruin what was almost ripe. \n\nTherefore the Master takes action \nby letting things take their course. \nHe remains as calm \nat the end as at the beginning. \nHe has nothing, \nthus has nothing to lose. \nWhat he desires is non-desire; \nwhat he learns is to unlearn. \nHe simply reminds people \nof who they have always been. \nHe cares about nothing but the Tao. \nThus he can care for all things. \n\n!65\nThe ancient Masters \ndidn't try to educate the people, \nbut kindly taught them to not-know. \n\nWhen they think that they know the answers, \npeople are difficult to guide. \nWhen they know that they don't know, \npeople can find their own way. \n\nIf you want to learn how to govern, \navoid being clever or rich. \nThe simplest pattern is the clearest. \nContent with an ordinary life, \nyou can show all people the way \nback to their own true nature. \n\n!66\nAll streams flow to the sea \nbecause it is lower than they are. \nHumility gives it its power. \n\nIf you want to govern the people, \nyou must place yourself below them. \nIf you want to lead the people, \nyou must learn how to follow them. \n\nThe Master is above the people, \nand no one feels oppressed. \nShe goes ahead of the people, \nand no one feels manipulated. \nThe whole world is grateful to her. \nBecause she competes with no one, \nno one can compete with her. \n\n!67\nSome say that my teaching is nonsense. \nOthers call it lofty but impractical. \nBut to those who have looked inside themselves, \nthis nonsense makes perfect sense. \nAnd to those who put it into practice, \nthis loftiness has roots that go deep. \n\nI have just three things to teach: \nsimplicity, patience, compassion. \nThese three are your greatest treasures. \nSimple in actions and in thoughts, \nyou return to the source of being. \nPatient with both friends and enemies, \nyou accord with the way things are. \nCompassionate toward yourself, \nyou reconcile all beings in the world. \n\n!68\nThe best athlete \nwants his opponent at his best. \nThe best general \nenters the mind of his enemy. \nThe best businessman \nserves the communal good. \nThe best leader \nfollows the will of the people. \n\nAll of them embody \nthe virtue of non-competition. \nNot that they don't love to compete, \nbut they do it in the spirit of play. \nIn this they are like children \nand in harmony with the Tao. \n\n!69\nThe generals have a saying: \n"Rather than make the first move \nit is better to wait and see. \nRather than advance an inch \nit is better to retreat a yard." \n\nThis is called \ngoing forward without advancing, \npushing back without using weapons. \n\nThere is no greater misfortune \nthan underestimating your enemy. \nUnderestimating your enemy \nmeans thinking that he is evil. \nThus you destroy your three treasures \nand become an enemy yourself. \n\nWhen two great forces oppose each other, \nthe victory will go \nto the one that knows how to yield. \n\n!70\nMy teachings are easy to understand \nand easy to put into practice. \nYet your intellect will never grasp them, \nand if you try to practice them, you'll fail. \n\nMy teachings are older than the world. \nHow can you grasp their meaning? \n\nIf you want to know me, \nlook inside your heart. \n\n!71\nNot-knowing is true knowledge. \nPresuming to know is a disease. \nFirst realize that you are sick; \nthen you can move toward health. \n\nThe Master is her own physician. \nShe has healed herself of all knowing. \nThus she is truly whole. \n\n!72\nWhen they lose their sense of awe, \npeople turn to religion. \nWhen they no longer trust themselves, \nthey begin to depend upon authority. \n\nTherefore the Master steps back \nso that people won't be confused. \nHe teaches without a teaching, \nso that people will have nothing to learn. \n\n!73\nThe Tao is always at ease. \nIt overcomes without competing, \nanswers without speaking a word, \narrives without being summoned, \naccomplishes without a plan. \n\nIts net covers the whole universe. \nAnd though its meshes are wide, \nit doesn't let a thing slip through. \n\n!74\nIf you realize that all things change, \nthere is nothing you will try to hold on to. \nIf you aren't afraid of dying, \nthere is nothing you can't achieve. \n\nTrying to control the future \nis like trying to take the master carpenter's place. \nWhen you handle the master carpenter's tools, \nchances are that you'll cut your hand. \n\n!75\nWhen taxes are too high, \npeople go hungry. \nWhen the government is too intrusive, \npeople lose their spirit. \n\nAct for the people's benefit. \nTrust them; leave them alone. \n\n!76\nMen are born soft and supple; \ndead, they are stiff and hard. \nPlants are born tender and pliant; \ndead, they are brittle and dry. \n\nThus whoever is stiff and inflexible \nis a disciple of death. \nWhoever is soft and yielding \nis a disciple of life. \n\nThe hard and stiff will be broken. \nThe soft and supple will prevail. \n\n!77\nAs it acts in the world, the Tao \nis like the bending of a bow. \nThe top is bent downward; \nthe bottom is bent up. \nIt adjusts excess and deficiency \nso that there is perfect balance. \nIt takes from what is too much \nand give to what isn't enough. \n\nThose who try to control, \nwho use force to protect their power, \ngo against the direction of the Tao. \nThey take from those who don't have enough \nand give to those who have far too much. \n\nThe Master can keep giving \nbecause there is no end to her wealth. \nShe acts without expectation, \nsucceeds without taking credit, \nand doesn't think that she is better \nthan anyone else. \n\n!78\nNothing in the world \nis as soft and yielding as water. \nYet for dissolving the hard and inflexible, \nnothing can surpass it. \n\nThe soft overcomes the hard; \nthe gentle overcomes the rigid. \nEveryone knows this is true, \nbut few can put it into practice. \n\nTherefore the Master remains \nserene in the midst of sorrow. \nEvil cannot enter his heart. \nBecause he has given up helping, \nhe is people's greatest help. \n\nTrue words seem paradoxical. \n\n!79\nFailure is an opportunity. \nIf you blame someone else, \nthere is no end to the blame. \n\nTherefore the Master \nfulfills her own obligations \nand corrects her own mistakes. \nShe does what she needs to do \nand demands nothing of others. \n\n!80\nIf a country is governed wisely, \nits inhabitants will be content. \nThey enjoy the labor of their hands \nand don't waste time inventing \nlabor-saving machines. \nSince they dearly love their homes, \nthey aren't interested in travel. \nThere may be a few wagons and boats, \nbut these don't go anywhere. \nThere may be an arsenal of weapons, \nbut nobody ever uses them. \nPeople enjoy their food, \ntake pleasure in being with their families, \nspend weekends working in their gardens, \ndelight in the doings of the neighborhood. \nAnd even though the next country is so close \nthat people can hear its roosters crowing and its dogs barking, \nthey are content to die of old age \nwithout ever having gone to see it. \n\n!81\nTrue words aren't eloquent; \neloquent words aren't true. \nWise men don't need to prove their point; \nmen who need to prove their point aren't wise. \n\nThe Master has no possessions. \nThe more he does for others, \nthe happier he is. \nThe more he gives to others, \nthe wealthier he is. \n\nThe Tao nourishes by not forcing. \nBy not dominating, the Master leads.
/***\n|Name|TaskMacroPlugin|\n|Author|<<extension TaskMacroPlugin author>>|\n|Location|<<extension TaskMacroPlugin source>>|\n|License|<<extension TaskMacroPlugin license>>|\n|Version|<<extension TaskMacroPlugin versionAndDate>>|\n!Description\nA set of macros to help you keep track of time estimates for tasks. See TaskMacroTutorial for how to use the macros defined here.\n\nMacros defined:\n* {{{task}}}: Displays a task description and makes it easy to estimate and track the time spent on the task.\n* {{{taskadder}}}: Displays text entry field to simplify the adding of tasks.\n* {{{tasksum}}}: Displays a summary of tasks sandwiched between two calls to this macro.\n* {{{extension}}}: A simple little macro that displays information about a TiddlyWiki plugin, and that will hopefully someday migrate to the TW core in some form.\n!Plugin Information\n***/\n//{{{\nversion.extensions.TaskMacroPlugin = {\n major: 1, minor: 0, revision: 0,\n date: new Date(2006,4-1,9),\n author: "LukeBlanshard",\n source: "http://labwiki.sourceforge.net/#TaskMacroPlugin",\n license: "http://labwiki.sourceforge.net/#CopyrightAndLicense"\n}\n//}}}\n/***\nA little macro for pulling out extension info. Use like {{{<<extension PluginName datum>>}}}, where {{{PluginName}}} is the name you used for {{{version.extensions}}} and {{{datum}}} is either {{{versionAndDate}}} or a property of the extension description object, such as {{{source}}}.\n***/\n//{{{\nconfig.macros.extension = {\n handler: function( place, macroName, params, wikifier, paramString, tiddler ) {\n var info = version.extensions[params[0]]\n var datum = params[1]\n switch (params[1]) {\n case 'versionAndDate':\n createTiddlyElement( place, "span", null, null,\n info.major+'.'+info.minor+'.'+info.revision+', '+info.date.formatString('DD MMM YYYY') )\n break;\n default:\n wikify( info[datum], place )\n break;\n }\n }\n}\n//}}}\n/***\n!Global Functions\n***/\n//{{{\n// Lifted from Story.prototype.focusTiddler: just return the field instead of focusing it.\nStory.prototype.findEditField = function( title, field )\n{\n var tiddler = document.getElementById(this.idPrefix + title);\n if(tiddler != null)\n {\n var children = tiddler.getElementsByTagName("*")\n var e = null;\n for (var t=0; t<children.length; t++)\n {\n var c = children[t];\n if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea")\n {\n if(!e)\n e = c;\n if(c.getAttribute("edit") == field)\n e = c;\n }\n }\n return e\n }\n}\n\n// Wraps the given event function in another function that handles the\n// event in a standard way.\nfunction wrapEventHandler( otherHandler ) {\n return function(e) {\n if (!e) var e = window.event\n e.cancelBubble = true\n if (e.stopPropagation) e.stopPropagation()\n return otherHandler( e )\n }\n}\n//}}}\n/***\n!Task Macro\nUsage:\n> {{{<<task orig cur spent>>description}}}\nAll of orig, cur, and spent are optional numbers of hours. The description goes through the end of the line, and is wikified.\n***/\n//{{{\nconfig.macros.task = {\n NASCENT: 0, // Task not yet estimated\n LIVE: 1, // Estimated but with time remaining\n DONE: 2, // Completed: no time remaining\n bullets: ["\su25cb", // nascent (open circle)\n "\su25ba", // live (right arrow)\n "\su25a0"],// done (black square)\n styles: ["nascent", "live", "done"],\n\n // Translatable text:\n lingo: {\n spentTooBig: "Spent time %0 can't exceed current estimate %1",\n noNegative: "Times may not be negative numbers",\n statusTips: ["Not yet estimated", "To do", "Done"], // Array indexed by state (NASCENT/LIVE/DONE)\n descClickTip: " -- Double-click to edit task description",\n statusClickTip: " -- Double-click to mark task complete",\n origTip: "Original estimate in hours",\n curTip: "Current estimate in hours",\n curTip2: "Estimate in hours", // For when orig == cur\n clickTip: " -- Click to adjust",\n spentTip: "Hours spent on this task",\n remTip: "Hours remaining",\n curPrompt: "Estimate this task in hours, or adjust the current estimate by starting with + or -.\sn\snYou may optionally also set or adjust the time spent by putting a second number after the first.",\n spentPrompt: "Enter the number of hours you've spent on this task, or adjust the current number by starting with + or -.\sn\snYou may optionally also set or adjust the time remaining by putting a second number after the first.",\n remPrompt: "Enter the number of hours it will take to finish this task, or adjust the current estimate by starting with + or -.\sn\snYou may optionally also set or adjust the time spent by putting a second number after the first.",\n numbersOnly: "Enter numbers only, please"\n },\n\n // The macro handler\n handler: function( place, macroName, params, wikifier, paramString, tiddler )\n {\n var start = wikifier.matchStart, end = wikifier.nextMatch\n\n var origStr = params.length > 0? params.shift() : "?"\n var orig = +origStr // as a number\n var cur = params.length > 1? +params.shift() : orig\n var spent = params.length > 0? +params.shift() : 0\n if ( spent > cur )\n throw Error( this.lingo.spentTooBig.format([spent, cur]) )\n if ( orig < 0 || cur < 0 || spent < 0 )\n throw Error( this.lingo.noNegative )\n var rem = cur - spent\n var state = isNaN(orig+rem)? this.NASCENT : rem > 0? this.LIVE : this.DONE\n var table = createTiddlyElement( place, "table", null, "task "+this.styles[state] )\n var tbody = createTiddlyElement( table, "tbody" )\n var row = createTiddlyElement( tbody, "tr" )\n var statusCell = createTiddlyElement( row, "td", null, "status", this.bullets[state] )\n var descCell = createTiddlyElement( row, "td", null, "description" )\n\n var origCell = state==this.NASCENT || orig==cur? null\n : createTiddlyElement( row, "td", null, "numeric original" )\n var curCell = createTiddlyElement( row, "td", null, "numeric current" )\n var spentCell = createTiddlyElement( row, "td", null, "numeric spent" )\n var remCell = createTiddlyElement( row, "td", null, "numeric remaining" )\n\n var sums = tiddler.tasksums\n if ( sums && sums.length )\n sums[0].push( [(state == this.NASCENT? NaN : orig), cur, spent] )\n\n // The description goes to the end of the line\n wikifier.subWikify( descCell, "$\s\sn?" )\n var descEnd = wikifier.nextMatch\n\n statusCell.setAttribute( "title", this.lingo.statusTips[state] )\n descCell.setAttribute( "title", this.lingo.statusTips[state]+this.lingo.descClickTip )\n if (origCell) {\n createTiddlyElement( origCell, "div", null, null, orig )\n origCell.setAttribute( "title", this.lingo.origTip )\n curCell.setAttribute( "title", this.lingo.curTip )\n }\n else {\n curCell.setAttribute( "title", this.lingo.curTip2 )\n }\n var curDivContents = (state==this.NASCENT)? "?" : cur\n var curDiv = createTiddlyElement( curCell, "div", null, null, curDivContents )\n spentCell.setAttribute( "title", this.lingo.spentTip )\n var spentDiv = createTiddlyElement( spentCell, "div", null, null, spent )\n remCell.setAttribute( "title", this.lingo.remTip )\n var remDiv = createTiddlyElement( remCell, "div", null, null, rem )\n\n // Handle double-click on the description by going\n // into edit mode and selecting the description\n descCell.ondblclick = this.editDescription( tiddler, end, descEnd )\n\n function appTitle( el, suffix ) {\n el.setAttribute( "title", el.getAttribute("title")+suffix )\n }\n\n // For incomplete tasks, handle double-click on the\n // bullet by marking the task complete\n if ( state != this.DONE ) {\n appTitle( statusCell, this.lingo.statusClickTip )\n statusCell.ondblclick = this.markTaskComplete( tiddler, start, end, macroName, orig, cur, state )\n }\n\n // Add click handlers for the numeric cells.\n if ( state != this.DONE ) {\n appTitle( curCell, this.lingo.clickTip )\n curDiv.className = "adjustable"\n curDiv.onclick = this.adjustCurrentEstimate( tiddler, start, end, macroName,\n orig, cur, spent, curDivContents )\n }\n appTitle( spentCell, this.lingo.clickTip )\n spentDiv.className = "adjustable"\n spentDiv.onclick = this.adjustTimeSpent( tiddler, start, end, macroName, orig, cur, spent )\n if ( state == this.LIVE ) {\n appTitle( remCell, this.lingo.clickTip )\n remDiv.className = "adjustable"\n remDiv.onclick = this.adjustTimeRemaining( tiddler, start, end, macroName, orig, cur, spent )\n }\n },\n\n // Puts the tiddler into edit mode, and selects the range of characters\n // defined by start and end. Separated for leak prevention in IE.\n editDescription: function( tiddler, start, end ) {\n return wrapEventHandler( function(e) {\n var tiddlerElement = story.refreshTiddler( tiddler.title, DEFAULT_EDIT_TEMPLATE )\n window.scrollTo( 0, ensureVisible(tiddlerElement) )\n var element = story.findEditField( tiddler.title, "text" )\n if ( element && element.tagName.toLowerCase() == "textarea" ) {\n // Back up one char if the last char's a newline\n if ( tiddler.text[end-1] == '\sn' )\n --end\n element.focus()\n if ( element.setSelectionRange != undefined ) { // Mozilla\n element.setSelectionRange( start, end )\n // Damn mozilla doesn't scroll to visible. Approximate.\n var max = 0.0 + element.scrollHeight\n var len = element.textLength\n var top = max*start/len, bot = max*end/len\n element.scrollTop = Math.min( top, (bot+top-element.clientHeight)/2 )\n }\n else if ( element.createTextRange != undefined ) { // IE\n var range = element.createTextRange()\n range.collapse()\n range.moveEnd("character", end)\n range.moveStart("character", start)\n range.select()\n }\n else // Other? Too bad, just select the whole thing.\n element.select()\n return false\n }\n else\n return true\n } )\n },\n\n // Modifies a task macro call such that the task appears complete.\n markTaskComplete: function( tiddler, start, end, macroName, orig, cur, state ) {\n var macro = this\n return wrapEventHandler( function(e) {\n if ( state == macro.NASCENT )\n orig = cur = 0\n // The second "cur" in the call below bumps up the time spent\n // to match the current estimate.\n macro.replaceMacroCall( tiddler, start, end, macroName, orig, cur, cur )\n return false\n } )\n },\n\n // Asks the user for an adjustment to the current estimate, modifies the macro call accordingly.\n adjustCurrentEstimate: function( tiddler, start, end, macroName, orig, cur, spent, curDivContents ) {\n var macro = this\n return wrapEventHandler( function(e) {\n var txt = prompt( macro.lingo.curPrompt, curDivContents )\n if ( txt != null ) {\n var a = macro.breakInput( txt )\n cur = macro.offset( cur, a[0] )\n if ( a.length > 1 )\n spent = macro.offset( spent, a[1] )\n macro.replaceMacroCall( tiddler, start, end, macroName, orig, cur, spent )\n }\n return false\n } )\n },\n\n // Asks the user for an adjustment to the time spent, modifies the macro call accordingly.\n adjustTimeSpent: function( tiddler, start, end, macroName, orig, cur, spent ) {\n var macro = this\n return wrapEventHandler( function(e) {\n var txt = prompt( macro.lingo.spentPrompt, spent )\n if ( txt != null ) {\n var a = macro.breakInput( txt )\n spent = macro.offset( spent, a[0] )\n var rem = cur - spent\n if ( a.length > 1 ) {\n rem = macro.offset( rem, a[1] )\n cur = spent + rem\n }\n macro.replaceMacroCall( tiddler, start, end, macroName, orig, cur, spent )\n }\n return false\n } )\n },\n\n // Asks the user for an adjustment to the time remaining, modifies the macro call accordingly.\n adjustTimeRemaining: function( tiddler, start, end, macroName, orig, cur, spent ) {\n var macro = this\n var rem = cur - spent\n return wrapEventHandler( function(e) {\n var txt = prompt( macro.lingo.remPrompt, rem )\n if ( txt != null ) {\n var a = macro.breakInput( txt )\n var newRem = macro.offset( rem, a[0] )\n if ( newRem > rem || a.length > 1 )\n cur += (newRem - rem)\n else\n spent += (rem - newRem)\n if ( a.length > 1 )\n spent = macro.offset( spent, a[1] )\n macro.replaceMacroCall( tiddler, start, end, macroName, orig, cur, spent )\n }\n return false\n } )\n },\n\n // Breaks input at spaces & commas, returns array\n breakInput: function( txt ) {\n var a = txt.trim().split( /[\ss,]+/ )\n if ( a.length == 0 )\n a = [NaN]\n return a\n },\n\n // Adds to, subtracts from, or replaces a numeric value\n offset: function( num, txt ) {\n if ( txt == "" || typeof(txt) != "string" )\n return NaN\n if ( txt.match(/^[+-]/) )\n return num + (+txt)\n return +txt\n },\n\n // Does some error checking, then replaces the indicated macro\n // call within the text of the given tiddler.\n replaceMacroCall: function( tiddler, start, end, macroName, orig, cur, spent )\n {\n if ( isNaN(cur+spent) ) {\n alert( this.lingo.numbersOnly )\n return\n }\n if ( spent < 0 || cur < 0 ) {\n alert( this.lingo.noNegative )\n return\n }\n if ( isNaN(orig) )\n orig = cur\n if ( spent > cur )\n cur = spent\n var text = tiddler.text.substring(0,start) + "<<" + macroName + " " +\n orig + " " + cur + " " + spent + ">>" + tiddler.text.substring(end)\n var title = tiddler.title\n store.saveTiddler( title, title, text, config.options.txtUserName, new Date(), undefined )\n story.refreshTiddler( title, null, true )\n if ( config.options.chkAutoSave )\n saveChanges()\n }\n}\n//}}}\n/***\n!Tasksum Macro\nUsage:\n> {{{<<tasksum "start" ["here" [intro]]>>}}}\nor:\n> {{{<<tasksum "end" [intro]>>}}}\nPut one of the {{{<<tasksum start>>}}} lines before the tasks you want to summarize, and an {{{end}}} line after them. By default, the summary goes at the end; if you include {{{here}}} in the start line, the summary will go at the top. The intro argument, if supplied, replaces the default text introducing the summary.\n***/\n//{{{\nconfig.macros.tasksum = {\n\n // Translatable text:\n lingo: {\n unrecVerb: "<<%0>> requires 'start' or 'end' as its first argument",\n mustMatch: "<<%0 end>> must match a preceding <<%0 start>>",\n defIntro: "Task summary:",\n nascentSum: "''%0 not estimated''",\n doneSum: "%0 complete (in %1 hours)",\n liveSum: "%0 ongoing (%1 hours so far, ''%2 hours remaining'')",\n overSum: "Total overestimate: %0%.",\n underSum: "Total underestimate: %0%.",\n descPattern: "%0 %1. %2",\n origTip: "Total original estimates in hours",\n curTip: "Total current estimates in hours",\n spentTip: "Total hours spent on tasks",\n remTip: "Total hours remaining"\n },\n\n // The macro handler\n handler: function( place, macroName, params, wikifier, paramString, tiddler )\n {\n var sums = tiddler.tasksums\n if ( params[0] == "start" ) {\n if ( ! sums ) tiddler.tasksums = sums = []\n sums.unshift([])\n if ( params[1] == "here" ) {\n sums[0].intro = params[2] || this.lingo.defIntro\n sums[0].place = place\n sums[0].placement = place.childNodes.length\n }\n }\n else if ( params[0] == "end" ) {\n if ( ! sums || ! sums.length )\n throw Error( this.lingo.mustMatch.format([macroName]) )\n var list = sums.shift()\n var intro = list.intro || params[1] || this.lingo.defIntro\n var nNascent=0, nLive=0, nDone=0\n var totLiveSpent=0, totDoneSpent=0\n var totOrig=0, totCur=0, totSpent=0\n for ( var i=0; i < list.length; ++i ) {\n var a = list[i]\n if ( a.length > 3 ) {\n nNascent += a[0]\n nLive += a[1]\n nDone += a[2]\n totLiveSpent += a[3]\n totDoneSpent += a[4]\n totOrig += a[5]\n totCur += a[6]\n totSpent += a[7]\n }\n else if ( isNaN(a[0]) ) {\n ++nNascent\n }\n else {\n if ( a[1] > a[2] ) {\n ++nLive\n totLiveSpent += a[2]\n }\n else {\n ++nDone\n totDoneSpent += a[2]\n }\n totOrig += a[0]\n totCur += a[1]\n totSpent += a[2]\n }\n }\n\n // If we're nested, push a summary outward\n if ( sums.length )\n sums[0].push( [nNascent, nLive, nDone, totLiveSpent, totDoneSpent,\n totOrig, totCur, totSpent] )\n\n var descs = [], styles = []\n if ( nNascent > 0 ) {\n descs.push( this.lingo.nascentSum.format([nNascent]) )\n styles.push( "nascent" )\n }\n if ( nDone > 0 )\n descs.push( this.lingo.doneSum.format([nDone, totDoneSpent]) )\n if ( nLive > 0 ) {\n descs.push( this.lingo.liveSum.format([nLive, totLiveSpent, totCur-totSpent]) )\n styles.push( "live" )\n }\n else\n styles.push( "done" )\n var off = ""\n if ( totOrig > totCur )\n off = this.lingo.overSum.format( [Math.round(100.0*(totOrig-totCur)/totCur)] )\n else if ( totCur > totOrig )\n off = this.lingo.underSum.format( [Math.round(100.0*(totCur-totOrig)/totOrig)] )\n\n var top = (list.intro != undefined)\n var table = createTiddlyElement( null, "table", null, "tasksum "+(top?"top":"bottom") )\n var tbody = createTiddlyElement( table, "tbody" )\n var row = createTiddlyElement( tbody, "tr", null, styles.join(" ") )\n var descCell = createTiddlyElement( row, "td", null, "description" )\n\n var description = this.lingo.descPattern.format( [intro, descs.join(", "), off] )\n wikify( description, descCell, null, tiddler )\n\n var origCell = totOrig == totCur? null\n : createTiddlyElement( row, "td", null, "numeric original", totOrig )\n var curCell = createTiddlyElement( row, "td", null, "numeric current", totCur )\n var spentCell = createTiddlyElement( row, "td", null, "numeric spent", totSpent )\n var remCell = createTiddlyElement( row, "td", null, "numeric remaining", totCur-totSpent )\n\n if ( origCell )\n origCell.setAttribute( "title", this.lingo.origTip )\n curCell .setAttribute( "title", this.lingo.curTip )\n spentCell.setAttribute( "title", this.lingo.spentTip )\n remCell .setAttribute( "title", this.lingo.remTip )\n\n // Discard the table if there are no tasks\n if ( list.length > 0 ) {\n var place = top? list.place : place\n var placement = top? list.placement : place.childNodes.length\n if ( placement >= place.childNodes.length )\n place.appendChild( table )\n else\n place.insertBefore( table, place.childNodes[placement] )\n }\n }\n else\n throw Error( this.lingo.unrecVerb.format([macroName]) )\n\n // If we're wikifying, and are followed by end-of-line, swallow the newline.\n if ( wikifier && wikifier.source.charAt(wikifier.nextMatch) == "\sn" )\n ++wikifier.nextMatch\n }\n}\n//}}}\n/***\n!Taskadder Macro\nUsage:\n> {{{<<taskadder ["above"|"below"|"focus"|"nofocus"]...>>}}}\nCreates a line with text entry fields for a description and an estimate. By default, puts focus in the description field and adds tasks above the entry fields. Use {{{nofocus}}} to not put focus in the description field. Use {{{below}}} to add tasks below the entry fields.\n***/\n//{{{\nconfig.macros.taskadder = {\n\n // Translatable text:\n lingo: {\n unrecParam: "<<%0>> doesn't recognize '%1' as a parameter",\n descTip: "Describe a new task",\n curTip: "Estimate how long in hours the task will take",\n buttonText: "add task",\n buttonTip: "Add a new task with the description and estimate as entered",\n\n eol: "eol"\n },\n\n // The macro handler\n handler: function( place, macroName, params, wikifier, paramString, tiddler )\n {\n var above = true, focus = true\n while ( params.length > 0 ) {\n var p = params.shift()\n switch (p) {\n case "above": above = true; break\n case "below": above = false; break\n case "focus": focus = true; break\n case "nofocus": focus = false; break\n default: throw Error( this.lingo.unrecParam.format([macroName, p]) )\n }\n }\n\n // If we're followed by end-of-line, swallow the newline.\n if ( wikifier.source.charAt(wikifier.nextMatch) == "\sn" )\n ++wikifier.nextMatch\n\n var where = above? wikifier.matchStart : wikifier.nextMatch\n\n var table = createTiddlyElement( place, "table", null, "task" )\n var tbody = createTiddlyElement( table, "tbody" )\n var row = createTiddlyElement( tbody, "tr" )\n var statusCell = createTiddlyElement( row, "td", null, "status" )\n var descCell = createTiddlyElement( row, "td", null, "description" )\n var curCell = createTiddlyElement( row, "td", null, "numeric" )\n var addCell = createTiddlyElement( row, "td", null, "addtask" )\n\n var descId = this.generateId()\n var curId = this.generateId()\n var descInput = createTiddlyElement( descCell, "input", descId )\n var curInput = createTiddlyElement( curCell, "input", curId )\n\n descInput.setAttribute( "type", "text" )\n curInput .setAttribute( "type", "text" )\n descInput.setAttribute( "size", "40")\n curInput .setAttribute( "size", "6" )\n descInput.setAttribute( "autocomplete", "off" );\n curInput .setAttribute( "autocomplete", "off" );\n descInput.setAttribute( "title", this.lingo.descTip );\n curInput .setAttribute( "title", this.lingo.curTip );\n\n var addAction = this.addTask( tiddler, where, descId, curId )\n var addButton = createTiddlyButton( addCell, this.lingo.buttonText, this.lingo.buttonTip, addAction )\n\n descInput.onkeypress = this.handleEnter(addAction)\n curInput .onkeypress = descInput.onkeypress\n if ( focus ) {\n descInput.focus()\n descInput.select()\n }\n },\n\n // Returns a function that inserts a new task macro into the tiddler.\n addTask: function( tiddler, where, descId, curId ) {\n var macro = this\n return wrapEventHandler( function(e) {\n var desc = document.getElementById(descId).value\n var cur = document.getElementById(curId) .value\n var text = tiddler.text.substring(0,where) + "<<task " + cur + ">> "\n + desc + "\sn" + tiddler.text.substring(where)\n var title = tiddler.title\n store.saveTiddler( title, title, text, config.options.txtUserName, new Date(), undefined )\n story.refreshTiddler( title, null, true )\n if ( config.options.chkAutoSave )\n saveChanges()\n } )\n },\n\n // Returns an event handler that handles enter keys by calling another event handler\n handleEnter: function( addTask ) {\n return function(e) {\n if (!e) var e = window.event\n var consume = false\n if ( e.keyCode == 13 || e.keyCode == 10 ) { // Different codes for Enter\n consume = true\n addTask( e )\n }\n e.cancelBubble = consume;\n if ( consume && e.stopPropagation ) e.stopPropagation();\n return !consume;\n }\n },\n\n counter: 0,\n generateId: function() {\n return "taskadder:" + String(this.counter++)\n }\n}\n//}}}\n/***\n!Stylesheet\n***/\n//{{{\nvar stylesheet = '\s\n.viewer table.task, table.tasksum {\s\n width: 100%;\s\n padding: 0;\s\n border-collapse: collapse;\s\n}\s\n.viewer table.task {\s\n border: none;\s\n margin: 0;\s\n}\s\ntable.tasksum, .viewer table.tasksum {\s\n border: solid 2px #999;\s\n margin: 3px 0;\s\n}\s\ntable.tasksum td {\s\n text-align: center;\s\n border: 1px solid #ddd;\s\n background-color: #ffc;\s\n vertical-align: middle;\s\n margin: 0;\s\n padding: 0;\s\n}\s\n.viewer table.task tr {\s\n border: none;\s\n}\s\n.viewer table.task td {\s\n text-align: center;\s\n vertical-align: baseline;\s\n border: 1px solid #fff;\s\n background-color: inherit;\s\n margin: 0;\s\n padding: 0;\s\n}\s\ntd.numeric {\s\n width: 3em;\s\n}\s\ntable.task td.numeric div {\s\n border: 1px solid #ddd;\s\n background-color: #ffc;\s\n margin: 1px 0;\s\n padding: 0;\s\n}\s\ntable.task td.original div {\s\n background-color: #fdd;\s\n}\s\ntable.tasksum td.original {\s\n background-color: #fdd;\s\n}\s\ntable.tasksum td.description {\s\n background-color: #e8e8e8;\s\n}\s\ntable.task td.status {\s\n width: 1.5em;\s\n cursor: default;\s\n}\s\ntable.task td.description, table.tasksum td.description {\s\n width: auto;\s\n text-align: left;\s\n padding: 0 3px;\s\n}\s\ntable.task.done td.status,table.task.done td.description {\s\n color: #ccc;\s\n}\s\ntable.task.done td.current, table.task.done td.remaining {\s\n visibility: hidden;\s\n}\s\ntable.task.done td.spent div, table.tasksum tr.done td.current,\s\ntable.tasksum tr.done td.spent, table.tasksum tr.done td.remaining {\s\n background-color: #eee;\s\n color: #aaa;\s\n}\s\ntable.task.nascent td.description {\s\n color: #844;\s\n}\s\ntable.task.nascent td.current div, table.tasksum tr.nascent td.numeric.current {\s\n font-weight: bold;\s\n color: #c00;\s\n background-color: #def;\s\n}\s\ntable.task.nascent td.spent, table.task.nascent td.remaining {\s\n visibility: hidden;\s\n}\s\ntd.remaining {\s\n font-weight: bold;\s\n}\s\n.adjustable {\s\n cursor: pointer; \s\n}\s\ntable.task input {\s\n display: block;\s\n width: 100%;\s\n font: inherit;\s\n margin: 2px 0;\s\n padding: 0;\s\n border: 1px inset #999;\s\n}\s\ntable.task td.numeric input {\s\n background-color: #ffc;\s\n text-align: center;\s\n}\s\ntable.task td.addtask {\s\n width: 6em;\s\n border-left: 2px solid white;\s\n vertical-align: middle;\s\n}\s\n'\nsetStylesheet( stylesheet, "TaskMacroPluginStylesheet" )\n//}}}\n
Helping the a person for the third time in a month on the same type of issue. Then they say "Imagine how hard this would be if I wasn't so tech savey". What does one say?\n\nLater in the day I am on the phone with a customer's VP of Administration (Whatever that is) talking her through what and how to print files for an upcoming training. Mind you that I was only on the phone with her to verify that she got the e-mail I had just sent as she had lost the first one (Which she says she never got, but somehow managed to reply to me about). \n\nHere is what she was looking at. Please tell me if it seems too Complex for you to follow.\n----\n1) Please print copies of these files for each participant: \n{{{File: PANF - Handout.doc File: PANF - HandoutSlides.doc File: HerCompany'sName.pdf }}} \n\n2) Please read the "Read First" file, then print one master copy of the "EAP Customer Training Participant Evaluation" file: \n{{{ File: Read First 2005.rtf File: EAP Customer Training Participant Training Evaluation.PDF }}}\n\n3) And then hand write-in the information below in the upper right corner of the Evaluation and make a copy of it for each participant: \n Train Date = 08/01/06\n Request = 02702\n Event = <BLANK โNo longer used>\n\n4) Please have the PowerPoint slideshow set-up and ready to show on the day of the training: \n{{{ File: PANF - Slideshow.pps }}} \n----\nSo do you understand what to do? Or should we be paying you $100k a year to think lofty thoughts and not be able to follow English?
\n<<tasksum start here>>\n<<task 155.12>> Cable & Internet\n<<task 150>> Electric\n<<task 67.38>> Phone\n<<task 150>> Natural Gas\n<<task 80>> Water (on even months)\n<<task 40>> Savings\n<<task 200>> OurBooth\n<<taskadder>>\n<<tasksum end>>
http://webhuddle.com is looking good
<<forEachTiddler\n where\n 'tiddler.tags.contains("contact") && tiddler.data("firstname") == "Joe"'\n write\n '"|[["+tiddler.title+"]] | mailto:"+tiddler.data("email")+" | "+tiddler.data("phone")+" |\sn"'\n>>
You are a stag, a male deer. So are the other players. You meet each other in an endless forest on the internet. The setting is idyllic, the atmosphere peaceful. You communicate with one another through sounds and body language.\n\n\nThe Endless Forest is a social screensaver, a virtual place where you can play with your friends. When your computer goes to sleep you appear as a deer in this magical place. There are no goals to achieve or rules to follow. You just steer your deer through the forest and see what happens. \n\nhttp://tale-of-tales.com/TheEndlessForest/index.html\n----\nI don't even know what to say about it. Think of it as being relaxing... maybe.
\n!Safe colors for computers \nMaking the color of the $100 laptop off limits so anyone with one who is not a kid is obviously a thief. Maybe the same for Gov/law enforcment. Different colors for each.\n!Photo stories\nCombine real photos and webcomics...but not really webcomics. More like storyboards for movies. Great use for the plugin that allows only 1 or 2 tiddlers at a time. \n!Jill Jet - Stupid patents\nThe Jill Jet is a perfect example of a stupid patent. Women (and men) have been doing the same thing since the hottub was invented. All Penn did was move the location of the nozzle from the wall to the seat. Why is this a patentable idea? You want prior art? I can show you a dozen movies and stories with this idea in it.
\n|Home Phone: | 816-505-2014|\n|Cell Phone: | 816-352-6559|\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | http://www.xanga.com/JesusKilledMe|\n|Address: | |\n|City, State, Zip: | Kansas City, MO|\n\nBirthdate: <<reminder year:2006 month:6 day:25 title:"TianaDuda B-day" >>
^^Borrowed from: http://knighjm.googlepages.com/knightnet-default-tw.html^^\n!Functions\n* {{{wikify('text' + "\sn",place)}}} - Inserts formatted text to the tiddler. The \sn on the end will ensure that the next output starts on a new line\n* {{{var objDom = createTiddlyElement(place,"div",null,null,'html text')}}} - Creates a new Dom object at "place" in the tiddler. Returns a reference to that object which can be used for another call instead of "place", this would embed the 2nd object within the first (e.g. TR within TABLE).\n* {{{createTiddlyLink(place,tiddler[params[0]],true);}}}\n* {{{createTiddlyText( place, 'text' )}}}\n* {{{tiddlerExists(title)}}}\n!Objects\n* {{{store.getTiddler(tiddlerName)}}} - Returns a tiddler __object__ referenced by tiddler name\n* {{{store.getTiddlerText(tiddlerName)}}} - Return the __text__ of the named tiddler.\n* {{{store.getTaggedTiddlers(tiddlerName)}}} - Return __list__? of tiddlers with the named tag?\n* {{{[story.]findContainingTiddler(place)}}} - Returns a tiddler __object__ from the __outermost__ //current// tiddler (e.g. in a macro called from within a tiddler). To get the __innermost__ tiddler, use the callingTiddler parameter on the macro handler function (the last parameter, see below).\n* {{{config.macro....}}}\n* {{{store.getTags()}}}\n!Attributes\n* {{{objTiddler.getAttribute("tiddler")}}} - Returns the __text__ of the tiddler name\n* {{{objTiddler.created}}} - Returns a __date/time__ object containing the created date for the tiddler\n* {{{objTiddler.modified}}} - Returns a __date/time__ object containing the modified date for the tiddler\n* {{{objTiddler.tags}}} - Return an array of the tags for the tiddler\n!New Macro\nPut in a tiddler tagged with "systemConfig" then reload the TW.\n{{{\nversion.extensions.helloWorld = {major: 0, minor: 1, revision: 0,\n date: new Date(2006,3,5), source: "http://somewhere/#tiddlerName"};\n\nconfig.macros.helloWorld = {\n /* ... Define vars for the macro here ...*/\n text: "Hello"\n};\nconfig.macros.helloWorld.handler = function(place,macroName,params) {\n /* ... Do stuff here ... */\n /* NB: Here is the full list of parms for the function call:\n function(place,macroName,params,wikifier,paramString,callingTiddler) */\n}\n}}}\nThis would be called with {{{<<helloWorld param1 param2 ...>>}}}. "place" is a reference to the location of the macro call in the tiddler.\n!!Function Parameters\n{{{place}}} - the dom object from where the macro was called. This allows you to create a button or anything you want right where the {{{<<mymacro>>}}} was.\n{{{params}}} - an array of params passed to your macro when it was called. They can be single or double quoted or use double square brackets. {{{<<mymacro my "first macro" [[this fine morning]]}}} becomes:\nparams[0] = my\nparams[1] = first macro\nparams[2] = this fine morning\n{{{wikifier}}} - I'm not sure about this one. I guess it's a refrence the the wikifier that initiated this macro call. Maybe someone can clarify\n{{{paramString}}} - the unparsed parameters. From the previous example... {{{paramString = my "first macro" [[this fine morning]]}}}\n{{{tiddler}}} (or callingTiddler) = the tiddler __object__ that the macro was in when it was called. You can use tiddler.title to find it's name (the title attribute of the object). This variable is not supplied if the macro was called from a tiddler that isn't in the "story" column in the middle of the wiki. That is, if you macro was called from the main menu or sidebar, it doesnt get passed 'tiddler'. I'm not sure why. Also note that this is the innermost host tiddler. If the macro is called from a tiddler embeded in another tiddler using the <<tiddler>> macro, this returns the immediate host not the outer host (to find that, use {{{store.getTiddler(story.findContainingTiddler(place).getAttribute("tiddler"))}}}.\n!Tiddler Object\n* {{{tObj.text}}} - the content of the tiddler\n* {{{tObj.tags}}} - the tags of the tiddler\n!New Wikifier\nSee [[betterFormatterPlugin]] for example.\n!Examples\n{{{\n// Get the text for the outermost host tiddler\nvar tiddler=store.getTiddler(story.findContainingTiddler(place).getAttribute("tiddler"));\n// Get the last modified date of the innermost host tiddler\nvar out=tiddler.modified.formatString("MMM DDth YYYY");\n// If the host tiddler is not new, get the created date of the inermost host tiddler\nif (tiddler.modified.getDate()!=tiddler.created.getDate())\n out+=" (created "+tiddler.created.formatString("MMM DDth YYYY")+")";\n// Get the outermost host tiddlers title (if the macro is called from within a host tiddler)\nif(tiddler instanceof Tiddler)\n var currTitle = store.getTiddler(story.findContainingTiddler(place).getAttribute("tiddler")).title;\nelse\n var currTitle = '';\n}}}
/***\n|''Name:''|TiddlerListMacro|\n|''Version:''|2.0.10 (01-May-2006)|\n|''Source''|http://jackparke.googlepages.com/jtw.html#TiddlerListMacro ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%23TiddlerListMacro]])|\n|''Author:''|[[Jack]]|\n|''Type:''|Macro|\n|''Documentation:''|TiddlerListMacroDocumentation|\n!Usage\n{{{<<tiddlerList parameter1:"value1" parameter2:"value2" ...>>}}}\nSee TiddlerListMacroDocumentation and TiddlerListMacroExamples\n!Code\n***/\n//{{{\nversion.extensions.tiddlerList = {major: 2, minor: 0, revision: 10, date: new Date("May 2, 2006")};\n// template = [header, item, seperator, group, footer]\nconfig.macros.tiddlerList={\n formats : {list:true, nlist:true, span:true, stack:true, csv:true, table:true},\n templates : {\n list : [ "%0\sn", "* %0\sn", "", "%group\sn", "%0\sn"],\n nlist : [ "%0", "# %0\sn", "", "%group\sn", "%0\sn"],\n span : [ "%0", "%0", " ", "%group", "%0"],\n stack : [ "%0", "%0", "\sn", "%group", "%0"],\n csv : [ "%0", "%0", ", ", "%0", "%0\sn"],\n table : ["|!%0|\sn", "|%0|\sn", "", "|%group|\sn", "|%0|\sn"]\n },\n dateFormat : "DD MMM YYYY"\n}\n\nif (!gCurrentTiddler)\n var gCurrentTiddler;\n\nconfig.macros.tiddlerList.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n // Some globals\n var count=0, groupCount=0, theGroup="", lastGroup="";\n var currentTiddler = tiddler;\n gCurrentTiddler = tiddler;\n var listWikiText="";\n var formats = this.formats;\n \n // SQL-Like parameters\n var parameters = paramString.parseParams("name",null,true);\n var pTags = parameters[0]["tags"]?parameters[0]["tags"][0].split(","):[];\n var pOrder = parameters[0]["order"]?parameters[0]["order"][0]:"title";\n var pTop = parameters[0]["top"]?parameters[0]["top"][0]:-1;\n var pText = parameters[0]["text"]?parameters[0]["text"][0]:"";\n var pTitle = parameters[0]["title"]?parameters[0]["title"][0]:"";\n var pSearch = parameters[0]["search"]?parameters[0]["search"][0]:"";\n var pFilter = parameters[0]["filter"]?parameters[0]["filter"][0]:"";\n var pHeader = parameters[0]["header"]?paramFormat(parameters[0]["header"][0]):"";\n var pFooter = parameters[0]["footer"]?paramFormat(parameters[0]["footer"][0]):"";\n var pGroup = parameters[0]["group"]?parameters[0]["group"][0]:"";\n var pDateFormat = parameters[0]["dateFormat"]?parameters[0]["dateFormat"][0]:this.dateFormat;\n var pCustomParameter = parameters[0]["customParameter"]?parameters[0]["customParameter"][0]:"";\n var pFormat = parameters[0]["format"]?parameters[0]["format"][0]:"list";\n pFormat = formats[pFormat]?pFormat:"list"\n \n // Seperator\n var pSeperator = parameters[0]["seperator"]?paramFormat(parameters[0]["seperator"][0]):this.templates[pFormat][2]\n\n // Template for group\n var pGroupTemplate = this.templates[pFormat][3];\n if (parameters[0]["groupTemplate"])\n pGroupTemplate = paramFormat(parameters[0]["groupTemplate"][0])\n pGroupTemplate = pGroupTemplate.replace("$))", ">>")\n \n // Template for group footer\n var pGroupFooterTemplate = "";\n if (parameters[0]["groupFooterTemplate"])\n pGroupFooterTemplate = paramFormat(parameters[0]["groupFooterTemplate"][0])\n pGroupFooterTemplate = pGroupFooterTemplate.replace("$))", ">>")\n \n // Template for item\n var pItemTemplate = this.templates[pFormat][1];\n if (parameters[0]["itemTemplate"])\n pItemTemplate = paramFormat(parameters[0]["itemTemplate"][0])\n pItemTemplate = pItemTemplate.replace("$))", ">>").replace("%link", "%0").replace("%item", "%1").replace("%abstract", "%2").replace("%text", "%3").replace("%created", "%4").replace("%modified", "%5").replace("%modifier", "%6").replace("%group", "%7").replace("%title", "%8").replace("%tags", "%9").replace("%nolink", "%10").replace("%custom", "%11")\n // Template for footer\n var pFooterTemplate = this.templates[pFormat][4].replace("%count", "%1")\n\n // Get all tiddlers\n var tiddlers = store.reverseLookup("tags","excludeLists",false);\n\n // Sorting\n if(!pOrder)\n pOrder = "title";\n if (pOrder.match(/^\s-/i)) {\n pOrder = pOrder.substr(1)\n var sortDesc = true;\n }\n if (sortDesc)\n tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] > b[pOrder]) ? -1 : +1; });\n else\n tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] < b[pOrder]) ? -1 : +1; });\n\n // Header\n if (pHeader)\n listWikiText += formatItem(this.templates[pFormat][0], [pHeader], pFormat)\n \n for(var t=0; t<tiddlers.length; t++) {\n tiddler = tiddlers[t];\n if (pTop==-1 || count<pTop) {\n if (pText=="" || tiddler.text.match(pText)) {\n if (pTitle=="" || tiddler.title.match(pTitle)) {\n if (pSearch=="" || (tiddler.title.match(pSearch) || tiddler.text.match(pSearch))) {\n if (pFilter=="" || eval(pFilter)) {\n if (pTags.length==0 || compareArrays(tiddler.tags, pTags, "all")) {\n count++;\n // Grouping\n if (pGroup) {\n theGroup = eval(pGroup);\n if(theGroup != lastGroup) {\n groupCount++;\n if (pGroupFooterTemplate && groupCount>1)\n listWikiText += pGroupFooterTemplate.replace("%group", theGroup)\n listWikiText += pGroupTemplate.replace("%group", theGroup)\n lastGroup = theGroup;\n }\n }\n // Seperators\n if (count>1) listWikiText += pSeperator;\n //Plaintext title\n var noLink = tiddler.title.match(config.textPrimitives.wikiLink)?"~" + tiddler.title:tiddler.title;\n // Custom parameter\n if (pCustomParameter)\n var custom="";\n try {\n custom = eval(pCustomParameter)\n } catch (e) {}\n // List individual tiddler\n listWikiText += formatItem(pItemTemplate,["[[" + tiddler.title + "]]",count,tiddler.text.substr(0,100),tiddler.text,tiddler.created.formatString(pDateFormat),tiddler.modified.formatString(pDateFormat),tiddler.modifier,theGroup,tiddler.title,tiddler.tags.join(" "),noLink,custom], pFormat)\n }\n }\n }\n }\n }\n }\n }\n \n // Last group footer\n if (pGroup && pGroupFooterTemplate && count>0)\n listWikiText += pGroupFooterTemplate.replace("%group", theGroup)\n\n // Footer\n if (pFooter) {\n pFooter = pFooter.replace("%count", count)\n listWikiText += formatItem(pFooterTemplate, [pFooter], pFormat)\n }\n \n // Render result\n if (!parameters[0]["debug"])\n wikify(listWikiText,place, null, currentTiddler)\n else\n place.innerHTML = "<textarea style=\s"width:100%;\s" rows=30>" + listWikiText + "</textarea>"\n \n \n // Local functions\n \n function paramFormat(param) {\n // Allow "\sn" in non evalled parameters\n return param.replace(/\s\sn/g, "\sn");\n }\n \n function formatItem(template, values, format) {\n // Fill template with values (depending on list format)\n if (format.match(/table/) && values[0].match(/\s|/))\n return ("%0\sn").format(values)\n else\n return template.format(values)\n }\n \n function compareArrays(array, values, logic) {\n // Compare items in array with AND("all") or OR("any") logic\n var matches=0;\n for(var v=0; v<values.length; v++)\n if(values[v].match(/^\s-/) && !array.contains(values[v].substr(1)))\n matches++;\n else if (array.contains(values[v]))\n matches++;\n return ((logic=="all" && matches==values.length) || (logic!="all" && matches>0))\n }\n \n}\n\nString.prototype.prettyTrim = function(len,prefix,postfix) {\n var result = this.trim().replace(/\sr\sn/g,' ').replace(/\sn/g,' ');\n if (!prefix) prefix = '';\n if (!postfix) postfix = '';\n if (result.length > len - 3)\n return prefix + result.substr(0,len) + '...' + postfix;\n else if (result.length > 0)\n return prefix + result + postfix;\n else\n return result;\n}\n\n//}}}
This site uses the [[TiddlyWiki|http://www.tiddlywiki.com/]] software. The whole site is basically one whole webpage or HTML page.\n\nIt's written in HTML, CSS and ~JavaScript to run on any modern browser without needing any ~ServerSide logic. It allows me to create a ~SelfContained hypertext documents that can be posted to a ~WebServer, sent by email or kept on a USB thumb drive. To save this site to your disk/usb pen right click [[here|index.htm]] and select save link as or save target as.\n\nYou've just opened your first ''Tiddler''. A Tiddler is a chunk of information, or content, about a particular topic. This chunking of information is part of what makes ~TiddlyWiki so powerful. Human minds are not built to take in long passages of information very well; we're a lot better at taking information in small chunks.\n\nAs you open up each Tiddler the remaining ones stay on the same page. When you hover your mouse over the Tiddler a small menu appears.You can ''close'' the individual Tiddler you are reading or ''close others'' closes all bu that paticular Tiddler.\n\n''Jump'' will open other Tiddlers on the page that are already open.\n\n''Tags'' is a quick link to other pages which are similar.\n\n''Animations'' as a default the animations are switched on. However, you may switch them off yourself. Do this by clicking on ''options'' on the right menu and untick {{{Enable Animations}}}\n\n''Permaview'' on the right hand menu will create a URL in your browsers top address bar to include all the Tiddlers you have open on your page. (for Example if you want the page with just the 19th century rules you would click on permaview and get the following URL:\n{{{\nhttp://www.freewargamesrules.co.uk/beta.html#%5B%5B19th%20Century%5D%5D\n\n}}}\n\nYou could then copy this and use it for links on your site or send it to someone in an e-mail.\n\nThe ''Timeline'' on the right hand menu shows which pages have been updated on which date.\n\n''In the Firefox browser I get the error message //Unresponsive Script// and wants me to click on stop or contine''\nThis is an issue with Firefox, that the default settings for the browser to think there is something wrong with the scripts on the page to 5 seconds. This is not long enough for this website. To increase the time and stop the error messages in Firefox type about:config in the address bar. Then search for dom.max_script_run_time . Change the default time to ''20 seconds''.\n\nIf you would like more information on how to use [[TiddlyWiki|http://www.tiddlywiki.com/]] visit this [[tutorial|http://www.blogjones.com/TiddlyWikiTutorial.html]]\n----\n|Copied from: http://www.freewargamesrules.co.uk/#wiki A great TiddlyWiki site designed as a repository for links to rules for miniature wargames. Go check it out.|
Here is a reference for the markup "language" used. See also [[Internal Macros]] (especially for the {{{<<br>>}}} macro that throws a new line).\n!Basic Formatting\n|!Format|!Markup|!Example|\n|Bold|{{{''Bold''}}} (2 single quotes)|''Bold''|\n|Highlight|{{{@@Highlight@@}}}|@@Highlight@@|\n|CSS Extended Highlights|{{{@@some css;Highlight@@}}}<<br>>For backwards compatibility, the following highlight syntax is also accepted:{{{@@bgcolor(#ff0000):color(#ffffff):red coloured@@}}}|@@background-color:#ff0000;color:#ffffff;red coloured@@<<br>><<slider AtEg ./atEg 'Extended example ...'>>|\n|Custom CSS Class|{{{ {{wrappingClass{Text that is now accentuated}}} }}}<<br>>By default, the text is placed in a <span>. To use a <div> instead, insert a line break before the text (after the single {)|Add .wrappingClass to StyleSheet|\n|Italic|{{{//Italic//}}}|//Italic//|\n|Monospaced text|{{{{{{ ... }}}}}}|{{{Monospaced text}}}|\n|Monospaced block multiline|Put {{{{{{}}} and {{{}}}}}} on their own lines|<html><pre>{{{<br/>Monospaced<br/>Multi-line<br/>Block<br/>}}}</pre></html>|\n|Strikethough|{{{==Strikethrough==}}}|==Strikethrough==|\n|Subscript|{{{~~Subscript~~}}}|Text~~Subscript~~|\n|Superscript|{{{^^Superscript^^}}}|Text^^Superscript^^|\n|Underlined|{{{__Underline__}}}(2 underscores)|__Underscored__|\n|Any HTML|{{{<html>any valid xhtml</html>}}}||\n!"Document" Structure\n|!Format|!Markup|!Example|\n|Headings|{{{!Heading 1}}}<<br>>{{{!!Heading 2}}}|<html><h1>Heading 1</h1><h2>Heading 2</h2><h3>Heading 3</h3><h4>Heading 4</h4><h5>Heading 5</h5></html>|\n|Any HTML|{{{<html>any valid xhtml</html>}}}||\n|Block quotes|{{{>Blockquote}}}<<br>>Can be nested using multiple >|<html><blockquote>Blockquote<blockquote>Nested Blockquote</blockquote></blockquote></html>|\n|Blockquotes - Multiline|<html><tt><<<</tt><br/>multi-line<br/>blockquote<br/><tt><<<</tt></html> |<html><blockquote>multi-line<br/>blockquote</blockquote></html>|\n|Horizontal Rule|{{{----}}} (4 dashes on a line of their own)|<html><hr></html>|\n|Images|{{{[img[favicon.ico]]}}}<<br>>Note that image files are always external to the TW file|[img[http://www.tiddlywiki.com/favicon.ico]]|\n|Inline Comments|{{{/% .... %/}}}<<br>>Text between the markers will not be shown in view mode|Not shown: /% Not Shown %/|\n|Links|Any WikiWord (creates a link to a tiddler whether it exists or not)|PageTemplate|\n|~|{{{[[Manual Link]]}}} (Especially for tiddlers with spaces in their titles)|[[Table of Contents]]|\n|~|{{{[[Pretty Link|Some Crafty Link]]}}}<<br>>Note: Makes an external link if the target does not yet exist|[[Pretty Link|MainMenu]]|\n|~|Automatic external link {{{http://www.knightnet.org.uk}}}|http://www.knightnet.org.uk|\n|~|Pretty external link<<br>>{{{[[My Home Page|http://www.knightnet.org.uk]]}}}|[[My Home Page|http://www.knightnet.org.uk]]|\n|~|OS Folder link<<br>>Windows Share: {{{file://///server/share}}}<<br>>Windows Local: {{{file:///c:/folder/file}}}<<br>>Un*x Local File: {{{file://folder/file}}}<<br>>Relative File: {{{folder/file}}}||\n|List - Bulleted|{{{* List entry}}}|<html><ul><li>Bullet List</li></ul></html>|\n|List - Numbered|{{{# List entry}}}|<html><ol><li>Numbered List</li></ol></html>|\n|List - Nested|Both list types can be nested by using multiple * or #<<br>>Note that * and # must be the first character of the line as with all block format markup||\n|Tables| {{{|}}} |Column Seperator |\n|~| {{{!}}} |Header (Row or Column) |\n|~| {{{>}}} |Column Span |\n|~| {{{~}}} |Row Span |\n|~| {{{|Left |}}} |Left Align |\n|~| {{{| Right|}}} |Right Align|\n|~| {{{| Center |}}} |Center Align |\n|~| {{{|Caption|c}}} |Table Caption (Can be at top or bottom)|\n|Table Sample|{{{|}}} !header {{{|}}} !header {{{|}}}<html><br/></html>{{{|>|}}}colspan=2 {{{|}}}<html><br/></html>{{{|}}} rowspan {{{|}}}left align {{{|}}}<html><br/></html>{{{|}}}~{{{|}}} center {{{|}}}<html><br/></html>{{{|}}}bgcolor(green):green{{{|}}} right{{{|}}}<html><br/></html>{{{|}}}table caption{{{|}}}c<html><br/></html> |<html><table width="80%" border=1><tbody><tr><th align="center">header</th><th align="center">header</th></tr><tr><td colspan="2" align="center">colspan="2"</td></tr><tr><td rowspan="2" align="center">rowspan</td><td align="left">left align</td></tr><tr><td align="center">centered</td></tr><tr><td bgcolor="green">green</td><td align="right">right</td></tr><caption valign="bottom">table caption</caption></tbody></table></html>|\n!Notes\nYou can use the custom CSS formatter in combination with headers and lists to allow new lines within the entry. e.g.:\n{{{\n#{{block{\nBullet 1\nSome text in the same bullet (Note that "block" can be anything, it is the formatters CSS class name)\n }}}\n# Bullet 2 \n}}}\n#{{block{\nBullet 1\nSome text in the same bullet\n}}}\n# Bullet 2 \n\n(Julian Knight, 2006-04-20)\n<part atEg hidden>\n{{{\nThis is before the indented text\n@@display:block;margin-left:2em;This text will be indented...\n...and can even span across several lines...\n\n...or even include blank lines.\n@@This is after the indented text \n}}}\nThis is before the indented text\n@@display:block;margin-left:2em;This text will be indented...\n...and can even span across several lines...\n\n...or even include blank lines.\n@@This is after the indented text \n</part>
Ideas to try in TW\n\n\n<<gtdAction "RatingStars" "@computer">>\n<<gtdAction "OfficeRomance Translator" "@computer">>\n<<gtdAction "E-mailing tiddlers" ""@computer">>\n<<gtdAction "tsUser link" ""@computer">>\n<<gtdAction "Multi Day Reminders" "unfiled">>\n<<list tagged "TiddlyWikiIdeas">>
Home Phone: 636-255-0665\nCell Phone: \nWork Phone: \nE-mail: <<email nyxnexus at charter dot com>>\nIM Handle: \nWebsite: http://www.focusedattention.org\nAddress: 3204 Town & Country Lane\nCity, State, Zip: St. Charles, MO 63301\nBirthdate: *<<reminder month:12 day:20 title:"TimMetza Birthday">>\n\nEnter other Details as desired.
Service: DJ\n----\n\n|Home Phone: | |\n|Cell Phone: | 314-220-0738|\n|Work Phone: | |\n|E-mail: | <<email blank at blank dot com>>|\n|IM Handle: | |\n|Website: | |\n|Address: | |\n|City, State, Zip: | St. Louis, MO|\n\nBirthdate: \n
/***\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName nolabel>>Click me}}}|Same but hide the label|<<toggleTag TagName TiddlerName nolabel>>Click me|\n(Note if TiddlerName does exist it will be silently created)\n\n!Known issues\n* Doesn't smoothly handly the case where you toggle a tag in a tiddler that is current open for editing. Should it stick the tag in the edit box?\n\n!Code\n***/\n//{{{\n\n\n// This function contributed by Eric Shulman\nfunction toggleTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)==null) t.tags.push(tag)\n else t.tags.splice(t.tags.find(tag),1)\n}\n\n// This function contributed by Eric Shulman\nfunction isTagged(title,tag) {\n var t=store.getTiddler(title); if (!t) return false;\n return (t.tags.find(tag)!=null);\n}\n\nconfig.macros.toggleTag = {};\nconfig.views.wikified.toggleTag = {fulllabel: "[[%0]] [[%1]]", shortlabel: "[[%0]]", nolabel: "" };\n\nconfig.macros.toggleTag.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if(tiddler instanceof Tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var hidelabel = params[2]?true:false;\n\n var onclick = function(e) {\n if (!e) var e = window.event;\n if (!store.getTiddler(title))\n store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);\n toggleTag(title,tag);\n\n store.setDirty(true); // so TW knows it has to save now\n\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n\n return false;\n };\n\n var lingo = config.views.wikified.toggleTag;\n\n // this part also contributed by Eric Shulman\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onclick;\n place.appendChild(c);\n c.checked=isTagged(title,tag);\n\n if (!hidelabel) {\n var label = (title!=tiddler.title)?lingo.fulllabel:lingo.shortlabel;\n wikify(label.format([tag,title]),place);\n }\n }\n}\n\n//}}}\n
Bulk buy
\n|Home Phone: | |\n|Cell Phone: | 618-520-2568|\n|Work Phone: | |\n|E-mail: | <<email facetioustom at hotmail dot com>>|\n|IM Handle: | facetioustom (msn)|\n|Website: | |\n|Address: | |\n|City, State, Zip: | St. Louis, MO|\n\nBirthdate: \n
Basically nothing more then a < < macro that will allow a pop-up/tooltip to appear over words. I think someone was trying to build one that showed the text of the tiddle the link went to. have to look into this
This might just be the saddest example of the stupidity of Joe Average I have ever seen.\n\n<html><p><strong>Top Search Terms Driving Traffic to All Sites: Week Ending July 8, 2006</strong><img alt="searchterms7806.png" src="http://weblogs.hitwise.com/bill-tancer/searchterms7806.png" width="550" height="441" /></p></html>\n\nWhy is it sad? The top 20 things searched for on the internet...web page addresses? 0.79% are folks typing in the full web address in a search engine. WHY? That is like walking a mile so you can catch a bus that will take you to the mall that is 100 feet from your house.
http://stlouis.craigslist.org/\nhttp://www.eventsetter.com/\n\n\n<<reminder date:15 month:7 year:2006 title:"Update web advertising ">>
If you are connected to the Internet, you can always get the latest version of this application. There are ''three'' ways you can do this:\n\nClick the following button if you simply want to get the latest changes to any of the core tiddlers that make up this application. These tiddlers are tagged "gtd", and updating in this way will not overwrite any of the core tiddlers that you may have changed unless the core tiddlers are even newer than your changes. This is the recommended way to get updates:\n**<<importUpdates "http://www.dcubed.ca/gtd-update.html">>\n\nClick the following button if you would like to get the latest changes to any of the core tiddlers, but to interactively approve each and every updated tiddler as it is loaded into your system. If there are no updated tiddlers, you will not be prompted and the update will exit quietly:\n**<<importUpdates "http://www.dcubed.ca/gtd-update.html" updates "Update interactively" "Click here to interactively update the application" ask>>\n\nClick the following button if you want to download all of the core tiddlers, regardless of their modification date. Use this to absolutely ensure that you are running with the core application as it was originally written:\n**<<importUpdates "http://www.dcubed.ca/gtd-update.html" all "Update everything">>\n\n''For your safety, your file will be saved and a backup file will be automatically generated before any update is performed.''\n\n!!Update ~TiddlyWiki\nAs a convenience, you can easily update the ~TiddlyWiki core used by this application by clicking on the following button:\n**<<twupdate "Update TiddlyWiki">>\n\nNote that you do not //need// to use this to update ~TiddlyWiki; you can always use [[this technique|http://www.tiddlywiki.com/#HowToUpgrade]]. But a single click seems a whole lot easier!\n\n!!Import and export\nIf you want finer-grained control over moving tiddlers in and out of this system, the following tools will do the job:\n\n** +++[Import...|Import selected tiddlers from another wiki]<<importTiddlers inline>>===\n\n** +++[Export...|Export selected tiddlers from this wiki]<<exportTiddlers inline>>===\n
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 1/7/2006 21:14:22 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 3/7/2006 12:22:34 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 3/7/2006 13:34:30 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 5/7/2006 9:16:48 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 5/7/2006 13:34:29 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 5/7/2006 13:36:57 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 5/7/2006 14:20:55 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 5/7/2006 14:33:0 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 5/7/2006 15:0:42 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 5/7/2006 15:9:2 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 6/7/2006 10:52:54 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 6/7/2006 11:15:10 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 6/7/2006 12:42:39 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 6/7/2006 14:30:0 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 6/7/2006 16:30:2 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 12/7/2006 21:29:12 | KenGirard | [[index.html|file:///C:/Documents%20and%20Settings/Dark%20Lady/My%20Documents/My%20Webs/No-Sin/wiki/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/7/2006 0:26:23 | KenGirard | [[index.html|file:///C:/Documents%20and%20Settings/Dark%20Lady/My%20Documents/My%20Webs/No-Sin/wiki/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/7/2006 8:49:14 | KenGirard | [[index.html|http://tiddlyspot.com/BrainDump/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/7/2006 9:38:14 | KenGirard | [[index.html|http://tiddlyspot.com/BrainDump/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/7/2006 16:39:54 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/7/2006 16:40:51 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/7/2006 16:42:28 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/7/2006 16:46:36 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 14/7/2006 14:15:5 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 14/7/2006 15:48:16 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 14/7/2006 16:44:35 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 17/7/2006 7:57:51 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 17/7/2006 8:34:22 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . | Ok |\n| 17/7/2006 10:29:40 | KenGirard | [[index.html|file:///U:/Moose/Wikis/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 26/7/2006 15:55:41 | KenGirard | [[index.html|file:///E:/TiddlyWiki/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 2/8/2006 8:3:1 | KenGirard | [[index.html|file:///H:/TiddlyWiki/index.html]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 2/8/2006 8:17:5 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 17/8/2006 8:26:12 | KenGirard | [[/|http://tiddlyspot.com/BrainDump/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 5/9/2006 22:51:52 | YourName | [[/|http://braindump.tiddlyspot.com/#NewerTiddlerPlugin]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 5/9/2006 22:53:25 | YourName | [[/|http://braindump.tiddlyspot.com/#NewerTiddlerPlugin]] | [[store.php|http://braindump.tiddlyspot.com/store.php]] | | index.html | |\n| 13/9/2006 9:44:27 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 13/9/2006 9:47:24 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://braindump.tiddlyspot.com/store.php]] | | index.html | |\n| 14/9/2006 10:35:28 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 14/9/2006 10:37:36 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://braindump.tiddlyspot.com/store.php]] | | index.html | |\n| 14/9/2006 11:23:56 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 14/9/2006 13:11:56 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://braindump.tiddlyspot.com/store.php]] | | index.html | |\n| 10/10/2006 11:0:50 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 10/10/2006 11:8:26 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 10/10/2006 11:9:33 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://braindump.tiddlyspot.com/store.php]] | | index.html | |\n| 10/10/2006 12:27:13 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://tiddlyspot.com/BrainDump/store.php]] | . | index.html | . |\n| 10/10/2006 12:28:4 | KenGirard | [[/|http://braindump.tiddlyspot.com/]] | [[store.php|http://braindump.tiddlyspot.com/store.php]] | | index.html | |
!Options used by UploadPlugin\nUsername: <<option txtUploadUserName>>\nPassword: <<option pasUploadPassword>>\n\nUrl of the [[store.php]] script^^(1)^^: <<option txtUploadStoreUrl 50>>\nRelative Directory to store the file^^(2)^^: <<option txtUploadDir 50>>\nFilename of the uploaded file^^(3)^^: <<option txtUploadFilename 40>>\nDirectory to backup file on webserver^^(4)^^: <<option txtUploadBackupDir>>\n\n^^(1)^^Mandatory either in UploadOptions or in MacroParameter\n^^(2)^^If empty stores in the [[store.php]] directory\n^^(3)^^If empty takes the actual filename\n^^(4)^^If empty existing the file with same name on webserver will be overwriten\n\n!Upload\n{{{<<upload [[UploadStoreUrl]}}}^^(1)^^{{{ [UploadFilename] [UploadBackupDir]]>>}}}\n\n<<upload>>
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 3, \n date: new Date(2006,6,30),\n type: 'macro',\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n docs: 'http://tiddlywiki.bidix.info/#UploadPluginDoc'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n var size = 15;\n if (params[1])\n size = params[1];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.dirname(storeUrl)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (storeUrl === '') {\n config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) { }\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir\n + ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n request.open("POST", storeUrl, true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n request.open("GET", document.location.toString(), true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]));\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.shadowTiddlers.UploadPluginDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadPluginDoc ]]\sn"; \n\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n}\n\n//}}}\n////===
<div class='toolbar'>\n<span style="padding-right:0.75em;" macro='email1'></span> \n<span macro='toolbar top permalink references jump collapseOthers closeOthers +editTiddler collapseTiddler -closeTiddler'></span></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[0DD MMM YYYY]]'></span> (created <span macro='view created date [[0DD MMM YYYY]]'></span>)</div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
http://www.visibone.com/products/cardcollection.html
Work: 314-387-4010\n* Enter 75850 and press #. \n* Enter Password and press #.\n* Press 3 to change a greeting.\n* To change your Out of Office greeting (greeting #2) press 1 and then press 2. Begin speaking after the tone. Press # when finished. \n* To use this greeting for all calls, press 1. Your out of office greeting is now setโฆRemember to change back to greeting #1 when you return to the office.\n
|Name |E-mail |Cell |Home |\n<<forEachTiddler\n where\n 'tiddler.tags.contains("booty") && tiddler.tags.contains("contact")' \n sortBy 'tiddler.title'\n write \n '"|[["+tiddler.title+"]]|<<email "+tiddler.data("e-mail1")+" at "+ tiddler.data("e-mail2")+ "$)) | "+ tiddler.data("cellphone") + "| "+tiddler.data("homephone")+" |\sn"'\n>>\n
http://www.goplacez.com/gp/ListCompany.php\nhttp://www.eventsetter.com/\nhttp://www.craftlister.com/\nhttp://stlouis.craigslist.org/\n\nPirateFest
http://www.visibone.com/font/FontResults.html \nJust the place for MySpace users to go find out what fonts to design their site in. Kids, just scroll to the bottom of the page and pick your own unique font. Remember, only losers don't have the font you pick.\n\nOf course you could go here and take test 2 to contribute to the number of fonts they have in their database. http://www.visibone.com/font/tests.html\n\n\n\n
*http://www.pandora.com/ - Pandora: customized streaming music\n*http://www.americanparkour.com - Movment & Philosophy\n*http://no-sin.com/ - Pictures from conventions & Ren Faires\n*http://www.instructables.com/ex/i/1686FF3E41011029AC23001143E7E506/ - MintyBoost - Small battery-powered USB charger\n*http://inventgeek.com/Projects/dancepad1/overview.aspx - A Better DDR pad\n*http://www.victorianlondon.org/ - Dictonary of Victorian London\n*http://www.tecepe.com.br/nav/CDSextantProject.htm - CD Sextant for sailing
I really don't get all the folks that are hung up on germs.\n\nI just watched a guy dry his hands with the electric air dyer...and then grab a paper towel to use to open the door. He threw it away as soon as he got outside the bathroom, so he used it for about a second. \n\n!Be a moron, waste all you can. \n\n
Today they sent out a forwarded twice e-mail. \n* First person (A VP) said "I have expanded the ports on this call so you can invite all ES to participate."\n* Second person (Another VP) said "This is a training regarding the New OP strategy. Send to department"\n* Third person (A <insert fancy name for secretary>) said "Please put this training on your calendar if you would like to participate."\n\nIn my opinion the first person's e-mail should not have been sent to me as it is not anything I need to know about. The second person should have given more detail about the training as several of us don't have a clue what the 'New OP Strategy' is. The third should have known to get rid of the first message, and also to convince the person they support to expand on the subject.\n
Typical statement that annoys me "Once she has some of this she'll be like 'Boyfriend who?'." \nIf you know someone has a SO (or 2) and that they do not have an open relationship, why are you trying to get them to cheat? Oh, wait. That's right it is all about you getting your jollies, with no reguard for anyone elses feelings or emotions. And if you do get them to cheat with you and dump thier SO why would you expect them not to cheat on you?
Another year closer to getting more vacation time\n\n<<reminder date:28 month:5 title:"Work Anniversary" firstyear:1999>>
\n!Getting to know youโฆ..\nName: Ken Girard\nTitle: Training Coordinator\nMagellan Subject Matter Expert for: OnTrack, most Microsoft products, and most anything computer/Tech related.\n\nFamily Information: I live with my girlfriend (Who works for Magellan), her 15yo son and 2 roommates\n \nCommunity involvement: Merchant Committie for the Greater St. Louis Renissance Faire and help run several SciFi Conventions.\n \nHobby/passion: Learning, reading, discovering new things\n \nFavorite Food:\n \nFavorite movie:\n \nCD in your car right now: \n \nFavorite hero or heroine:\n \nMost recent book read: \n \nWhat you do to relieve stress: Read, play video games, walk and smoke my pipe\n \nWorst job (excluding Magellan): Counting and shipping mail tubs. 40 hours a week of counting stacks of mail tubs, putting them on a pallet, wrapping them in shink wrap, then move on to the next pallet.\n \nBest job (excluding Magellan): \n \nWhat sport do you enjoy watching:\n \nMy favorite sports team is:\n \nWhat sport do you enjoy playing:\n \nMy favorite thing to do in my spare time is:\n \nMy astrological sign is:\n \nWhen I make a wish, I wish for:\n \nI could change one thing about myself I would:\n \nPeople would be surprised to learn that I:\n \nBirthplace:\n \nAnd where did you go to school:\n \nWhat one thing would you like Magellan employees to know/remember about you?\n\n\nAction Item: Please send bios to Mary Reynolds by June 16, 2006.\n\n
<<newerTiddler button:"Add Work Contact" name:"newWorkContact" tags:"contact work" template:"newContactTemplate">>\n<<tiddlerList tags:"contact,work">>
<<newerTiddler button:"Add Work Event" name:"newWorkEvent" tags:"reminder work" template:"newEventTemplate">>\n!Current\n<<showReminders leadtime:31 tag:"work">>\n+++![Rest of the year]\n<<showReminders leadtime:32...365 tag:"work">>\n===\n+++![Past year]\n<<showReminders leadtime:-365...-1 tag:"work">>\n===
<<newerTiddler button:"Create new project" name:"NewProject" tags:"project work" template:"NewProjectTemplate">>\n<<tiddlerList tags:"project,work" order:"-created">>
/***\n\n***/\n//{{{\nwindow.getTiddlyWikiDir=getTiddlyWikiDir;\n\nfunction getTiddlyWikiDir() {\n var path = document.location.toString();\n var i = path.lastIndexOf("/");\n return (i >= 0) ? path.substr(0, i+1) : path;\n}\n\nconfig.macros.dynamicLink={};\nconfig.macros.dynamicLink.handler= function(place,macroName,params,wikifier,paramString,tiddler){\n\n var link=getTiddlyWikiDir();\n var text='TW folder';\n wikify(('[['+text+'|'+link+']]'),place);\n \n }\n\nfunction writeMovieList(e){\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLink = theTarget;\n var list= theLink.getAttribute("list");\n theLink = theLink.parentNode.parentNode;\n var theMacro = eval("config.macros.writeMovieList."+list);\n wikify(theMacro,theLink);\n displayMessage("Movie List Saved",(getTiddlyWikiDir()));\n return(false);\n}\n\n\nconfig.macros.writeMovieList={\n\n MovToSee: '<<forEachTiddler where \s'tiddler.tags.contains("MovToSee") && ! tiddler.tags.contains("MovSeen")\s' sortBy \s'(tiddler.data("movieName").toLowerCase())\s' write \s'tiddler.data("movieName")+"\s\sn"\s' toFile {{getTiddlyWikiDir()+"Movies To See.txt"}} withLineSeparator \s'\sr\sn\s' >>',\n\n MovSeen: '<<forEachTiddler where \s'tiddler.tags.containsAny(["MovSeen","MovSeenAgain"])\s' sortBy \s'tiddler.data("movieDateSeen")\s' write \s'tiddler.data("movieName")+"\s\sn"\s' toFile {{getTiddlyWikiDir()+"Movies Seen 2006.txt"}} withLineSeparator \s'\sr\sn\s' >>',\n\n MovTop: '<<forEachTiddler where \s'tiddler.tags.contains("MovFav")\s' sortBy \s'(9.9-tiddler.data("movieRating"))+(tiddler.data("movieName").toLowerCase())\s' write \s'tiddler.data("movieName")+"\s\sn"\s' toFile {{getTiddlyWikiDir()+"Top Movies.txt"}} withLineSeparator \s'\sr\sn\s' >>',\n\n MovAgain: '<<forEachTiddler where \s'tiddler.tags.contains("MovWatchAgain")\s' sortBy \s'(9.9-tiddler.data("movieRating"))+(tiddler.data("movieName").toLowerCase())\s' write \s'tiddler.data("movieName")+"\s\sn"\s' toFile {{getTiddlyWikiDir()+"Movies Watch Again.txt"}} withLineSeparator \s'\sr\sn\s' >>',\n\n MovOfficial: '<<forEachTiddler where \s'tiddler.tags.containsAny(["MovFav","MovToSee"])\s' sortBy \s'(tiddler.data("movieName").toLowerCase())\s' write \s'tiddler.data("movieName")+"\s\sn"\s' toFile {{getTiddlyWikiDir()+"Official List of Movies.txt"}} withLineSeparator \s'\sr\sn\s' >>'\n};\n\nconfig.macros.writeMovieList.dropdownchar = "โผ";\nconfig.macros.writeMovieList.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n var arrow = ': '+ config.macros.writeMovieList.dropdownchar;\n var label = 'Save to File'+arrow;\n var tooltip = 'Save Movie List To File';\n\n var listNames= new Array("Movies To See","Movies Seen 2006","Top Movies","Movies Watch Again","Official List");\n var listValues= new Array("MovToSee","MovSeen","MovTop","MovAgain","MovOfficial");\n\n var onclick = function(e)\n { if (!e) var e = window.event;\n var popup = Popup.create(this);\n var lingo = config.views.wikified.tag;\n for(var t=0; t<listValues.length; t++)\n { var theButton = createTiddlyButton(createTiddlyElement(popup,"li"),listNames[t],null,writeMovieList,"tiddlyLinkExisting");\n theButton.setAttribute("list",listValues[t]);}\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation)\n e.stopPropagation();\n return(false);\n };\n\n var createdropperButton = function(place){\n var sp = createTiddlyElement(place,"span",null,"writemovie");\n var theDropDownBtn = createTiddlyButton(sp,label,tooltip,onclick);\n };\n\ncreatedropperButton(place);\n};\n//}}}
/***\n|''Name:''|YourSearchPlugin|\n|''Version:''|2.0.2 (2006-02-13)|\n|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n<<tiddler [[YourSearch Introduction]]>>\nFor more information see [[Help|YourSearch Help]].\n\n!Compatibility\nThis plugin requires TiddlyWiki 2.0. \nUse http://tiddlywiki.abego-software.de/#YourSearchPlugin-1.0.1 for older TiddlyWiki versions.\n\n!Revision history\n* v2.0.2 (2006-02-13)\n** Bugfix for Firefox 1.5.0.1 related to the "Show prefix" checkbox. Thanks to Ted Pavlic for reporting and to BramChen for fixing. \n** Internal\n*** Make "JSLint" conform\n* v2.0.1 (2006-02-05)\n** Support "Exact Word Match" (use '=' to prefix word)\n** Support default filter settings (when no filter flags are given in search term)\n** Rework on the "less than 3 chars search text" feature (thanks to EricShulman)\n** Better support SinglePageMode when doing "Open all tiddlers" (thanks to EricShulman)\n** Support Firefox 1.5.0.1\n** Bug: Fixed a hilite bug in "classic search mode" (thanks to EricShulman)\n* v2.0.0 (2006-01-16)\n** Add User Interface\n* v1.0.1 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.0 (2005-12-28)\n** initial version\n!Code\nThe code is compressed. \n\nYou can retrieve a readable source code version from http://tiddlywiki.abego-software.de/#YourSearchPlugin-src.\n/%\n***/\nif(!version.extensions.YourSearchPlugin){version.extensions.YourSearchPlugin={major:2,minor:0,revision:2,date:new Date(2006,2,13),type:"plugin",source:"http://tiddlywiki.abego-software.de/#YourSearchPlugin"};var alertAndThrow=function(_1){alert(_1);throw _1;};if(!window.abego){window.abego={};}if(abego.YourSearch){alertAndThrow("abego.YourSearch already defined");}abego.YourSearch={};if(version.major<2){alertAndThrow("YourSearchPlugin requires TiddlyWiki 2.0 or newer.\sn\snGet YourSearch 1.0.1 to use YourSearch with older versions of TiddlyWiki.\sn\snhttp://tiddlywiki.abego-software.de/#YourSearchPlugin-1.0.1");}var STQ=function(_2,_3,_4,_5){this.queryText=_2;this.caseSensitive=_3;if(_5){this.regExp=new RegExp(_2,_3?"mg":"img");return;}this.terms=[];var re=/\ss*(\s-)?([#%!=]*)(?:(?:("(?:(?:\s\s")|[^"])*")|(\sS+)))(?:\ss+((?:[aA][nN][dD])|(?:[oO][rR]))(?!\sS))?/mg;var _7=re.exec(_2);while(_7!=null&&_7.length==6){var _8="-"==_7[1];var _9=_7[2];var _a=_9.indexOf("!")>=0;var _b=_9.indexOf("%")>=0;var _c=_9.indexOf("#")>=0;var _d=_9.indexOf("=")>=0;if(!_a&&!_b&&!_c){_a=config.options.chkSearchInTitle;_b=config.options.chkSearchInText;_c=config.options.chkSearchInTags;if(!_a&&!_b&&!_c){_a=_b=_c=true;}}if(_4){_b=false;_c=false;}var _e;if(_7[3]){try{_e=eval(_7[3]);}catch(ex){}}else{_e=_7[4];}if(!_e){throw "Invalid search expression: %0".format([_2]);}var _f=_7[5]&&_7[5].charAt(0).toLowerCase()=="o";this.terms.push(new STQ.Term(_e,_a,_b,_c,_8,_f,_3,_d));_7=re.exec(_2);}};var me=STQ.prototype;me.getMatchingTiddlers=function(_10){var _11=[];for(var i in _10){var t=_10[i];if((t instanceof Tiddler)&&this.matchesTiddler(t)){_11.push(t);}}return _11;};me.matchesTiddler=function(_14){if(this.regExp){return this.regExp.test(_14.title)||this.regExp.test(_14.text);}var n=this.terms.length;if(n==0){return false;}var _16=this.terms[0].matchesTiddler(_14);for(var i=1;i<this.terms.length;i++){if(this.terms[i-1].orFollows){if(!_16){_16|=this.terms[i].matchesTiddler(_14);}}else{if(_16){_16&=this.terms[i].matchesTiddler(_14);}}}return _16;};me.getOnlyMatchTitleQuery=function(){if(!this.onlyMatchTitleQuery){this.onlyMatchTitleQuery=new STQ(this.queryText,this.caseSensitive,true,this.useRegExp);}return this.onlyMatchTitleQuery;};me.getMarkRegExp=function(){if(this.regExp){return "".search(this.regExp)>=0?null:this.regExp;}var _18={};var n=this.terms.length;for(var i=0;i<this.terms.length;i++){var _1b=this.terms[i];if(!_1b.negate){_18[_1b.text]=true;}}var _1c=[];for(var t in _18){_1c.push("("+t.escapeRegExp()+")");}if(_1c.length==0){return null;}var _1e=_1c.join("|");return new RegExp(_1e,this.caseSensitive?"mg":"img");};me.toString=function(){if(this.regExp){return this.regExp.toString();}var _1f="";for(var i=0;i<this.terms.length;i++){_1f+=this.terms[i].toString();}return _1f;};STQ.Term=function(_21,_22,_23,_24,_25,_26,_27,_28){this.text=_21;this.inTitle=_22;this.inText=_23;this.inTag=_24;this.negate=_25;this.orFollows=_26;this.caseSensitive=_27;this.wordMatch=_28;var _29=_21.escapeRegExp();if(this.wordMatch){_29="\s\sb"+_29+"\s\sb";}this.regExp=new RegExp(_29,"m"+(_27?"":"i"));};STQ.Term.prototype.toString=function(){return (this.negate?"-":"")+(this.inTitle?"!":"")+(this.inText?"%":"")+(this.inTag?"#":"")+(this.wordMatch?"=":"")+"\s""+this.text+"\s""+(this.orFollows?" OR ":" AND ");};STQ.Term.prototype.matchesTiddler=function(_2a){if(!_2a){return false;}if(this.inTitle&&this.regExp.test(_2a.title)){return !this.negate;}if(this.inText&&this.regExp.test(_2a.text)){return !this.negate;}if(this.inTag){var _2b=_2a.tags;if(_2b){for(var i=0;i<_2b.length;i++){if(this.regExp.test(_2b[i])){return !this.negate;}}}}return this.negate;};var stringToInt=function(s,_2e){if(!s){return _2e;}var n=parseInt(s);return (n==NaN)?_2e:n;};var getIntAttribute=function(_30,_31,_32){return stringToInt(_30.getAttribute(_31));};var isDescendantOrSelf=function(_33,e){while(e!=null){if(_33==e){return true;}e=e.parentNode;}return false;};var getMatchCount=function(s,re){var m=s.match(re);return m?m.length:0;};var createEllipsis=function(_38){var e=createTiddlyElement(_38,"span");e.innerHTML="…";};var isWordChar=function(c){return (c>="a"&&c<="z")||(c>="A"&&c<="Z")||c=="_";};var getWordBounds=function(s,_3c){if(!isWordChar(s[_3c])){return null;}for(var i=_3c-1;i>=0&&isWordChar(s[i]);i--){}var _3e=i+1;var n=s.length;for(i=_3c+1;i<n&&isWordChar(s[i]);i++){}return {start:_3e,end:i};};var removeTextDecoration=function(s){var _41=["''","{{{","}}}","//","<<<","/***","***/"];var _42="";for(var i=0;i<_41.length;i++){if(i!=0){_42+="|";}_42+="("+_41[i].escapeRegExp()+")";}return s.replace(new RegExp(_42,"mg"),"").trim();};var logText="";var lastLogTime=null;var logMessage=function(_44,s){var now=new Date();var _47=lastLogTime?(now-lastLogTime).toString():"";logText+="<tr><td>"+now.convertToYYYYMMDDHHMMSSMMM()+"</td><td align='right'>"+_47+"</td><td>"+_44+"</td><td>"+s.htmlEncode()+"</td></tr>\sn";lastLogTime=now;};function writeLog(){var t=" <<JsDoIt 'WriteLog' 'WriteLog' 'javascript:writeLog();story.closeTiddler(\s"Log\s");story.displayTiddler(null,\s"Log\s");'>>"+"<html><table><tbody><tr><th>Time</th><th>Delta (ms)</th><th>Kind</th><th>Message</th></tr>\sn"+logText+"</tbody></table></html>";store.saveTiddler("Log","Log",t,config.options.txtUserName,new Date(),["System","Log"]);logText="";lastLogTime=null;}var yourSearchResultID="yourSearchResult";var yourSearchResultItemsID="yourSearchResultItems";var maxCharsInTitle=80;var maxCharsInTags=50;var maxCharsInText=250;var maxPagesInNaviBar=10;var itemsPerPageDefault=25;var itemsPerPageWithPreviewDefault=10;var minMatchWithContextSize=40;var maxMovementForWordCorrection=4;var matchInTitleWeight=4;var precisionInTitleWeight=10;var matchInTagsWeight=2;var resultElement;var lastResults;var lastQuery;var lastSearchText;var searchInputField;var searchButton;var firstIndexOnPage=0;var currentTiddler;var indexInPage;var indexInResult;var getItemsPerPage=function(){var n=(config.options.chkPreviewText)?stringToInt(config.options.txtItemsPerPageWithPreview,itemsPerPageWithPreviewDefault):stringToInt(config.options.txtItemsPerPage,itemsPerPageDefault);return (n>0)?n:1;};var standardRankFunction=function(_4a,_4b){var _4c=_4b.getMarkRegExp();if(!_4c){return 1;}var _4d=_4a.title.match(_4c);var _4e=_4d?_4d.length:0;var _4f=getMatchCount(_4a.getTags(),_4c);var _50=_4d?_4d.join("").length:0;var _51=_4a.title.length>0?_50/_4a.title.length:0;var _52=_4e*matchInTitleWeight+_4f*matchInTagsWeight+_51*precisionInTitleWeight+1;return _52;};var findMatches=function(_53,_54,_55,_56,_57,_58){lastSearchText=_54;var _59=_53.reverseLookup("tags",_58,false);var _5a=new STQ(_54,_55,false,_56);lastQuery=_5a;var _5b=_5a.getMatchingTiddlers(_59);var _5c=abego.YourSearch.getRankFunction();for(var i=0;i<_5b.length;i++){var _5e=_5b[i];var _5f=_5c(_5e,_5a);_5e.searchRank=_5f;}if(!_57){_57="title";}var _60=function(a,b){var _63=a.searchRank-b.searchRank;if(_63==0){if(a[_57]==b[_57]){return (0);}else{return (a[_57]<b[_57])?-1:+1;}}else{return (_63>0)?-1:+1;}};_5b.sort(_60);lastResults=_5b;return _5b;};var moveToWordBorder=function(s,_65,_66){var _67;if(_66){_67=getWordBounds(s,_65);}else{if(_65<=0){return _65;}_67=getWordBounds(s,_65-1);}if(!_67){return _65;}if(_66){if(_67.start>=_65-maxMovementForWordCorrection){return _67.start;}if(_67.end<=_65+maxMovementForWordCorrection){return _67.end;}}else{if(_67.end<=_65+maxMovementForWordCorrection){return _67.end;}if(_67.start>=_65-maxMovementForWordCorrection){return _67.start;}}return _65;};var getContextRangeAround=function(s,_69,_6a,_6b,_6c){var _6d=Math.max(Math.floor(_6c/(_6b+1)),minMatchWithContextSize);var _6e=Math.max(_6d-(_6a-_69),0);var _6f=Math.min(Math.floor(_6a+_6e/3),s.length);var _70=Math.max(_6f-_6d,0);_70=moveToWordBorder(s,_70,true);_6f=moveToWordBorder(s,_6f,false);return {start:_70,end:_6f};};var getTextAndMatchArray=function(s,_72){var _73=[];if(_72){var _74=0;var n=s.length;var _76=0;do{_72.lastIndex=_74;var _77=_72.exec(s);if(_77){if(_74<_77.index){var t=s.substring(_74,_77.index);_73.push({text:t});}_73.push({text:_77[0],isMatch:true});_74=_77.index+_77[0].length;}else{_73.push({text:s.substr(_74)});break;}}while(true);}else{_73.push({text:s});}return _73;};var simpleCreateLimitedTextWithMarks=function(_79,s,_7b){if(!lastQuery){return;}var _7c=getTextAndMatchArray(s,lastQuery.getMarkRegExp());var _7d=0;for(var i=0;i<_7c.length&&_7d<_7b;i++){var t=_7c[i];var _80=t.text;if(t.isMatch){createTiddlyElement(_79,"span",null,"marked",_80);}else{var _81=_7b-_7d;if(_81<_80.length){_80=_80.substring(0,_81)+"...";}createTiddlyText(_79,_80);}_7d+=_80.length;}};var addRange=function(_82,_83,_84){var n=_82.length;if(n==0){_82.push({start:_83,end:_84});return;}var i=0;for(;i<n;i++){var _87=_82[i];if(_87.start<=_84&&_83<=_87.end){var r;var _89=i+1;for(;_89<n;_89++){r=_82[_89];if(r.start>_84||_83>_87.end){break;}}var _8a=_83;var _8b=_84;for(var j=i;j<_89;j++){r=_82[j];_8a=Math.min(_8a,r.start);_8b=Math.max(_8b,r.end);}_82.splice(i,_89-i,{start:_8a,end:_8b});return;}if(_87.start>_84){break;}}_82.splice(i,0,{start:_83,end:_84});};var getTotalRangesSize=function(_8d){var _8e=0;for(var i=0;i<_8d.length;i++){var _90=_8d[i];_8e+=_90.end-_90.start;}return _8e;};var writeTextAndMatchRange=function(_91,s,_93,_94,_95){var t;var _97;var pos=0;var i=0;var _9a=0;for(;i<_93.length;i++){t=_93[i];_97=t.text;if(_94<pos+_97.length){_9a=_94-pos;break;}pos+=_97.length;}var _9b=_95-_94;for(;i<_93.length&&_9b>0;i++){t=_93[i];_97=t.text.substr(_9a);_9a=0;if(_97.length>_9b){_97=_97.substr(0,_9b);}if(t.isMatch){createTiddlyElement(_91,"span",null,"marked",_97);}else{createTiddlyText(_91,_97);}_9b-=_97.length;}if(_95<s.length){createEllipsis(_91);}};var getMatchedTextCount=function(_9c){var _9d=0;for(var i=0;i<_9c.length;i++){if(_9c[i].isMatch){_9d++;}}return _9d;};var getMatchedTextWithContextRanges=function(_9f,s,_a1){var _a2=[];var _a3=getMatchedTextCount(_9f);var pos=0;for(var i=0;i<_9f.length;i++){var t=_9f[i];var _a7=t.text;if(t.isMatch){var _a8=getContextRangeAround(s,pos,pos+_a7.length,_a3,_a1);addRange(_a2,_a8.start,_a8.end);}pos+=_a7.length;}return _a2;};var fillUpRanges=function(s,_aa,_ab){var _ac=_ab-getTotalRangesSize(_aa);while(_ac>0){if(_aa.length==0){addRange(_aa,0,moveToWordBorder(s,_ab,false));return;}else{var _ad=_aa[0];var _ae;var _af;if(_ad.start==0){_ae=_ad.end;if(_aa.length>1){_af=_aa[1].start;}else{addRange(_aa,_ae,moveToWordBorder(s,_ae+_ac,false));return;}}else{_ae=0;_af=_ad.start;}var _b0=Math.min(_af,_ae+_ac);addRange(_aa,_ae,_b0);_ac-=(_b0-_ae);}}};var writeRanges=function(_b1,s,_b3,_b4,_b5){if(_b4.length==0){return;}if(_b4[0].start>0){createEllipsis(_b1);}var _b6=_b5;for(var i=0;i<_b4.length&&_b6>0;i++){var _b8=_b4[i];var len=Math.min(_b8.end-_b8.start,_b6);writeTextAndMatchRange(_b1,s,_b3,_b8.start,_b8.start+len);_b6-=len;}};var createLimitedTextWithMarksAndContext=function(_ba,s,_bc){if(!lastQuery){return;}if(s.length<_bc){_bc=s.length;}var _bd=getTextAndMatchArray(s,lastQuery.getMarkRegExp());var _be=getMatchedTextWithContextRanges(_bd,s,_bc);fillUpRanges(s,_be,_bc);writeRanges(_ba,s,_bd,_be,_bc);};var createLimitedTextWithMarks=function(_bf,s,_c1){return createLimitedTextWithMarksAndContext(_bf,s,_c1);};var myStorySearch=function(_c2,_c3,_c4){highlightHack=new RegExp(_c4?_c2:_c2.escapeRegExp(),_c3?"mg":"img");var _c5=findMatches(store,_c2,_c3,_c4,"title","excludeSearch");firstIndexOnPage=0;showResult();highlightHack=null;};var myMacroSearchHandler=function(_c6,_c7,_c8){var _c9="";var _ca=null;var _cb=function(txt){if(config.options.chkUseYourSearch){myStorySearch(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}else{story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);}_c9=txt.value;};var _cd=function(e){_cb(searchInputField);return false;};var _cf=function(e){if(!e){var e=window.event;}switch(e.keyCode){case 13:_cb(this);break;case 27:if(isResultOpen()){closeResult();}else{this.value="";clearMessage();}break;}if(String.fromCharCode(e.keyCode)==this.accessKey||e.altKey){reopenResultIfApplicable();}if(this.value.length<3&&_ca){clearTimeout(_ca);}if((this.value.length>2)&&(this.value!=_c9)){if(!config.options.chkUseYourSearch||config.options.chkSearchAsYouType){if(_ca){clearTimeout(_ca);}var txt=this;_ca=setTimeout(function(){_cb(txt);},500);}}if(this.value.length==0){closeResult();}};var _d3=function(e){this.select();reopenResultIfApplicable();};var btn=createTiddlyButton(_c6,this.label,this.prompt,_cd);var txt=createTiddlyElement(_c6,"input",null,null,null);if(_c8[0]){txt.value=_c8[0];}txt.onkeyup=_cf;txt.onfocus=_d3;txt.setAttribute("size",this.sizeTextbox);txt.setAttribute("accessKey",this.accessKey);txt.setAttribute("autocomplete","off");if(config.browser.isSafari){txt.setAttribute("type","search");txt.setAttribute("results","5");}else{txt.setAttribute("type","text");}searchInputField=txt;searchButton=btn;};var isResultOpen=function(){return resultElement!=null&&resultElement.parentNode==document.body;};var closeResult=function(){if(isResultOpen()){document.body.removeChild(resultElement);}};var openAllFoundTiddlers=function(){closeResult();if(lastResults){var _d7=[];for(var i=0;i<lastResults.length;i++){_d7.push(lastResults[i].title);}story.displayTiddlers(null,_d7);}};var refreshResult=function(){if(!resultElement||!searchInputField){return;}var _d9=store.getTiddlerText("YourSearchResultTemplate");if(!_d9){_d9="<b>Tiddler YourSearchResultTemplate not found</b>";}resultElement.innerHTML=_d9;firstIndexOnPage=Math.floor(firstIndexOnPage/getItemsPerPage())*getItemsPerPage();applyHtmlMacros(resultElement,null);refreshElements(resultElement,null);if(lastResults&&lastResults.length>0){var _da=store.getTiddlerText("YourSearchItemTemplate");if(!_da){alertAndThrow("YourSearchItemTemplate not found");}var _db=document.getElementById(yourSearchResultItemsID);if(!_db){_db=createTiddlyElement(resultElement,"div",yourSearchResultItemsID);}var _dc=Math.min(firstIndexOnPage+getItemsPerPage(),lastResults.length);indexInPage=-1;for(var i=firstIndexOnPage;i<_dc;i++){currentTiddler=lastResults[i];indexInPage++;indexInResult=i;var _de=createTiddlyElement(_db,"div",null,"yourSearchItem");_de.innerHTML=_da;applyHtmlMacros(_de,null);refreshElements(_de,null);}}currentTiddler=null;ensureResultIsDisplayedNicely();};var ensureResultIsDisplayedNicely=function(){adjustResultPositionAndSize();scrollVisible();};var scrollVisible=function(){if(resultElement){window.scrollTo(0,ensureVisible(resultElement));}if(searchInputField){window.scrollTo(0,ensureVisible(searchInputField));}};var adjustResultPositionAndSize=function(){if(!searchInputField){return;}var _df=searchInputField;var _e0=findPosX(_df);var _e1=findPosY(_df);var _e2=_df.offsetHeight;var _e3=_e0;var _e4=_e1+_e2;var _e5=findWindowWidth();if(_e5<resultElement.offsetWidth){resultElement.style.width=(_e5-100)+"px";_e5=findWindowWidth();}var _e6=resultElement.offsetWidth;if(_e3+_e6>_e5){_e3=_e5-_e6-30;}if(_e3<0){_e3=0;}resultElement.style.left=_e3+"px";resultElement.style.top=_e4+"px";resultElement.style.display="block";};var showResult=function(){if(!resultElement){resultElement=createTiddlyElement(document.body,"div",yourSearchResultID,"yourSearchResult");}else{if(resultElement.parentNode!=document.body){document.body.appendChild(resultElement);}}refreshResult();};var reopenResultIfApplicable=function(){if(searchInputField==null||!config.options.chkUseYourSearch){return;}if((searchInputField.value==lastSearchText)&&lastSearchText&&!isResultOpen()){if(resultElement&&(resultElement.parentNode!=document.body)){document.body.appendChild(resultElement);ensureResultIsDisplayedNicely();}else{showResult();}}};var setFirstIndexOnPage=function(_e7){if(!lastResults||lastResults.length==0){return;}firstIndexOnPage=Math.min(Math.max(0,_e7),lastResults.length-1);refreshResult();};var onDocumentClick=function(e){if(e.target==searchInputField){return;}if(e.target==searchButton){return;}if(resultElement&&isDescendantOrSelf(resultElement,e.target)){return;}closeResult();};var onDocumentKeyup=function(e){if(e.keyCode==27){closeResult();}};addEvent(document,"click",onDocumentClick);addEvent(document,"keyup",onDocumentKeyup);config.macros.yourSearch={label:"yourSearch",prompt:"Gives access to the current/last YourSearch result",funcs:{},tests:{"true":function(){return true;},"false":function(){return false;},"found":function(){return lastResults&&lastResults.length>0;},"previewText":function(){return config.options.chkPreviewText;}}};config.macros.yourSearch.handler=function(_ea,_eb,_ec,_ed,_ee,_ef){if(_ec.length==0){return;}var _f0=_ec[0];var _f1=config.macros.yourSearch.funcs[_f0];if(_f1){_f1(_ea,_eb,_ec,_ed,_ee,_ef);}};config.macros.yourSearch.funcs.itemRange=function(_f2){if(lastResults){var _f3=Math.min(firstIndexOnPage+getItemsPerPage(),lastResults.length);var s="%0 - %1".format([firstIndexOnPage+1,_f3]);createTiddlyText(_f2,s);}};config.macros.yourSearch.funcs.count=function(_f5){if(lastSearchText){createTiddlyText(_f5,lastResults.length.toString());}};config.macros.yourSearch.funcs.query=function(_f6){if(lastResults){createTiddlyText(_f6,lastSearchText);}};config.macros.yourSearch.funcs.version=function(_f7){var t="YourSearch %0.%1.%2".format([version.extensions.YourSearchPlugin.major,version.extensions.YourSearchPlugin.minor,version.extensions.YourSearchPlugin.revision]);var e=createTiddlyElement(_f7,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#YourSearchPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";};config.macros.yourSearch.funcs.copyright=function(_fa){var e=createTiddlyElement(_fa,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">© 2005-2006 <b><font color=\s"red\s">abego</font></b> Software<font>";};config.macros.yourSearch.funcs.linkButton=function(_fc,_fd,_fe,_ff,_100,_101){if(_fe<2){return;}var _102=_fe[1];var text=_fe<3?_102:_fe[2];var _104=_fe<4?text:_fe[3];var _105=_fe<5?null:_fe[4];var btn=createTiddlyButton(_fc,text,_104,closeResultAndDisplayTiddler,null,null,_105);btn.setAttribute("tiddlyLink",_102);};config.macros.yourSearch.funcs.closeButton=function(_107,_108,_109,_10a,_10b,_10c){var _10d=createTiddlyButton(_107,"close","Close the Search Results (Shortcut: ESC)",closeResult);};config.macros.yourSearch.funcs.openAllButton=function(_10e,_10f,_110,_111,_112,_113){if(!lastResults){return;}var n=lastResults.length;if(n==0){return;}var _115=n==1?"open tiddler":"open all %0 tiddlers".format([n]);var _116=createTiddlyButton(_10e,_115,"Open all found tiddlers (Shortcut: Alt-O)",openAllFoundTiddlers);_116.setAttribute("accessKey","O");};var onNaviButtonClick=function(e){if(!e){var e=window.event;}var _119=getIntAttribute(this,"page");setFirstIndexOnPage(_119*getItemsPerPage(),0);};config.macros.yourSearch.funcs.naviBar=function(_11a,_11b,_11c,_11d,_11e,_11f){if(!lastResults||lastResults.length==0){return;}var _120;var _121=Math.floor(firstIndexOnPage/getItemsPerPage());var _122=Math.floor((lastResults.length-1)/getItemsPerPage());if(_121>0){_120=createTiddlyButton(_11a,"Previous","Go to previous page (Shortcut: Alt-'<')",onNaviButtonClick,"prev");_120.setAttribute("page",(_121-1).toString());_120.setAttribute("accessKey","<");}for(var i=-maxPagesInNaviBar;i<maxPagesInNaviBar;i++){var _124=_121+i;if(_124<0){continue;}if(_124>_122){break;}var _125=(i+_121+1).toString();var _126=_124==_121?"currentPage":"otherPage";_120=createTiddlyButton(_11a,_125,"Go to page %0".format([_125]),onNaviButtonClick,_126);_120.setAttribute("page",(_124).toString());}if(_121<_122){_120=createTiddlyButton(_11a,"Next","Go to next page (Shortcut: Alt-'>')",onNaviButtonClick,"next");_120.setAttribute("page",(_121+1).toString());_120.setAttribute("accessKey",">");}};config.macros.yourSearch.funcs["if"]=function(_127,_128,_129,_12a,_12b,_12c){if(_129.length<2){return;}var _12d=_129[1];var _12e=(_12d=="not");if(_12e){if(_129.length<3){return;}_12d=_129[2];}var test=config.macros.yourSearch.tests[_12d];var _130=false;try{if(test){_130=test(_127,_128,_129,_12a,_12b,_12c)!=_12e;}else{_130=(!eval(_12d))==_12e;}}catch(ex){}if(!_130){_127.style.display="none";}};var createOptionWithRefresh=function(_131,_132,_133,_134){invokeMacro(_131,"option",_132,_133,_134);var elem=_131.lastChild;var _136=elem.onclick;elem.onclick=function(e){var _138=_136.apply(this,arguments);refreshResult();return _138;};return elem;};config.macros.yourSearch.funcs.chkPreviewText=function(_139,_13a,_13b,_13c,_13d,_13e){var _13f=_13b.slice(1).join(" ");var elem=createOptionWithRefresh(_139,"chkPreviewText",_13c,_13e);elem.setAttribute("accessKey","P");elem.title="Show text preview of found tiddlers (Shortcut: Alt-P)";return elem;};config.macros.foundTiddler={label:"foundTiddler",prompt:"Provides information on the tiddler currently processed on the YourSearch result page",funcs:{}};config.macros.foundTiddler.handler=function(_141,_142,_143,_144,_145,_146){if(!currentTiddler){return;}var name=_143[0];var func=config.macros.foundTiddler.funcs[name];if(func){func(_141,_142,_143,_144,_145,_146);}};var closeResultAndDisplayTiddler=function(e){closeResult();var _14a=this.getAttribute("tiddlyLink");if(_14a){var _14b=this.getAttribute("withHilite");var _14c=highlightHack;if(_14b&&_14b=="true"&&lastQuery){highlightHack=lastQuery.getMarkRegExp();}story.displayTiddler(this,_14a);highlightHack=_14c;}return (false);};var getShortCutNumber=function(){if(!currentTiddler){return -1;}if(indexInPage>=0&&indexInPage<=9){return indexInPage<9?(indexInPage+1):0;}else{return -1;}};config.macros.foundTiddler.funcs.title=function(_14d,_14e,_14f,_150,_151,_152){if(!currentTiddler){return;}var _153=getShortCutNumber();var _154=_153>=0?"Open tiddler (Shortcut: Alt-%0)".format([_153.toString()]):"Open tiddler";var btn=createTiddlyButton(_14d,null,_154,closeResultAndDisplayTiddler,null);btn.setAttribute("tiddlyLink",currentTiddler.title);btn.setAttribute("withHilite","true");createLimitedTextWithMarks(btn,currentTiddler.title,maxCharsInTitle);if(_153>=0){btn.setAttribute("accessKey",_153.toString());}};config.macros.foundTiddler.funcs.tags=function(_156,_157,_158,_159,_15a,_15b){if(!currentTiddler){return;}createLimitedTextWithMarks(_156,currentTiddler.getTags(),maxCharsInTags);};config.macros.foundTiddler.funcs.text=function(_15c,_15d,_15e,_15f,_160,_161){if(!currentTiddler){return;}createLimitedTextWithMarks(_15c,removeTextDecoration(currentTiddler.text),maxCharsInText);};config.macros.foundTiddler.funcs.number=function(_162,_163,_164,_165,_166,_167){var _168=getShortCutNumber();if(_168>=0){var text="%0)".format([_168.toString()]);createTiddlyElement(_162,"span",null,"shortcutNumber",text);}};function scrollToAnchor(name){return false;}if(config.options.chkUseYourSearch==undefined){config.options.chkUseYourSearch=true;}if(config.options.chkPreviewText==undefined){config.options.chkPreviewText=true;}if(config.options.chkSearchAsYouType==undefined){config.options.chkSearchAsYouType=true;}if(config.options.chkSearchInTitle==undefined){config.options.chkSearchInTitle=true;}if(config.options.chkSearchInText==undefined){config.options.chkSearchInText=true;}if(config.options.chkSearchInTags==undefined){config.options.chkSearchInTags=true;}if(config.options.txtItemsPerPage==undefined){config.options.txtItemsPerPage=itemsPerPageDefault;}if(config.options.txtItemsPerPageWithPreview==undefined){config.options.txtItemsPerPageWithPreview=itemsPerPageWithPreviewDefault;}config.shadowTiddlers.AdvancedOptions+="\sn<<option chkUseYourSearch>> Use 'Your Search' //([[more options|YourSearch Options]])//";config.shadowTiddlers["YourSearch Introduction"]="!About YourSearch\sn"+"\sn"+"YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!\sn"+"\sn"+"''May the '~Alt-F' be with you.''\sn"+"\sn"+"\sn"+"!Features\sn"+"* YourSearch searches for tiddlers that match your query ''as you type'' into the 'search' field. It presents a list of the ''\s"Top Ten\s"'' tiddlers in a ''popup-like window'': the ''[[YourSearch Result]]''. The tiddlers currently displayed in your TiddlyWiki are not affected.\sn"+"* Using ''~TiddlerRank technology'' the [[YourSearch Result]] lists the ''most interesting tiddlers first''.\sn"+"* Through ''Filtered Search'' and ''Boolean Search'' you can easily refining your search, like excluding words or searching for multiple words. This way less tiddlers are displayed in the [[YourSearch Result]] and you can faster scan the result for the tiddler you are looking for.\sn"+"* The [[YourSearch Result]] lists the found tiddlers ''page-wise'', e.g. 10 per page. Use the ''Result Page Navigation Bar'' to navigate between pages if the result does not fit on one page.\sn"+"* The [[YourSearch Result]] states the ''total number of found tiddlers''. This way you can quickly decide if you want to browse the result list or if you want to refine your search first to shorten the result list.\sn"+"* Beside the ''title of the found tiddlers'' the [[YourSearch Result]] also ''displays tags'' and ''tiddler text previews''. The ''tiddler text preview'' is an extract of the tiddler's content, showing the most interesting parts related to your query (e.g. the texts around the words you are looking for).\sn"+"* The words you are looking for are hilited in the titles, tags and text previews of the [[YourSearch Result]].\sn"+"* If you are not interested in the tiddler text previews but prefer to get longer lists of tiddlers on one result page you may ''switch of the text preview''.\sn"+"* If the [[YourSearch Result]] contains the tiddler you are looking for you can just ''click its title to display'' it in your TiddlyWiki. Alternatively you may also ''open all found tiddlers'' at once. \sn"+"* Use [[YourSearch Options]] to customize YourSearch to your needs. E.g. depending on the size of your screen you may change the number of tiddlers displayed in the [[YourSearch Result]]. In the [[YourSearch Options]] and the AdvancedOptions you may also switch off YourSearch in case you temporarily want to use the standard search.\sn"+"* For the most frequently actions ''access keys'' are defined so you can perform your search without using the mouse.\sn"+"\sn";config.shadowTiddlers["YourSearch Help"]="<<tiddler [[YourSearch Introduction]]>>"+"\sn"+"!Filtered Search<html><a name='Filtered'/></html>\sn"+"Using the Filtered Search you can restrict your search to certain parts of a tiddler, e.g only search the tags or only the titles.\sn"+"|!What you want|!What you type|!Example|\sn"+"|Search ''titles only''|start word with ''!''|{{{!jonny}}}|\sn"+"|Search ''contents only''|start word with ''%''|{{{%football}}}|\sn"+"|Search ''tags only''|start word with ''#''|{{{#Plugin}}}|\sn"+"\sn"+"You may use more than one filter for a word. E.g. {{{!#Plugin}}} finds tiddlers containing \s"Plugin\s" either in the title or in the tags (but does not look for \s"Plugin\s" in the content).\sn"+"\sn"+"!Boolean Search<html><a name='Boolean'/></html>\sn"+"The Boolean Search is useful when searching for multiple words.\sn"+"|!What you want|!What you type|!Example|\sn"+"|''All words'' must exist|List of words|{{{jonny jeremy}}}|\sn"+"|''At least one word'' must exist|Separate words by ''or''|{{{jonny or jeremy}}}|\sn"+"|A word ''must not exist''|Start word with ''-''|{{{-jonny}}}|\sn"+"\sn"+"''Note:'' When you specify two words, separated with a space, YourSearch finds all tiddlers that contain both words, but not necessarily next to each other. If you want to find a sequence of word, e.g. '{{{John Brown}}}', you need to put the words into quotes. I.e. you type: {{{\s"john brown\s"}}}.\sn"+"\sn"+"!'Exact Word' Search<html><a name='Exact'/></html>\sn"+"By default a search result all matches that 'contain' the searched text. \sn"+" E.g. if you search for 'Task' you will get all tiddlers containing 'Task', but also 'CompletedTask', 'TaskForce' etc.\sn"+"\sn"+"If you only want to get the tiddlers that contain 'exactly the word' you need to prefix it with a '='. E.g. typing '=Task' will the tiddlers that contain the word 'Task', ignoring words that just contain 'Task' as a substring.\sn"+"\sn"+"!Combined Search<html><a name='Combined'/></html>\sn"+"You are free to combine the various search options. \sn"+"\sn"+"''Examples''\sn"+"|!What you type|!Result|\sn"+"|{{{!jonny !jeremy -%football}}}| all tiddlers with both {{{jonny}}} and {{{jeremy}}} in its titles, but no {{{football}}} in content.|\sn"+"|{{{#=Task}}}|All tiddlers tagged with 'Task' (the exact word). Tags named 'CompletedTask', 'TaskForce' etc. are not considered.|\sn"+"\sn"+"!~CaseSensitiveSearch and ~RegExpSearch<html><a name='Case'/></html>\sn"+"The standard search options ~CaseSensitiveSearch and ~RegExpSearch are fully supported by YourSearch. However when ''~RegExpSearch'' is on Filtered and Boolean Search are disabled.\sn"+"\sn"+"!Access Keys<html><a name='Access'/></html>\sn"+"You are encouraged to use the access keys (also called \s"shortcut\s" keys) for the most frequently used operations. For quick reference these shortcuts are also mentioned in the tooltip for the various buttons etc.\sn"+"\sn"+"|!Key|!Operation|\sn"+"|{{{Alt-F}}}|''The most important keystroke'': It moves the cursor to the search input field so you can directly start typing your query. Pressing {{{Alt-F}}} will also display the previous search result. This way you can quickly display multiple tiddlers using \s"Press {{{Alt-F}}}. Select tiddler.\s" sequences.|\sn"+"|{{{ESC}}}|Closes the [[YourSearch Result]]. When the [[YourSearch Result]] is already closed and the cursor is in the search input field the field's content is cleared so you start a new query.|\sn"+"|{{{Alt-1}}}, {{{Alt-2}}},... |Pressing these keys opens the first, second etc. tiddler from the result list.|\sn"+"|{{{Alt-O}}}|Opens all found tiddlers.|\sn"+"|{{{Alt-P}}}|Toggles the 'Preview Text' mode.|\sn"+"|{{{Alt-'<'}}}, {{{Alt-'>'}}}|Displays the previous or next page in the [[YourSearch Result]].|\sn"+"|{{{Return}}}|When you have turned off the 'as you type' search mode pressing the {{{Return}}} key actually starts the search (as does pressing the 'search' button).|\sn"+"\sn";config.shadowTiddlers["YourSearch Options"]="|>|!YourSearch Options|\sn"+"|>|<<option chkUseYourSearch>> Use 'Your Search'|\sn"+"|!|<<option chkPreviewText>> Show Text Preview|\sn"+"|!|<<option chkSearchAsYouType>> 'Search As You Type' Mode (No RETURN required to start search)|\sn"+"|!|Default Search Filter:<<option chkSearchInTitle>>Titles ('!') <<option chkSearchInText>>Texts ('%') <<option chkSearchInTags>>Tags ('#') <html><br><font size=\s"-2\s">The parts of a tiddlers that are searched when you don't explicitly specify a filter in the search text (using a '!', '%' or '#' prefix).</font></html>|\sn"+"|!|Number of items on search result page: <<option txtItemsPerPage>>|\sn"+"|!|Number of items on search result page with preview text: <<option txtItemsPerPageWithPreview>>|\sn";config.shadowTiddlers["YourSearchStyleSheet"]="/***\sn"+"!~YourSearchResult Stylesheet\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchResult {\sn"+"\stposition: absolute;\sn"+"\stwidth: 800px;\sn"+"\sn"+"\stpadding: 0.2em;\sn"+"\stlist-style: none;\sn"+"\stmargin: 0;\sn"+"\sn"+"\stbackground: White;\sn"+"\stborder: 1px solid DarkGray;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Summary Section\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchResult .summary {\sn"+"\stborder-bottom-width: thin;\sn"+"\stborder-bottom-style: solid;\sn"+"\stborder-bottom-color: #999999;\sn"+"\stpadding-bottom: 4px;\sn"+"}\sn"+"\sn"+".yourSearchRange, .yourSearchCount, .yourSearchQuery {\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".yourSearchResult .summary .button {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-left: 0.3em;\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+".yourSearchResult .summary .chkBoxLabel {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Items Area\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchResult .marked {\sn"+"\stbackground: none;\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".yourSearchItem {\sn"+"\stmargin-top: 2px;\sn"+"}\sn"+"\sn"+".yourSearchNumber {\sn"+"\stcolor: #808080;\sn"+"}\sn"+"\sn"+"\sn"+".yourSearchTags {\sn"+"\stcolor: #008000;\sn"+"}\sn"+"\sn"+".yourSearchText {\sn"+"\stcolor: #808080;\sn"+"\stmargin-bottom: 6px;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Footer\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchFooter {\sn"+"\stmargin-top: 8px;\sn"+"\stborder-top-width: thin;\sn"+"\stborder-top-style: solid;\sn"+"\stborder-top-color: #999999;\sn"+"}\sn"+"\sn"+".yourSearchFooter a:hover{\sn"+"\stbackground: none;\sn"+"\stcolor: none;\sn"+"}\sn"+"/*}}}*/\sn"+"/***\sn"+"!!Navigation Bar\sn"+"***/\sn"+"/*{{{*/\sn"+".yourSearchNaviBar a {\sn"+"\stfont-size: 16px;\sn"+"\stmargin-left: 4px;\sn"+"\stmargin-right: 4px;\sn"+"\stcolor: black;\sn"+"\sttext-decoration: underline;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar a:hover {\sn"+"\stbackground-color: none;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar .prev {\sn"+"\stfont-weight: bold;\sn"+"\stcolor: blue;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar .currentPage {\sn"+"\stcolor: #FF0000;\sn"+"\stfont-weight: bold;\sn"+"\sttext-decoration: none;\sn"+"}\sn"+"\sn"+".yourSearchNaviBar .next {\sn"+"\stfont-weight: bold;\sn"+"\stcolor: blue;\sn"+"}\sn"+"/*}}}*/\sn";config.shadowTiddlers["YourSearchResultTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<span macro=\s"yourSearch if found\s">\sn"+"<!-- The Summary Header ============================================ -->\sn"+"<table class=\s"summary\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\stYourSearch Result <span class=\s"yourSearchRange\s" macro=\s"yourSearch itemRange\s"></span>\sn"+"\st\st of <span class=\s"yourSearchCount\s" macro=\s"yourSearch count\s"></span>\sn"+"\st\stfor <span class=\s"yourSearchQuery\s" macro=\s"yourSearch query\s"></span>\sn"+"\st</td>\sn"+"\st<td class=\s"yourSearchButtons\s" align=\s"right\s">\sn"+"\st\st<span macro=\s"yourSearch chkPreviewText\s"></span><span class=\s"chkBoxLabel\s">preview text</span>\sn"+"\st\st<span macro=\s"yourSearch openAllButton\s"></span>\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Options' options 'Configure YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Help' help 'Get help how to use YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch closeButton\s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"\sn"+"<!-- The List of Found Tiddlers ============================================ -->\sn"+"<div id=\s"yourSearchResultItems\s" itemsPerPage=\s"25\s" itemsPerPageWithPreview=\s"10\s"></div>\sn"+"\sn"+"<!-- The Footer (with the Navigation) ============================================ -->\sn"+"<table class=\s"yourSearchFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\stResult page: <span class=\s"yourSearchNaviBar\s" macro=\s"yourSearch naviBar\s"></span>\sn"+"\st</td>\sn"+"\st<td align=\s"right\s"><span macro=\s"yourSearch version\s"></span>, <span macro=\s"yourSearch copyright\s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"<!-- end of the 'tiddlers found' case =========================================== -->\sn"+"</span>\sn"+"\sn"+"\sn"+"<!-- The \s"No tiddlers found\s" case =========================================== -->\sn"+"<span macro=\s"yourSearch if not found\s">\sn"+"<table class=\s"summary\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\stYourSearch Result: No tiddlers found for <span class=\s"yourSearchQuery\s" macro=\s"yourSearch query\s"></span>.\sn"+"\st</td>\sn"+"\st<td class=\s"yourSearchButtons\s" align=\s"right\s">\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Options' options 'Configure YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch linkButton 'YourSearch Help' help 'Get help how to use YourSearch'\s"></span>\sn"+"\st\st<span macro=\s"yourSearch closeButton\s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"</span>\sn"+"\sn"+"\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["YourSearchItemTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<span class='yourSearchNumber' macro='foundTiddler number'></span>\sn"+"<span class='yourSearchTitle' macro='foundTiddler title'/></span> - \sn"+"<span class='yourSearchTags' macro='foundTiddler tags'/></span>\sn"+"<span macro=\s"yourSearch if previewText\s"><div class='yourSearchText' macro='foundTiddler text'/></div></span>\sn"+"<!--\sn"+"}}}\sn"+"-->";config.shadowTiddlers["YourSearch"]="<<tiddler [[YourSearch Help]]>>";config.shadowTiddlers["YourSearch Result"]="The popup-like window displaying the result of a YourSearch query.";setStylesheet(store.getTiddlerText("YourSearchStyleSheet"),"yourSearch");var origMacros_search_handler=config.macros.search.handler;config.macros.search.handler=myMacroSearchHandler;var ownsOverwrittenFunctions=function(){var _16b=(config.macros.search.handler==myMacroSearchHandler);return _16b;};var checkForOtherHijacker=function(){if(!ownsOverwrittenFunctions()){alert("Message from YourSearchPlugin:\sn\sn\sn"+"Another plugin has disabled the 'Your Search' features.\sn\sn\sn"+"You may disable the other plugin or change the load order of \sn"+"the plugins (by changing the names of the tiddlers)\sn"+"to enable the 'Your Search' features.");}};setTimeout(checkForOtherHijacker,5000);abego.YourSearch.getStandardRankFunction=function(){return standardRankFunction;};abego.YourSearch.getRankFunction=function(){return abego.YourSearch.getStandardRankFunction();};abego.YourSearch.getCurrentTiddler=function(){return currentTiddler;};}\n/***\n%/\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005-2006 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n\n
I look at those around me and realize that they are just going through the motions, no more thought or feeling then waves in the ocean. They journey ever onward till thier energy is gone, or crash explosivly onto a cliff wall.
<div class='toolbar' macro='toolbar deleteTiddler closeOthers +saveTiddler -cancelTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<div class='toolbar' macro='toolbar changeContext projectify permalink references jump collapseOthers closeOthers +editTiddler collapseTiddler -closeTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>) <span macro='gtdActionCompleted'></span>complete</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><div macro='newReminder'></div>
<<newTiddler>> :: [[Project Review]] :: [[Action Review]] :: [[Reminders]] :: <<newerTiddler button:"Dump Brain" name:"New Dump" tags:"@inbox action">>\n\n^^Edit [[bottomMenu]]^^\n\n----\n^^This is a [[d3|http://dcubed.ca/]] setup using the GTDPlugins <<gtdVersion>>, published by Tom Otvos, \nand is running on [[TiddlyWiki|http://www.tiddlywiki.com]] <<version>>, which is published by Jeremy Ruston at Osmosoft under a BSD open source license.\nThere are also several other plugins (tagged <<tag systemConfig>>) installed which are owned by the person(s) who created them.\nMinor CSS tweaks by Ken Girard.^^\n----\n<html>\n<!-- SiteSearch Google -->\n<form method="get" action="http://www.google.com/custom" target="google_window">\n<table border="0" bgcolor="#cccccc">\n<tr>\n<td nowrap="nowrap" valign="top" align="left">\n<a href="http://www.google.com/">\n<img src="http://www.google.com/logos/Logo_25gry.gif" border="0" alt="Google" align="middle"></img></a>\n</td>\n<td nowrap="nowrap">\n<input type="hidden" name="domains" value="www.no-sin.com;www.kelagon.com;www.stlrenfaire.com;www.tiddlyspot.com/BrainDump/"></input>\n<input type="text" name="q" size="31" maxlength="255" value=""></input>\n</td>\n</tr>\n<tr>\n<td> </td>\n<td nowrap="nowrap">\n<table>\n<tr>\n<td>\n<input type="radio" name="sitesearch" value="" checked="checked"></input>\n<font size="-1" color="black">Web</font>\n</td>\n<td>\n<input type="radio" name="sitesearch" value="www.stlrenfaire.com"></input>\n<font size="-1" color="black">www.stlrenfaire.com</font>\n</td>\n</tr>\n<tr>\n<td>\n<input type="radio" name="sitesearch" value="www.tiddlyspot.com/BrainDump/" ></input>\n<font size="-1" color="black">BrainDump</font>\n</td>\n<td>\n<input type="radio" name="sitesearch" value="www.no-sin.com"></input>\n<font size="-1" color="black">No-Sin</font>\n</td>\n</tr>\n</table>\n<input type="submit" name="sa" value="Search"></input>\n<input type="hidden" name="client" value="pub-1211610758833151"></input>\n<input type="hidden" name="forid" value="1"></input>\n<input type="hidden" name="channel" value="6067441860"></input>\n<input type="hidden" name="ie" value="ISO-8859-1"></input>\n<input type="hidden" name="oe" value="ISO-8859-1"></input>\n<input type="hidden" name="cof" value="GALT:#CC0000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:E6E6E6;LBGC:FFFFCC;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;LH:100;LW:100;L:http://no-sin.com/images/ConventionWomen.gif;S:http://www.no-sin.com;LP:1;FORID:1;"></input>\n<input type="hidden" name="hl" value="en"></input>\n</td></tr></table>\n</form>\n<!-- SiteSearch Google -->\n</html>\n\n
Not really working yet\nThe idea is to have a button that will work as a mailto with the Tiddler title as the subject.\n\n<<brokeLink>>\n\n//{{{\nconfig.macros.brokeLink = {};\nconfig.macros.brokeLink.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n var contact = "pete@freewargamesrules.co.uk" \n wikify('[[BrokenLink|mailto:'+contact+'?subject=Error in '+escape(tiddler.title)+'&body='The link for the rules listed above appears to be broken. '+escape(tiddler.text)+']]',place);\n place.lastChild.className='button'; \n place.lastChild.title='Report broken link'; \n}\n//}}}
<div class='toolbar' macro='toolbar deleteContext deleteTiddler closeOthers +saveTiddler -cancelTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<div class='toolbar' macro='toolbar newAction permalink references jump collapseOthers closeOthers +editTiddler collapseTiddler -closeTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>)</div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
While I like the d3 action button, it seems that a button in the project tiddler that used the current tiddler.title as a tag for a new tiddler would be faster, especialy on the task that have nothing for me to write in them, or when I am brainstorming out a project.\n\nno wait, rather then a button what if I went back to my newReminder rip off idea? Have it create the gtdAction entry, then you click on the link and edit as you see fit? Give it a field for title & tags. Auto dump the current tiddler title in the tags. Bada boom, Bada bing, it is done.
http://sourceforge.net/projects/karsten\n\nKarsten SlideShow is a playlist-based open-source slide-show program for pictures and video clips on Microsoft Windows. It offers flexible, item-related control over the presentation sequence, and runs shows in a window, the screen saver, or the desktop wallpaper.
Action Goal:\n\nActions Required:\n\nMaterials Needed:\n\nTime Estimate:\n\nAdd Due Date & Progress Reports: <<newReminder>>
\n|Home Phone: | |\n|Cell Phone: | |\n|Work Phone: | |\n|E-mail: | <<email Blank at blank dot com>>|\n|IM Handle: | |\n|Website: | |\n| | |\n|Address: | |\n|City: | St. Louis, MO|\n\n\nBirthdate: <<reminder month: day: title:" " firstyear:1967>>>>\n\n<<newReminder>>\n
Details go here\n\n<<reminder date: month: year: title:" ">>
Noticed an article that said "children raised outside of marriage are not as successful in their careers" and uses this as an argument for folks to get/stay married. \nDid they take into account that it might be that the average single mom makes nex-to-nothing, so the kids are going to some of the worst schools around? \nDid they look at what might have happened if the parents didn't get a divorce?\n
\n<<forEachTiddler\n where\n 'tiddler.tags.contains("@journal")'\n sortBy\n 'tiddler.created'\n descending\n write\n '"|[["+tiddler.title+"]]|"+tiddler.created+"|\sn"'\n>>\n
<div class='toolbar' macro='toolbar deleteProject deleteProjectAll deleteTiddler closeOthers +saveTiddler -cancelTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<div class='toolbar' macro='toolbar newProjectAction permalink references jump collapseOthers closeOthers +editTiddler collapseTiddler -closeTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>)</div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
!!!!Use the showReminders macro to show upcoming reminders\nshowReminders searches through all tidders to find reminders that will be matched in the near future. Edit this tiddler to see the [[showRemindersSyntax]]\n\nNote that leadtime is 14 days by default, but below, it is specified as 30 days.\n\n<<showReminders leadtime:30>>\n!!!!Filtering based on tags\nYou can limit your search to only tiddlers with a certain tag:\nHelper: \n<<showReminders leadtime:30 tag:"Helper">>\nNot Holidays: \n<<showReminders leadtime:30 tag:"!holidays">>\n!!!!Limiting the results\nIndividual reminders can have a lead time that overrides the leadtime in showReminders. To turn off this behavior, use the limit argument to showReminders\n\n<<showReminders leadtime:5 limit>>\n!!!!Advanced formatting\nYou can use the format parameter to override the default message that is printed. For example, the following prints out a table of upcoming reminders.\n\n<<showReminders leadtime:30 format:"|DIFF|TITLE|TIDDLER|">>\n!!!!Specific Dates\nIf you want, and I don't know why you would, you can provide showReminders with a date to start from. These example shows three weeks worth of reminders starting at December 20th.\n<<showReminders leadtime:21 month:12 day:20 >>\n!!!!!From Jan 8, 2006\n<<showReminders leadtime:21 year:2006 month:1 day:8 format:"|DIFF|TITLE|TIDDLER|">>
* @@{{{leadtime:NUMBER}}}@@ or @@{{{leadtime:NUMBER...NUMBER}}}@@ - Use this to specify a lower and upper bound for reminders that will be shown. If only one number is specified, then it is treated as the upper bound, and zero is assumed for the lower bound. These bounds can be negative, in order to show past due reminders. For example, {{{leadtime:-5...-1}}} will show all reminders that matched in the last five days. If reminders specify a leadtime, then they may show up, even when they don't fit into showReminder's leadtime bounds. Use the limit argument to showReminders to override this behavior. If the leadtime parameter is missing, then {{{leadtime:0...14}}} will be assumed.\n\n* @@{{{nolinks}}}@@ - Deprecated. Override the format argument to control what the output looks like.\n\n* @@{{{limit}}}@@ - By default, individual reminders can override the leadtime specified by showReminders. Use this argument to override that behavior.\n\n* @@{{{tag:"STRING"}}}@@ - This filters out tiddlers based on the tag applied to them. Supply a space-separated list of tags. If a tag name begins with an {{{!}}}, then only tiddlers which do not have that tag will be considered. For example {{{tag:"examples holidays"}}} will search for reminders in any tiddlers that are tagged with examples or holidays and {{{tag:"!examples !holidays"}}} will search for reminders in any tiddlers that are not tagged with examples or holidays.\n\n* @@{{{format:"STRING"}}}@@ - Use this argument to override the default string used for display. You can put standard TiddlyWiki formatting in the format. The following substitutions will be made in the string before it is displayed.\n** DIFF will be replaced with the one of the strings "Today", "Tommorrow", or "N days", where N is the number of days between now and the date of the reminder. \n** TITLE will be replaced with the title of the reminder\n** DATE will be replaced with the matched date of the reminder.\n** ANNIVERSARY will be replaced with the number of years since between the matched date and firstyear\n** TIDDLER will be replaced with a link to the tiddler that contains the reminder. For example: [[Hello there]]\n** TIDDLERNAME will be replaced with the text of the tiddler title contains the reminder. For example: Hello there\nThe default string is "DIFF: TITLE on DATE ANNIVERSARY -- TIDDLER"
Say here is an idea, how about a macro that lets me link to other \nTiddlySpot users? Something like <<tsUser "ThatOneGuy">> that automakes \na prettylink that points at http://tiddlyspot.com/ThatOneGuy/ ? \nLiveJournal has something like this in it. Maybe even add on so I can \ndo <<tsUser "ThatOneGuy" "Journal">> to send them to \nhttp://tiddlyspot.com/ThatOneGuy/index.html?#Journal \n\n\n
All those actions which don't have a context.\n\n<<gtdActionList>>