/***\n|''Name:''|CalendarPlugin|\n|''Source:''|http://www.TiddlyTools.com/#CalendarPlugin|\n|''Author:''|SteveRumsby|\n|''License:''|unknown|\n|''~CoreVersion:''|2.0.10|\n\n// // updated by Jeremy Sheeley to add cacheing for reminders\n// // see http://www.geocities.com/allredfaq/reminderMacros.html\n// // ''Changes by ELS 2006.08.23:''\n// // added handling for weeknumbers (code supplied by Martin Budden. see "wn**" comment marks)\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\n!!!!!Configuration:\n<<option chkDisplayWeekNumbers>> Display week numbers //(note: Monday will be used as the start of the week)//\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//{{{\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;\nif(config.options.chkDisplayWeekNumbers == undefined)//wn**\n config.options.chkDisplayWeekNumbers = false;\nif(config.options.chkDisplayWeekNumbers)\n config.options.txtCalFirstDay = 0;\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 yearHeader.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?22:19);//wn**\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 month.setAttribute("colSpan", config.options.chkDisplayWeekNumbers?6:5);//wn**\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 month.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?8:7);//wn**\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 if (config.options.chkDisplayWeekNumbers) createTiddlyElement(row, "td");//wn**\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 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 if (config.options.chkDisplayWeekNumbers){\n if (first<=max) {\n var ww = new Date(year,mon,first);\n createTiddlyElement(row, "td", null, null, "w"+ww.getWeek());//wn**\n }\n else createTiddlyElement(row, "td", null, null, null);//wn**\n }\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\n
/***\n| Name:|CloseOnCancelPlugin|\n| Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nmerge(config.commands.cancelTiddler,{\n\n handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,\n\n handler: function(event,src,title) {\n this.handler_orig_closeUnsaved(event,src,title);\n if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))\n story.closeTiddler(title,true);\n return false;\n }\n\n});\n\n//}}}\n\n
Name: Blue\nBackground: #fff\nForeground: #000\nPrimaryPale: #cdf\nPrimaryLight: #57c\nPrimaryMid: #114\nPrimaryDark: #012\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
\n|MonkeyGTDSettings|Change settings|\n|<<selectPalette>>|Change colour scheme|\n|Version|<<tiddler MonkeyGTDVersion>>|\n|[[Upgrade]]|Upgrade to the latest MonkeyGTD|\n|[[Area]]|To add/remove Areas of Responsibilty|\n|[[Realm]]|To add/remove Realms|\n|[[ViewDashboardTemplate]]|This defines the dashboards and lists|\n|[[ViewPanelTemplate]]|This controls the toolbar panels|\n|MainMenu|Defines the menu bar|\n|DefaultTiddlers|Defines what to show at startup|\n|SiteTitle|Site title|\n|SiteSubtitle|Site subtitle|\n|GTDComponent|For advanced use only|\n\n!Notes\n* I have hard coded references to "Professional" and "Personal" in a couple of places so it's better to just use those at least for now.\n* If you add a new context/area etc you won't see it until you click "refresh" on one of your tiddler toolbars\n\n!What's New\n* 24 Oct 06\n** Drop down select for projects and areas as suggested by Ken Girard.\n
//{{{\nconfig.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit\nconfig.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler\nconfig.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist\nconfig.views.editor.defaultText = ""; // don't need message when creating a new tiddler \n//}}}\n
/***\nVersion: $$version$$\nCreates a bunch of shadow tiddlers for the dashboards and panels \n***/\n\n//{{{\nmerge(config.shadowTiddlers,{\n\n'ActionPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Action\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "<tr macro=\s"showWhen tiddler.getProject() == ''\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Project:</td><td><span macro=\s"dropdownSelect Project\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Context:</td><td><span macro=\s"checkboxList Context\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Status:</td><td><span macro=\s"checkboxList ActionStatus\s"></span></td></tr>",\n ""\n].join("\sn"),\n\n'ActionTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Actions by Status'",\n " tags:!Done",\n " group:ActionStatus",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Actions by Realm'",\n " group:Realm",\n " tags:!Done",\n " \s"></div>",\n "",\n "",\n "",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'AreaDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:Projects",\n " tags:Project",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions'",\n " tags:'Next && Action && !Done'",\n " view:action_proj",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Waiting For'",\n " tags:'[(Waiting For)] && Action && !Done'",\n " view:action_proj",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Reference'",\n " tags:'Reference'",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Sub Areas'",\n " tags:Area",\n " \s"></div>",\n "",\n "</td>",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'AreaPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Area\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newHere title:'New Project' label:'new project' tag: Project GTD\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new next action' tag: Action GTD Next\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new waiting action' tag: Action GTD 'Waiting For'\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new future action' tag: Action GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'AreaTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Areas by Realm'",\n " group:Realm",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Projects by Area'",\n " tags:Project",\n " group:Area",\n " mode:global",\n " \s"></div>",\n "",\n "</td>",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'CollectThoughtsTiddlerDash':[\n "",\n "<div macro=\s"collectThoughts\s"></div>",\n ""\n].join("\sn"),\n\n'ContextDash':[\n "<table width=\s"100%\s">",\n "<tr>",\n "<td valign=\s"top\s" width=\s"50%\s">",\n " <div macro=\s"listByTag title:'Next Actions'",\n " tags:'Action && Next && !Done'",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "</td>",\n "<td valign=\s"top\s" width=\s"50%\s">",\n " <div macro=\s"listByTag title:'Waiting For Actions'",\n " tags:'Action && [(Waiting For)] && !Next && !Done'",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Future Actions'",\n " tags:'Action && ![(Waiting For)] && !Next && !Done'",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "</td>",\n "</tr>",\n "</table>",\n ""\n].join("\sn"),\n\n'ContextTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Contexts'",\n " \s"></div>",\n "",\n "</td>",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'InboxTiddlerDash':[\n "",\n "<div macro=\s"listByTag\s"",\n " title:'Inbox items'",\n " tags:'Inbox'",\n " ></div>",\n ""\n].join("\sn"),\n\n'MainDashDash':[\n "<table width=\s"100%\s">",\n "<tr>",\n "<td valign=\s"top\s" width=\s"50%\s">",\n "",\n "",\n " <div macro=\s"listByTag title:'Next Actions'",\n " tags:'Action && Next && !Done'",\n " view:action_proj",\n " group:Context",\n " mode:global",\n " \s"></div>",\n "",\n "</td><td valign=\s"top\s">",\n "",\n " <div macro=\s"listByTag title:'Current Ticklers'",\n " tags:'Tickler && !Processed'",\n " view:tickler",\n " sort:tickleDate",\n " where:'tiddler.tickleDate() <= (new Date()).convertToLocalYYYYMMDDHHMM()'",\n " mode:global",\n " \s"></div>",\n "",\n "",\n " <div macro=\s"listByTag title:'Waiting For'",\n " tags:'Action && [(Waiting For)] && !Done'",\n " view:action_proj",\n " group:Context",\n " mode:global",\n " \s"></div>",\n "",\n "",\n "</td>",\n "</tr>",\n "</table>",\n ""\n].join("\sn"),\n\n'MainDashPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag MainDash\s"></span></td></tr>",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newTiddler label:'new project' tag: Project GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new next action' tag: Action Next GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new waiting action' tag: Action GTD 'Waiting For'\s"></span>",\n " <span macro=\s"newTiddler label:'new future action' tag: Action GTD\s"></span>",\n " <span macro=\s"newTiddler title:'New Tickler' label:'new tickler' tag: Tickler GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new context' tag: Context GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new area' tag: Area GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'NextTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions by Context'",\n " tags:!Done",\n " view:action_proj",\n " group:Context",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"34%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions by Realm'",\n " tags:!Done",\n " view:action_proj",\n " group:Realm",\n " \s"></div>",\n "",\n "</td><td width=\s"34%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions by Project'",\n " tags:!Done",\n " view:action",\n " group:Project",\n " \s"></div>",\n "",\n "",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'ProcessInboxTiddlerDash':[\n "",\n "",\n "<div macro=\s"processInbox\s"></div>",\n ""\n].join("\sn"),\n\n'ProjectDash':[\n "<table style=\s"width:100%\s"><tr>",\n "",\n "<td valign=\s"top\s" width=\s"33%\s" cellspacing=\s"0\s" border=\s"0\s">",\n "",\n " <div macro=\s"listByTag title:'Next Actions'",\n " tags:'Action && Next && !Done'",\n " view:action",\n " group:Context",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Waiting For'",\n " tags:'Action && [(Waiting For)] && !Done'",\n " view:action",\n " \s"></div>",\n "",\n "</td><td valign=\s"top\s" width=\s"34%\s">",\n "",\n " <div macro=\s"listByTag title:'Ticklers'",\n " tags:'Tickler && !Done'",\n " view:tickler",\n " \s"></div>",\n "",\n "",\n " <div macro=\s"listByTag title:'Sub Projects'",\n " tags:'Project'",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Future Actions'",\n " tags:'Action && ![(Waiting For)] && !Next && !Done'",\n " view:action",\n " \s"></div>",\n "",\n "</td><td valign=\s"top\s" width=\s"33%\s">",\n "",\n " <div macro=\s"listByTag title:'Reference'",\n " tags:'Reference'",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Recently Done'",\n " tags:'Action && Done'",\n " limit:10",\n " view:action_plain",\n " sortBy:-modified",\n " \s"></div>",\n "",\n "</td>",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'ProjectPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Project\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "<!-- <tr><td class=\s"label\s">Area:</td><td><span macro=\s"checkboxList Area\s"></span></td></tr> -->",\n "<tr macro=\s"showWhenTagged Professional\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area && Professional\s"></span></td></tr>",\n "<tr macro=\s"showWhenTagged Personal\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area && Personal\s"></span></td></tr>",\n "<tr macro=\s"hideWhen tiddler.tags.containsAny(['Professional','Personal'])\s"><td class=\s"label\s">Area:</td><td><span macro=\s"dropdownSelect Area\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Status:</td><td><span macro=\s"checkboxList ProjectStatus\s"></span></td>",\n "",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"deleteAllTagged 'remove project' delete\s"></span>",\n "</td></tr>",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newHere title:'New Action' label:'new next action' tag: Action Next GTD\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new waiting action' tag: Action GTD 'Waiting For'\s"></span>",\n " <span macro=\s"newHere title:'New Action' label:'new future action' tag: Action GTD\s"></span>",\n " <span macro=\s"newHere label:'new sub-project' tag: Project GTD\s"></span>",\n " <span macro=\s"newHere title:'New Tickler' label:'new tickler' tag: Tickler GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new context' tag: Context GTD\s"></span>",\n " <span macro=\s"newTiddler label:'new area' tag: Area GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'ProjectTiddlerDash':[\n "<!-- ******************************* -->",\n "<!-- contributed by Michael Lockhart -->",\n "<!-- ******************************* -->",\n "",\n "<!--",\n "~MJL20070205 - Customized Project Tiddler.",\n "This overrides the ProjectTiddlerDash shadow tiddler from MonkeyGTD 2.1 alpha r77 with a new dashboard focussing on",\n "the GTD weekly review task. I have added these features:",\n "",\n " * An ability to see Completed projects and to remove old tasks via the DeleteDoneTasks macro",\n " * Separate out the Someday/Maybe projects to help with assessing if any can be activated",\n " * GTD Weekly Review instructions",\n " * Inspiration for new ideas during review",\n " * A link to a Review How To tiddler that guides me through the GTD process",\n "",\n "-->",\n "",\n "<div style=\s"margin-top:1em;\s" macro=\s"tiddler ReviewTips\s"></div>",\n "",\n "<table width=\s"100%\s"><tr>",\n "",\n "<td style=\s"vertical-align:top\s" width=\s"50%\s">",\n "",\n "<div macro=\s"listByTag title:'Projects by Area'",\n " tags:'!Complete && !Someday/Maybe'",\n " group:Area",\n " view:showstar",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Someday/Maybe Projects'",\n " mode:global",\n " tags:'Someday/Maybe && !Complete'",\n " view:showstar",\n " group:Area",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Completed Projects'",\n " mode:global",\n " tags:'Complete'",\n " view:showstar",\n " group:Area",\n " \s"></div>",\n "",\n "<div macro=\s"deleteDone daysOld:20 title:'Delete Old Actions' \s"></div>",\n "",\n "</td>",\n "",\n "<td valign=\s"top\s" width=\s"50%\s">",\n "<div macro=\s"listByTag title:'Actions by Project'",\n " mode:global",\n " tags:'Action && Next && !Done && !Someday/Maybe'",\n " view:action",\n " group:Project",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Projects that need a next action'",\n " mode:global",\n " tags:'Action && !Done && (Next || [(Waiting For)])'",\n " group:'Project && !Someday/Maybe && !Complete'",\n " onlyShowEmpty:yes",\n " \s"></div>",\n "",\n "</td>",\n "",\n "</tr></table>",\n "",\n "",\n "",\n "",\n "",\n "<!-- old version -->",\n "<!-- ",\n "",\n "<table width=\s"100%\s"><tr>",\n "<td style=\s"vertical-align:top\s" width=\s"50%\s">",\n "",\n "<div macro=\s"listByTag title:'Projects by Area'",\n " tags:!Complete",\n " group:Area",\n " view:showstar",\n " \s"></div>",\n "",\n "</td>",\n "",\n "<td valign=\s"top\s" width=\s"50%\s">",\n "<div macro=\s"listByTag title:'Actions by Project'",\n " mode:global",\n " tags:'Action && Next && !Done'",\n " view:action",\n " group:Project",\n " \s"></div>",\n "</td>",\n "",\n "</tr></table>",\n "",\n "",\n "-->",\n ""\n].join("\sn"),\n\n'RealmDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Next Actions'",\n " tags:'Next && Action && !Done && ![(Waiting For)]'",\n " view:action_proj",\n " group:Context",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Waiting For'",\n " tags:'[(Waiting For)] && Action && !Done'",\n " view:action_proj",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "",\n "<div macro=\s"listByTag title:Projects",\n " tags:'Project && !Complete && ![(Someday/Maybe)]'",\n " group:Area",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "<div macro=\s"listByTag title:'Someday/Maybe'",\n " tags:'Project && !Complete && [(Someday/Maybe)]'",\n " group:Area",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "",\n "<div macro=\s"listByTag title:Areas",\n " tags:Area",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "</td></tr></table>",\n ""\n].join("\sn"),\n\n'RealmPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Realm\s"></span></td></tr>",\n "",\n "<tr><td class=\s"label\s"></td><td>",\n " <span macro=\s"newHere label:'new area' tag: Area GTD\s"></span>",\n " <span macro=\s"newHere label:'new project' tag: Project GTD\s"></span>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'RealmTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Realms'",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "</td>",\n "<td width=\s"33%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Areas by Realm'",\n " tags:Area",\n " group:Realm",\n " mode:global",\n " ignoreRealm:yes",\n " \s"></div>",\n "",\n "",\n "",\n "</td>",\n "",\n "</tr></table>",\n ""\n].join("\sn"),\n\n'StarredTiddlerDash':[\n "",\n "<table width=\s"100%\s"><tr>",\n "<td style=\s"vertical-align:top\s" width=\s"50%\s">",\n "",\n " <div macro=\s"listByTag title:'Starred Next Actions'",\n " tags:'Action && Next && Starred && !Done'",\n " group:Context",\n " view:action",\n " \s"></div>",\n "",\n " <div macro=\s"listByTag title:'Starred Waiting For Actions'",\n " tags:'Action && [(Waiting For)] && Starred && !Done'",\n " group:Context",\n " view:action",\n " \s"></div>",\n "",\n "",\n "</td>",\n "",\n "<td valign=\s"top\s" width=\s"50%\s">",\n " <div macro=\s"listByTag title:'Starred'",\n " tags:'Starred && !Complete && !Done && !Action'",\n " group:GTDComponent",\n " view:showstar",\n " \s"></div>",\n "</td>",\n "",\n "</tr></table>",\n "",\n "",\n ""\n].join("\sn"),\n\n'TicklerPanel':[\n "<tr><td class=\s"label\s">Type:</td><td><span macro=\s"toggleTag Tickler\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Realm:</td><td><span macro=\s"checkboxList Realm\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Processed:</td><td><span macro=\s"toggleTag Processed\s"></span></td></tr>",\n "<tr><td class=\s"label\s">Tickler:</td><td>",\n " <table class=\s"ticklerDate\s">",\n " <tr>",\n " <td macro=\s"hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"right\s"><span macro=\s"view mgtd.tday\s"></span></td>",\n " <td macro=\s"showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"right\s"><span macro=\s"view mgtd.tmonth\s"></span></td>",\n " <td>/</td>",\n " <td macro=\s"hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"center\s"><span macro=\s"view mgtd.tmonth\s"></span></td>",\n " <td macro=\s"showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'\s" align=\s"center\s"><span macro=\s"view mgtd.tday\s"></span></td>",\n " <td>/</td>",\n " <td align=\s"left\s" macro=\s"view mgtd.tyear\s"></td>",\n " </tr>",\n " </table>",\n "</td></tr>",\n ""\n].join("\sn"),\n\n'TicklerTiddlerDash':[\n "<table width=\s"100%\s"><tr>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Current Ticklers'",\n " tags:'!Processed'",\n " view:tickler",\n " sort:tickleDate",\n " where:'tiddler.tickleDate() <= (new Date()).convertToLocalYYYYMMDDHHMM()'",\n " \s"></div>",\n "",\n "",\n "",\n "</td>",\n "<td width=\s"50%\s" style=\s"vertical-align:top\s">",\n "",\n "<div macro=\s"listByTag title:'Upcoming Ticklers'",\n " tags:'!Processed'",\n " view:tickler",\n " sort:tickleDate",\n " where:'tiddler.tickleDate() > (new Date()).convertToLocalYYYYMMDDHHMM()'",\n " \s"></div>",\n "",\n "<!--",\n "<div macro=\s"listByTag title:'Ticklers by Project'",\n " group:Project",\n " \s"></div>",\n "-->",\n "",\n "",\n "</td></tr></table>",\n ""\n].join("\sn")\n\n});\n//}}}\n
[[Welcome to Tiddlyspot]] [[Dashboard]]\n
/***\n|Name|DeleteAllTaggedPlugin|\n|Source|http://ido-xp.tiddlyspot.com/#DeleteAllTaggedPlugin|\n|Version|1.0|\n\nAn adaptation of DeleteDoneTasks (Simon Baird) by Ido Magal\nTo use this insert {{{<<deleteAllTagged>>}}} into the desired tiddler.\n\nExample usage:\n{{{<<deleteAllTagged>>}}}\n<<deleteAllTagged>>\n***/\n//{{{\n\nconfig.macros.deleteAllTagged = {\n handler: function ( place,macroName,params,wikifier,paramString,tiddler ) {\n var buttonTitle = params[0] ? params[0] : "Delete Tagged w/ '"+tiddler.title+"'"; // simon's tweak\n var alsoDeleteThisTiddler = params[1] ? params[1] : "";\n createTiddlyButton( place, buttonTitle, "Delete every tiddler tagged with '"+tiddler.title+"'", this.deleteAllTagged( tiddler.title, alsoDeleteThisTiddler == "delete" ));\n },\n\n deleteAllTagged: function(tag,deleteMe) {\n return function() {\n var collected = [];\n store.forEachTiddler( function ( title,tiddler ) {\n if ( tiddler.tags.contains( tag ))\n {\n collected.push( title );\n }\n });\n if ( collected.length == 0 )\n {\n alert( "No tiddlers found tagged with '"+tag+"'." );\n }\n else\n {\n if ( confirm( "These tiddlers are tagged with '"+tag+"'\sn'"\n + collected.join( "', '" ) + "'\sn\sn\sn"\n + "Are you sure you want to delete these?" ))\n {\n for ( var i=0;i<collected.length;i++ )\n {\n store.deleteTiddler( collected[i] );\n story.closeTiddler( collected[i], true );\n displayMessage( "Deleted '"+collected[i]+"'" );\n }\n }\n }\n if (deleteMe)\n {\n if ( confirm( "Also delete this tiddler ('"+tag+"')?" ) )\n {\n store.deleteTiddler( tag );\n story.closeTiddler( tag, true );\n displayMessage( "Deleted '"+tag+"'" );\n }\n }\n }\n }\n};\n\n//}}}\n\n\n/***\nExample usage:\n{{{<<deleteDone>>}}}\n<<deleteDone>>\n{{{<<deleteDone daysOld:20 title:'delete old'>>}}}\n<<deleteDone daysOld:30 title:'delete old'>>\n\nTODO merge these two\n\n***/\n//{{{\n\n\n\n\nconfig.macros.deleteDone = {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var namedParams = (paramString.parseParams('daysOld'))[0];\n var daysOld = namedParams['daysOld'] ? namedParams['daysOld'][0] : 30; // default\n var buttonTitle = namedParams['title'] ? namedParams['title'][0] : "Delete Done Actions";\n createTiddlyButton(place,buttonTitle,"Delete done actions older than "+daysOld+" days old",this.deleteDone(daysOld));\n },\n\n deleteDone: function(daysOld) {\n return function() {\n var collected = [];\n var compareDate = new Date();\n compareDate.setDate(compareDate.getDate() - daysOld);\n store.forEachTiddler(function (title,tiddler) {\n if (tiddler.tags.containsAll(["Action","Done"])\n && tiddler.modified < compareDate) {\n collected.push(title);\n }\n });\n if (collected.length == 0) {\n alert("No done actions found older than "+daysOld+" days");\n }\n else {\n if (confirm("Done actions older than "+daysOld+" days:\sn'"\n + collected.join("', '") + "'\sn\sn\sn"\n + "Are you sure you want to delete these actions?")) {\n for (var i=0;i<collected.length;i++) {\n store.removeTiddler(collected[i]);\n displayMessage("Deleted '"+collected[i]+"'");\n story.closeTiddler( collected[i], true );\n }\n }\n }\n }\n }\n};\n\n//}}}\n\n
\n<div style="display:none" macro="showWhen tiddler.tags.containsAll(['GTD','Action']) || tiddler.title == 'New Action'">\n <span>Project field (not used yet):</span><span macro="edit mgtd.project"></span>\n</div>\n<div macro="showWhen tiddler.tags.containsAll(['GTD','Tickler']) || tiddler.title == 'New Tickler'">\n\n <table>\n <tr><td class="editLabel" valign="top" rowspan="2">Tickler</td>\n <!-- TODO make a utility method for this sort of thing -->\n <td macro="showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" class="editLabel">Month</td>\n <td class="editLabel">Day</td>\n <td macro="hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" class="editLabel">Month</td>\n <td class="editLabel">Year</td></tr>\n <tr>\n <td macro="showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" ><span class="shorterEdit" macro="edit mgtd.tmonth"></span></td>\n <td><span class="shorterEdit" macro="edit mgtd.tday"></span></td>\n <td macro="hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'" ><span class="shorterEdit" macro="edit mgtd.tmonth"></span></td>\n <td><span class="shorterEdit" macro="edit mgtd.tyear"></span></td>\n </tr>\n </table>\n\n</div>\n\n
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div macro="showWhenExists EditPanelTemplate">[[EditPanelTemplate]]</div>\n<div class="editor" macro="edit text"></div>\n\n
These tiddlers are important so don't delete them.
@@color:#aaa;font-size:90%;[[By Matt Vance|http://www.minezone.org/wiki/MVance/GettingThingsDone]]@@\n!!Notes from [[Getting Things Done|http://www.amazon.com/exec/obidos/ASIN/0142000280/minezoneorg-20/ref%3Dnosim/103-9510267-6974266]] by David Allen\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 ([[The Three-fold Nature of Work|http://www.effectivemeetings.com/productivity/timemanagement/natureofwork.asp]])\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* ''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\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\n*** 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"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----\nPick up anything around you that you're wondering what to do with, and apply a simple set of formulae:\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 - from [[David Allen|http://www.davidco.com/]]'s Productivity Principles newsletter \n----\n!!!See Also:\n* [[Book Notes|http://www.minezone.org/wiki/MVance/BookNotes]] -- MVance's notes on lots of other books\n* [[Notes from "Now Habit"|http://www.minezone.org/wiki/MVance/NowHabit]] -- notes from a book on productivity, motivation, etc.\n* [[Getting Things Done When You're Only a Grunt|http://www.joelonsoftware.com/articles/fog0000000332.html]] -- taking charge when you're not in charge (check out the comments too)\n* [[The PigPog Method|http://pigpog.com/michael/blog/2004/08/productivity-gtd-pigpog-method.php]] -- a useful hack for those using PDAs\n* [[Cascading Next Actions|http://www.marktaw.com/blog/CascadingNextActions.html]] -- good information on breaking projects down into manageable chunks\n* [[One-Page Workflow Chart|http://www.davidco.com/pdfs/gtd_workflow_advanced.pdf]] (PDF) -- a visual flowchart for dealing with incoming information\n* [[43 Folders: GTD on a Mac|http://www.43folders.com/]] -- a great resource related to Lifehacks and Getting Things Done\n* [[Getting Things Done Zone on OfficeZealot.com|http://www.officezealot.com/gtd/]] -- lots of articles related to Getting Things Done \n
/***\n| Name:|HideWhenPlugin|\n| Description:|Allows conditional inclusion/exclusion in templates|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\nFor use in ViewTemplate and EditTemplate. Eg\n{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\n\nwindow.removeElementWhen = function(test,place) {\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n};\n\nmerge(config.macros,{\n\n hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( eval(paramString), place);\n }},\n\n showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !eval(paramString), place);\n }},\n\n hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAny(params), place);\n }},\n\n showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAny(params), place);\n }},\n\n hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);\n }},\n\n showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);\n }}\n\n});\n\n//}}}\n\n
//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) ([\sw\ss]*)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart )\n {\n var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\su00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = "none";\n wikify(lookaheadMatch[2],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e)\n {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n});\n//}}}
//{{{\n\n// By Lewcid\n// http://tw.lewcid.org/sandbox/#InlineTabsPlugin\n\nconfig.formatters.unshift( {\n name: "inlinetabs",\n match: "\s\s<tabs",\n lookaheadRegExp: /(?:<tabs (.*)>\sn)((?:.|\sn)*?)(?:\sn<\s/tabs>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var cookie = lookaheadMatch[1];\n var wrapper = createTiddlyElement(null,"div",null,cookie);\n var tabset = createTiddlyElement(wrapper,"div",null,"tabset");\n tabset.setAttribute("cookie",cookie);\n var validTab = false;\n var firstTab = '';\n var tabregexp = /(?:<tab (.*)>)(?:(?:\sn)?)((?:.|\sn)*?)(?:<\s/tab>)/mg;\n while((m = tabregexp.exec(lookaheadMatch[2])) != null)\n {\n if (firstTab == '') firstTab = m[1];\n var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");\n tab.setAttribute("tab",m[1]);\n tab.setAttribute("content",m[2]);\n tab.title = m[1];\n if(config.options[cookie] == m[1])\n validTab = true;\n }\n if(!validTab)\n config.options[cookie] = firstTab;\n w.output.appendChild(wrapper);\n story.switchInlineTab(tabset,config.options[cookie]);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n})\n\nStory.prototype.switchInlineTab = function(tabset,tab)\n{\n var cookie = tabset.getAttribute("cookie");\n var theTab = null\n var nodes = tabset.childNodes;\n for(var t=0; t<nodes.length; t++)\n if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)\n {\n theTab = nodes[t];\n theTab.className = "tab tabSelected";\n }\n else\n nodes[t].className = "tab tabUnselected"\n if(theTab)\n {\n if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")\n tabset.parentNode.removeChild(tabset.nextSibling);\n var tabContent = createTiddlyElement(null,"div",null,"tabContents");\n tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);\n wikify(theTab.getAttribute("content"),tabContent);\n if(cookie)\n {\n config.options[cookie] = tab;\n saveOptionCookie(cookie);\n }\n }\n}\n \nStory.prototype.onClickInlineTab = function(e)\n{\n story.switchInlineTab(this.parentNode,this.getAttribute("tab"));\n return false;\n}\n//}}}\n\n
/***\n| Name:|InstantTimestampPlugin|\n| Created by:|SimonBaird|\n| Location:|http://instanttimestamp.tiddlyspot.com/|\n| Version:|1.0.5 (17-Jan-2007)|\n| Requires:|~TW2.x|\n!Description\nIf you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list:\n* {ts} or {t} -> timestamp\n* {ds} or {d} -> datestamp\n* !ts or !t at start of line -> !!timestamp\n* !ds or !d at start of line -> !!datestamp\n(I added the extra ! since that's how I like it. Remove it from translations below if required)\n!Notes\n* Change the timeFormat and dateFormat below to suit your preference.\n* See also AutoCorrectPlugin\n!History\n* 17-Jan-07, version 1.0.5\n** added fields param to saveTiddler method needed in TW 2.1+\n* 06-Apr-06, version 1.0.4\n** removed the AutoCorrect stuff and put it in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.3\n** now have exclusion by tag and tiddler name, probably less important here than in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.2\n** put matches into array to and eval them to allow generic substitutions\n* 05-Apr-06, version 1.0.1\n** added ds for datestamp as suggested by DanielBaird\n** made case insensitive\n** Added translation for !t at start of line\n* 05-Apr-06, version 1.0.0\n** written after suggestion by Achim Wessling \n!Code\n***/\n//{{{\n\nconfig.InstantTimestamp = {\n\n // adjust to suit\n timeFormat: 'DD/0MM/YY 0hh:0mm',\n dateFormat: 'DD/0MM/YY',\n\n translations: [\n [/^!ts?$/img, "'!!'+now.formatString(config.InstantTimestamp.timeFormat)"],\n [/^!ds?$/img, "'!!'+now.formatString(config.InstantTimestamp.dateFormat)"],\n [/\s{ts?\s}/ig, "now.formatString(config.InstantTimestamp.timeFormat)"],\n [/\s{ds?\s}/ig, "now.formatString(config.InstantTimestamp.dateFormat)"]\n ],\n\n excludeTags: [\n "noAutoCorrect",\n "html",\n "CSS",\n "css",\n "systemConfig",\n "zsystemConfig",\n "Plugins",\n "Plugin",\n "plugins",\n "plugin",\n "javascript",\n "code"\n ],\n\n excludeTiddlers: [\n "StyleSheet",\n "StyleSheetLayout",\n "StyleSheetColors",\n "StyleSheetPrint"\n ]\n\n}; \n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.find(item) != null);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nTiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields) {\n\n tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n var conf = config.InstantTimestamp;\n\n if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {\n\n var now = new Date();\n var trans = config.InstantTimestamp.translations;\n for (var i=0;i<trans.length;i++) {\n newBody = newBody.replace(trans[i][0], eval(trans[i][1]));\n }\n }\n\n return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields);\n}\n\n//}}}\n\n
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
Name: Blue\nBackground: #fff\nForeground: #000\nPrimaryPale: #cdf\nPrimaryLight: #57c\nPrimaryMid: #114\nPrimaryDark: #012\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
Name: Green\nBackground: #fff\nForeground: #000\nPrimaryPale: #9b9\nPrimaryLight: #385\nPrimaryMid: #031\nPrimaryDark: #020\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
Name: Red\nBackground: #fff\nForeground: #000\nPrimaryPale: #fdd\nPrimaryLight: #c55\nPrimaryMid: #711\nPrimaryDark: #500\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
Name: Smoke\nBackground: #fff\nForeground: #000\nPrimaryPale: #aaa\nPrimaryLight: #777\nPrimaryMid: #111\nPrimaryDark: #000\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n\n
[[Do Work|Dashboard]]\n [[Process Inbox]]\n /% [[Add to Inbox|Collect Thoughts]] %/\n /% [[Inbox]] %/\n [[Review|Project]]\n/%\n <<tag Realm>>\n {{new{''<<newTiddler label:'+' title:'New Action' tag: Action Next GTD>>''}}}\n {{tag{<<tag Action>>}}}\n {{new{''<<newTiddler label:'+' title:'New Project' tag: Project GTD>>''}}}\n {{tag{<<tag Project>>}}}\n {{new{''<<newTiddler label:'+' title:'New Tickler' tag: Tickler GTD>>''}}}\n {{tag{<<tag Tickler>>}}}\n {{new{''<<newTiddler label:'+' title:'New Context' tag: Context GTD>>''}}}\n {{tag{<<tag Context>>}}}\n {{new{''<<newTiddler label:'+' title:'New Area' tag: Area GTD>>''}}}\n {{tag{<<tag Area>>}}}\n%/\n@@padding-left:1em;font-size:70%;\n [[starred|Starred]] &nbsp;&nbsp;\n {{tag{<<tag more|GTDComponent>>}}}\n [[config|Config]]\n [[update|Upgrade]]\n@@\n @@padding-left:1em;color:[[ColorPalette::PrimaryLight]];<<tiddler MonkeyGTDVersion>>@@\n
/***\n\n\n***/\n//{{{\n\nconfig.mGTD = {\n\n star: "\su2605",\n // star: "*", // use in case the above doesn't work on your system\n \n config: {}, // gets populated by populateLists\n\n tiddlerViews: {\n phoneList:\n "'|[['+this.title+']]"+\n "|'+config.mGTD.undefBlank(store.getTiddlerSlice(this.title,'phone'))+'"+\n "|\s\sn'",\n tickler:\n "'|<<toggleTag Processed [['+this.title+']] ->>|[['+this.title+']]"+\n "|'+"+\n "((store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true')"+\n "?(this.mGet('tmonth')+'/'+this.mGet('tday'))"+\n ":(this.mGet('tday')+'/'+this.mGet('tmonth')))"+\n "+'/'+this.mGet('tyear')+'|\s\sn'",\n // TODO ffs use classes for these\n groupBy:\n "'{{groupBy{[['+this.title+']] }}}\s\sn'",\n showstar:\n "'{{starthing{"+\n "@@font-size:80%;"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] }}}\s\sn'",\n showstar2:\n "'{{starthing{"+\n "@@font-size:80%;margin-left:2em;"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] }}}\s\sn'",\n action:\n "'{{action{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'",\n action2:\n "'{{action2{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'",\n action_proj:\n "'{{action{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "'+this.getProjectTextForList()+'"+\n "}}}\s\sn'",\n action_proj2:\n "'{{action2{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n "<<tTag tag:Next mode:text text:N title:[['+this.title+']]>>"+\n "<<tTag tag:[[Waiting For]] mode:text text:W title:[['+this.title+']]>>"+\n "<<tTag tag:[[Starred]] mode:text text:{{config.mGTD.star}} title:[['+this.title+']]>>"+\n " @@"+\n "[['+this.title+']] "+\n "'+this.getProjectTextForList()+'"+\n "}}}\s\sn'",\n action_plain:\n "'{{action{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'",\n action_plain2:\n "'{{action2{"+\n "@@font-size:80%;"+\n "<<toggleTag Done [['+this.title+']] ->>"+\n " @@"+\n "[['+this.title+']] "+\n "}}}\s\sn'"\n\n },\n\n getListByTag: function(tag) {\n return store.getTaggedTiddlers(tag).map( function(t) { return t.title; } );\n },\n\n populateLists: function() {\n\n // the meta list\n this.config.GTDComponent = this.getListByTag("GTDComponent");\n\n for (var i=0;i<this.config.GTDComponent.length;i++) {\n this.config[this.config.GTDComponent[i]] = this.getListByTag(this.config.GTDComponent[i]);\n }\n\n },\n\n undefBlank: function(value) {\n return value ? value.toString() : "";\n },\n\n commands: {\n refresh: {\n text: 'refresh',\n tooltip: 'Refresh this tiddler',\n handler: function(e,src,title) {\n clearMessage();\n if (config.mGTD.populateLists)\n config.mGTD.populateLists();\n story.refreshTiddler(title,null,true);\n return false; \n }\n }\n },\n\n macros: {\n\n realmSelector: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var markup = "Show realms: ";\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n markup += '<<tField title:MonkeyGTDSettings tag:[[hide'+\n config.mGTD.config.Realm[i] + \n ']] mode:text text:[['+\n config.mGTD.config.Realm[i] +\n ']] refreshAll:yes>>';\n }\n wikify(markup,place,null,tiddler);\n }\n },\n\n listByTag: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var parsedParams = paramString.parseParams("tags",null,true);\n var tagExpr = getParam(parsedParams,"tags","true");\n var whereExpr = getParam(parsedParams,"where","true");\n var groupBy = getParam(parsedParams,"group");\n var mode = getParam(parsedParams,"mode","local");\n var title = getParam(parsedParams,"title","local");\n var sortBy = getParam(parsedParams,"sort","title");\n var limit = getParam(parsedParams,"limit");\n var className = getParam(parsedParams,"class","");\n var viewType = getParam(parsedParams,"view");\n var ignoreRealm = getParam(parsedParams,"ignoreRealm","no");\n var showEmpty = getParam(parsedParams,"showEmpty","no"); // only relevant when using group\n var onlyShowEmpty = getParam(parsedParams,"onlyShowEmpty","no"); // only relevant using group\n\n if (mode != "global")\n tagExpr = '( '+tagExpr+' ) && ( [[' + tiddler.title + ']] )';\n\n if (ignoreRealm != "yes") {\n\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n if (mHideRealm(config.mGTD.config.Realm[i])) {\n tagExpr = '( '+tagExpr+' ) && ( ![[' + config.mGTD.config.Realm[i] + ']] )';\n }\n }\n }\n\n var markup = "{{mList "+className+"{\sn";\n\n if (title)\n markup += "{{mListTitle{"+title+"}}}\sn";\n \n if (groupBy) {\n markup += store.getByTagExpr(groupBy,sortBy).asList(1,viewType,limit,tagExpr,showEmpty,onlyShowEmpty,sortBy);\n\n var catchLeftoversExpr = "( "+tagExpr+" ) && !parent:" + groupBy;\n var leftovers = store.getByTagExpr(catchLeftoversExpr,sortBy).asList(2,viewType,limit);\n if (leftovers != "") {\n markup += "{{groupBy{''(No "+groupBy+")''}}}\sn";\n markup += leftovers;\n }\n\n }\n else\n markup += store.getByTagExpr(tagExpr,sortBy,whereExpr).asList(1,viewType,limit);\n\n markup += "}}}\sn";\n wikify(markup,place,null,tiddler); \n }\n },\n\n checkboxList: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var itemType = params[0];\n for (var i=0;i<config.mGTD.config[itemType].length;i++)\n wikify("<<toggleTag [["+config.mGTD.config[itemType][i]+"]]>>",place,null,tiddler);\n }\n },\n\n dropdownSelect: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var values = store.getByTagExpr(paramString);\n\n var selectFrom = [];\n var currentVal = "";\n selectFrom.push({name:"", caption:"(none)"});\n for (var i=0;i<values.length;i++) {\n if (tiddler.tags.contains(values[i].title))\n currentVal = values[i].title; \n selectFrom.push({name:values[i].title, caption:values[i].title});\n }\n\n var onChangeHandler = function() {\n // this will be better when we use fields:\n store.setTiddlerTag(tiddler.title,false,currentVal);\n tiddler.mSet("project",null);\n if (this.value != "") {\n tiddler.mSet("project",this.value);\n store.setTiddlerTag(tiddler.title,true,this.value);\n }\n return true;\n };\n\n var selector = createTiddlyDropDown(place,onChangeHandler,selectFrom,currentVal);\n if (currentVal != "")\n wikify(" [[>>|"+currentVal+"]]",place);\n }\n },\n\n\n newHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n },\n\n newHereFields: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n // needs some work here to derive parent type\n wikify("<<newTiddlerWithFields "+paramString+" tag:[["+tiddler.title+"]] mgtd.project:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n },\n\n processInbox: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var shortHand = {\n 'W': 'Waiting For',\n 'N': 'Next',\n 'F': ''\n };\n\n // TODO move this help elsewhere...\n wikify(\n "Enter projects and actions here. Click 'create these items' to create them\sn"+\n "Example usage:\sn{{{\snPaint House|Home Maintenance\sn"+\n ".Buy ladder and brushes|Errands\sn"+\n ".Choose colours|Home|W\sn"+\n "\sn}}}\sn"+\n "By default actions are next actions. "+\n "Specify W or F to make them future or Waiting For. You can create multiple projects.\snRealm:"\n ,place);\n\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n var r = config.mGTD.config.Realm[i];\n var foo = createTiddlyCheckbox(place,r,!mHideRealm(r),null);\n foo.id = "piRealm"+r.replace(/ /,'');\n }\n\n var pi = createTiddlyElement(place,"textarea",null,"piBox");\n \n wikify("\sn",place);\n\n var a1 = createTiddlyCheckbox(place,"Open created projects",true,null);\n a1.id = 'piShowProjects';\n\n var a2 = createTiddlyCheckbox(place,"Open created actions",false,null);\n a2.id = 'piShowActions';\n\n wikify("\sn\sn",place);\n\n var btn = createTiddlyButton(place,"create these items","create these items",function(e) {\n var lines = pi.value.split("\sn");\n var currentProject = "";\n var displayThese = [];\n\n for (var i=0;i<lines.length;i++) {\n //alert(lines[i]);\n var fields = lines[i].split(/[|;]/);\n\n if (!fields[0] || fields[0].trim() == "") {\n currentProject = "";\n }\n else {\n\n var title = fields.shift();\n //alert(title);\n\n // add the realm\n for (var j=0;j<config.mGTD.config.Realm.length;j++) {\n var theId = "piRealm"+config.mGTD.config.Realm[j].replace(/ /,'');\n if (document.getElementById(theId).checked)\n fields.push(config.mGTD.config.Realm[j]);\n }\n\n if (title[0] != '.') {\n //alert("project "+title);\n currentProject = title;\n\n if (document.getElementById('piShowProjects').checked)\n displayThese.push(title);\n\n fields.push("GTD"); // make it a GTD item\n fields.push("Project"); // make it a project\n if (store.tiddlerExists(title))\n alert("Warning: '"+title+"' already exists, did not create");\n else\n store.saveTiddler(\n title,title,\n "", // content\n config.options.txtUserName,\n new Date(),\n fields, // tags\n null // extra fields\n );\n }\n else {\n\n // default to next actions\n if (!fields.containsAny(['N','F','W']))\n fields.push('N');\n\n fields = fields.map(function(f) {\n if (shortHand[f] && shortHand[f] != '')\n return shortHand[f];\n else\n return f;\n });\n\n //alert("action "+title);\n title = title.trim();\n title = title.replace(/^\s.+/,'');\n\n if (document.getElementById('piShowActions').checked)\n displayThese.push(title);\n\n fields.push("GTD"); // make it a GTD item\n fields.push("Action"); // make it an action \n if (currentProject.trim() != "")\n fields.push(currentProject); // make it in this project\n\n if (store.tiddlerExists(title))\n alert("Warning: '"+title+" already exists, did not create");\n else\n store.saveTiddler(\n title,title,\n "", // content\n config.options.txtUserName,\n new Date(),\n fields, // tags\n null // extra fields\n );\n }\n }\n }\n\n for (var ii=0;ii<displayThese.length;ii++)\n story.displayTiddler("bottom",displayThese[ii]);\n\n alert("Done creating items");\n return false;\n }); // end of createTiddlyButton\n\n }\n },\n\n collectThoughts: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n // TODO move this help elsewhere...\n wikify("Enter thoughts one per line. They will be added to your [[Inbox]]",place);\n wikify("\sn",place);\n\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n var r = config.mGTD.config.Realm[i];\n var foo = createTiddlyCheckbox(place,r,!mHideRealm(r),null);\n foo.id = "ctRealm"+r.replace(/ /,'');\n }\n\n wikify("\sn",place);\n var ct = createTiddlyElement(place,"textarea",null,"ctBox");\n wikify("\sn",place);\n \n var btn = createTiddlyButton(place,"add to inbox","add to inbox",function(e) {\n var lines = ct.value.split("\sn");\n var currentProject = "";\n var displayThese = [];\n\n for (var i=0;i<lines.length;i++) {\n //alert(lines[i]);\n var fields = [lines[i]]; //.split(/[|;]/);\n\n var title = fields.shift();\n //alert(title);\n\n // add the realm\n for (var j=0;j<config.mGTD.config.Realm.length;j++) {\n var theId = "ctRealm"+config.mGTD.config.Realm[j].replace(/ /,'');\n if (document.getElementById(theId).checked)\n fields.push(config.mGTD.config.Realm[j]);\n }\n\n fields.push("GTD"); // make it a GTD item\n fields.push("Inbox"); // make it a project\n if (store.tiddlerExists(title))\n alert("Warning: '"+title+"' already exists, did not create");\n else\n store.saveTiddler(\n title,title,\n "", // content\n config.options.txtUserName,\n new Date(),\n fields, // tags\n null // extra fields\n );\n\n }\n\n alert("Done");\n return false;\n }); // end of createTiddlyButton\n\n }\n }\n\n },\n\n/*\n// I think this is obsolete now. See also NewTiddlerWithFieldsMacro.js which also we don't need for now?? \n onClickNewTiddler: function() {\n var title = this.getAttribute("newTitle");\n var params = this.getAttribute("params").split("|");\n var focus = this.getAttribute("newFocus");\n var template = this.getAttribute("newTemplate");\n story.displayTiddler(null,title,template);\n var text = this.getAttribute("newText");\n if(typeof text == "string")\n story.getTiddlerField(title,"text").value = text.format([title]);\n for(var t=0;t<params.length;t++) {\n if (params[t].indexOf("=") != -1) {\n // it's a field, name=value. this is hacky and not good\n var nameValue = params[t].split("=");\n // alert(nameValue[0]);\n // alert(nameValue[1]);\n // damn this doesn't work because tiddler doesn't exist yet\n // store.setValue(title,nameValue[0],nameValue[1]);\n }\n else {\n // it's a normal tag\n story.setTiddlerTag(title,params[t],+1);\n }\n }\n story.focusTiddler(title,focus);\n return false;\n \n },\n*/\n \n stringMethods: {\n parseTagExpr: function() {\n var spaced = this.\n replace(/\s[\s(/g," [["). // because square brackets in templates no good\n replace(/\s)\s]/g,"]] "). \n replace(/(!|&&|\s|\s||\s(|\s))/g," $1 ");\n var tokens = spaced.readBracketedList(false); // false means not unique. thanks Jeremy!\n var expr = "";\n var logicOps = ['(',')','||','&&','!','true','false'];\n for (var i=0;i<tokens.length;i++) {\n if (logicOps.contains(tokens[i])) {\n expr += tokens[i];\n }\n else if (tokens[i].match(/^parent:/)) {\n var lookForTagInParent = tokens[i].split(":")[1];\n expr += "tiddler.parents().anyHasTag('"+lookForTagInParent+"')";\n } \n else {\n expr += "tiddler.tags.contains('"+tokens[i].\n replace(/'/,"\s\s'") // fix single quote bug. hurrah\n // but how to fix round bracket bug?\n +"')";\n }\n }\n //alert(expr);\n return '('+expr+')';\n }\n },\n\n storeMethods: {\n getByTagExpr: function(tagExpr,sortBy,whereExpr) {\n var parsed = tagExpr.parseTagExpr();\n\n sortBy = sortBy ? sortBy : 'title';\n var desc = false;\n if (sortBy.substr(0,1) == '-') {\n desc = true;\n sortBy.replace(/^-/,'');\n }\n\n if (whereExpr) {\n parsed = "( "+parsed+" ) && ( "+whereExpr+" ) ";\n }\n\n\n var output = [];\n var first = true;\n this.forEachTiddler(function(title,tiddler) {\n //alert(tiddler.getRealm());\n try {\n if (eval(parsed))\n output.push(tiddler);\n }\n catch(e) {\n if (first) {\n alert("error parsing: "+parsed);\n first = false;\n }\n }\n });\n if (sortBy == "tickleDate") {\n output.sort(function(a,b) {\n return a.tickleDate() < b.tickleDate() ? -1 :\n (a.tickleDate() == b.tickleDate() ? 0 : +1);\n });\n }\n else {\n output.sort(function(a,b) {\n return a[sortBy] < b[sortBy] ? -1 :\n (a[sortBy] == b[sortBy] ? 0 : +1);\n });\n }\n\n if (desc)\n return output.reverse();\n else\n return output;\n }\n },\n\n arrayMethods: {\n map: function(func) {\n var result = [];\n for (var i=0;i<this.length;i++)\n result.push(func(this[i]));\n return result;\n },\n\n asList: function(level, viewType, limit, subExpr, showEmpty, onlyShowEmpty, sortBy, sortExpr) {\n var output = "";\n for (var i=0;(i<this.length && (!limit || i<limit));i++)\n if (!subExpr)\n output += this[i].mGTDrender(level,viewType);\n else {\n var newExpr = "( " + subExpr + " ) && ( [[" + this[i].title + "]] )";\n var sublist = store.getByTagExpr(newExpr,sortBy).asList(level+1, viewType, limit);\n if (((sublist == "" && (showEmpty == "yes" || onlyShowEmpty == "yes"))) || ((sublist != "" && onlyShowEmpty != "yes"))) {\n output += this[i].mGTDrender(level,"groupBy");\n output += sublist;\n }\n }\n return output;\n },\n\n anyHasTag: function(tagName) {\n for (var i=0;i<this.length;i++)\n if (this[i].tags.contains(tagName))\n return true;\n return false;\n }\n },\n\n tiddlerMethods: {\n \n getProjectTextForList: function() {\n var proj = this.getProject();\n if (proj == '')\n return '';\n return "@@font-size:80%;"+\n " [/%%/[[P|"+proj+"]]/%%/]"+\n "@@";\n },\n\n getProject: function() {\n //return this.getValueByTag('Project').join("/"); // maybe two projects??\n return this.getValueByGTDComponent('Project').join("/"); // maybe two projects??\n },\n \n getRealm: function() {\n // TODO why is different from getProject?\n // do some sneaky backwards/compat stuff for tags/fields\n \n // check for field\n //var fieldBasedRealm = this.mGet('realm');\n //if (fieldBasedRealm) {\n // var realm = fieldBasedRealm.readBrackettedList(); // could be more than one\n //}\n //else {\n //var realm = this.getValueByTag('Realm'); // returns array\n // this.mSet("realm",String.encodeTiddlyLinkList(realm));\n //}\n if (this.tags.contains("Professional")) return "Professional";\n if (this.tags.contains("Personal")) return "Personal";\n \n //return "asdf";//realm[0];\n },\n\n getValueByTag: function(value) {\n // this gets a lot better when we use fields also\n var values = store.getByTagExpr(value); // probably just getTaggedTiddlers would do here..?\n var result = [];\n for (var i=0;i<values.length;i++) {\n if (this.tags.contains(values[i].title)) {\n result.push(values[i].title);\n }\n }\n return result;\n },\n\n getValueByGTDComponent: function(itemType) {\n // faster than getValueByTag since we don't need to\n // do a "full table scan" of all tiddlers\n var values = config.mGTD.config[itemType];\n var result = [];\n for (var i=0;i<values.length;i++) {\n if (this.tags.contains(values[i])) {\n result.push(values[i]);\n }\n }\n return result;\n },\n\n hasValue: function(itemType,value) {\n var foo = this.getValueByGTDComponent(itemType);\n return foo.contains(value);\n },\n\n mGTDrender: function(level,viewType) {\n var output = "";\n if (viewType) {\n if (config.mGTD.tiddlerViews[viewType+level])\n return eval(config.mGTD.tiddlerViews[viewType+level]);\n else\n return eval(config.mGTD.tiddlerViews[viewType]);\n }\n else {\n for (var i=0; i<level; i++)\n output += "*";\n output += "[[%0]]\sn".format([this.title]);\n }\n return output;\n },\n\n parents: function() {\n var output = [];\n for (var i=0;i<this.tags.length;i++) {\n var t = store.fetchTiddler(this.tags[i]);\n if (t)\n output.push(t);\n }\n return output;\n },\n\n mGet: function(field) {\n return store.getValue(this,"mgtd."+field);\n },\n\n mSet: function(field,value) {\n store.setValue(this,"mgtd."+field,value);\n },\n\n tickleDate: function() {\n var d = this.mGet("tday");\n var m = this.mGet("tmonth");\n var y = this.mGet("tyear");\n var result = "";\n if (d && m && y)\n result = y + String.zeroPad(parseInt(m,10),2) + String.zeroPad(parseInt(d,10),2) + '0000';\n return result;\n }\n },\n\n styles: [\n // ".mListTitle { font-weight:bold; }",\n // ".mList { border:solid 1px pink; }",\n // ".mList ul { margin-top:0px; padding-top:0px; }",\n ""],\n\n coreFunctions: {\n\n // Extending this to put in a defaultValue\n createTiddlyDropDown: function(place,onchange,options,defaultValue) {\n var sel = createTiddlyElement(place,"select");\n sel.onchange = onchange;\n var foo = 0;\n for(var t=0; t<options.length; t++)\n {\n var e = createTiddlyElement(sel,"option",null,null,options[t].caption);\n if (options[t].name == defaultValue) foo = t;\n e.value = options[t].name;\n }\n sel.selectedIndex = foo;\n return sel;\n },\n\n // utility\n mOpt: function(setting) {\n return store.getValue("MonkeyGTDSettings","mgtd."+setting);\n },\n\n mHideRealm: function(realm) {\n return store.getValue("MonkeyGTDSettings","hide"+realm);\n },\n\n mDefaultRealm: function() {\n // for (var i=config.mGTD.config.Realm.length-1;i>=0;i--) {\n for (var i=0;i<config.mGTD.config.Realm.length;i++) {\n if (!mHideRealm(config.mGTD.config.Realm[i])) {\n // if both are on it returns last one\n // hack. because Work is after Personal??\n return config.mGTD.config.Realm[i];\n }\n }\n return config.mGTD.config.Realm[0]; // just in case\n }\n\n },\n dateMethods: {\n // just a bug fix in TW 2.1.3\n // temporary\n formatString: function(template) {\n var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));\n t = t.replace(/hh12/g,this.getHours12());\n t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));\n t = t.replace(/hh/g,this.getHours());\n t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));\n t = t.replace(/ss/g,this.getSeconds());\n t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());\n t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());\n t = t.replace(/wYYYY/g,this.getYearForWeekNo());\n t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));\n t = t.replace(/YYYY/g,this.getFullYear());\n t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));\n t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);\n t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);\n t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));\n t = t.replace(/MM/g,this.getMonth()+1);\n t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));\n t = t.replace(/WW/g,this.getWeek());\n t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);\n t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);\n t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));\n t = t.replace(/DDth/g,this.getDate()+this.daySuffix());\n t = t.replace(/DD/g,this.getDate());\n\n t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));\n t = t.replace(/mm/g,this.getMinutes());\n\n return t;\n }\n },\n \n test: function() {\n },\n\n init: function() {\n\n merge(config.macros,this.macros);\n merge(config.commands,this.commands);\n\n merge(TiddlyWiki.prototype,this.storeMethods);\n merge(Tiddler.prototype,this.tiddlerMethods);\n merge(String.prototype,this.stringMethods);\n merge(Array.prototype,this.arrayMethods);\n merge(Date.prototype,this.dateMethods);\n merge(window,this.coreFunctions);\n\n\n //merge(config.shadowTiddlers,{MonkeyGTDStyles:this.styles.join("\sn")});\n //store.addNotification("MonkeyGTDStyles",refreshStyles);\n\n // config.macros.newTiddler.onClickNewTiddler = this.onClickNewTiddler; // over-ride\n\n this.populateLists();\n \n this.test();\n \n }\n};\n\nconfig.mGTD.init();\n\n//}}}\n\n
<<tField tag:mgtd.usemdy label:'Use ~M-D-Y instead of ~D-M-Y'>>\n
\n.mToolbar .ticklerDate tr td {\n padding:0;\n margin:0;\n}\n\n.mToolbar {\n background-color:[[ColorPalette::TertiaryPale]];\n border:solid 1px [[ColorPalette::TertiaryMid]];\n}\n.mToolbar td {\n padding:0.5em;\n}\n.mToolbar .label {\n width:1%;\n text-align:right;\n font-weight:bold;\n background-color:[[ColorPalette::TertiaryPale]];\n color:[[ColorPalette::TertiaryMid]];\n padding-left:0.5em;\n padding-right:0;\n}\n.mListTitle {\n font-weight:bold;\n background-color:[[ColorPalette::TertiaryPale]];\n color:[[ColorPalette::TertiaryMid]];\n display:block;\n padding:0.25em 0.5em;\n border-bottom:1px solid [[ColorPalette::TertiaryMid]];\n\n}\n.mList br { display:none; }\n.mList {\n border:solid 1px [[ColorPalette::TertiaryMid]];\n margin:0 0.5em 0 0;\n padding-bottom:1em;\n}\n.mList ul {\n margin:0.25em 0 0;\n padding:0px;\n padding-left:1.8em;\n}\n.mList ul li { }\n\n.mList .action, .mList .starthing {\n display:block;\n padding-left:0.25em;\n padding-bottom:0.1em;\n /*\n overflow:hidden;\n white-space:no-wrap;*/\n /* border-bottom:1px solid #eee; */\n}\n\n.mList .action span { white-space:no-wrap; }\n.mList .action2 span { white-space:no-wrap; }\n\n.mList .action2 {\n display:block;\n padding-left:1.5em;\n padding-bottom:0.1em;\n /*overflow:hidden;\n white-space:no-wrap;*/\n /*border-bottom:1px solid #eee;*/\n}\n/* the nowrap and hidden doesnt work :( */\n\n.shorterEdit input { width:2.5em; }\n\n#topMenu .new a { padding-right:0; margin-right:0; }\n#topMenu .tag a { padding-left:0; margin-left:0; }\n\n.mList .off {border-style:none;background:#fff;color:#ccc;}\n.mList .on {border-style:none;background:#fff;color:#000;}\n.mList .WaitingForButton.off {border-style:none;background:#fff;color:#ccc;}\n.mList .WaitingForButton.on {border-style:none;background:#fdb;color:#000;}\n.mList .NextButton.off {border-style:none;background:#fff;color:#ccc;}\n.mList .NextButton.on {border-style:none;background:#cfa;color:#000;}\n\n.StarredButton.off {border-style:none;background:transparent;color:#ddd;font-size:200%;padding:0;margin:0;font-family:'Arial Unicode MS' sans-serif;}\n.StarredButton.on {border-style:none;background:transparent;color:#f80;font-size:200%;padding:0;margin:0;font-family:'Arial Unicode MS' sans-serif;}\n\nspan.title {\n color:[[ColorPalette::PrimaryDark]];\n}\n\n#topMenu {\n background:url(http://simonbaird.com/monkeygtd/logo-trans.gif) no-repeat -15px 2px transparent;\n padding:5px;\n padding-left:80px;\n}\n\n/* the png is way superior due to alpha transparency. stupid IE */\nhtml>body #topMenu {background-image:url(http://simonbaird.com/monkeygtd/logo-trans.png)}\n\n\n#topMenu a { color:white ! important; }\n\n#topMenu a.button {\n border-style:none;\n}\n\n.mList .tiddlyLink { font-weight: normal; }\n\n.mList .groupBy {\n display:block;\n padding-top:0.75em;\n border-bottom:1px solid #ddd;\n margin-right:1em;\n margin-bottom:1px;\n padding-bottom:1px;\n margin-left:1em;\n font-size:120%;\n}\n\n.mList .groupBy a {\n font-weight:bold;\n}\n\n#extraToolbar .button {\n background:#ccc;\n padding:0 0.5em;\n margin:0 0.5em;\n}\n\n.piBox {\n width:95%;\n height:10em;\n}\n\n@media print {\n\n/* Thanks to Andrew C and Scott K*/\n#mainMenu,\n#sidebar,\n#extraToolbar,\n#messageArea,\n.subtitle,\n.tagglyTagged,\n.toolbar,\n.mToolbar,\n.mList .off,\n.mList .WaitingForButton.off,\n.mList .NextButton.off\n{\n display: none ! important;\n}\n\n#displayArea {\n margin: 1em 1em 0em 1em;\n}\n\n.tiddler { page-break-after:always }\n\n}/* end @media print */\n\n\n\n
URL: http://mgtd-alpha.tiddlyspot.com/upgrade.html\n
URL: /proxy/mgtd-alpha.tiddlyspot.com/upgrade.html\n
~MonkeyGTD 2.1 alpha r91\n\n
/***\n| Name:|MptwLayoutPlugin|\n| Description:|A package containing templates and css for the MonkeyPirateTiddlyWiki layout|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#MptwLayoutPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nPresumes you have TagglyTaggingPlugin installed.\n***/\n//{{{\nconfig.shadowTiddlers.GettingStarted += "\sn\snSee also MonkeyPirateTiddlyWiki.";\n\n//}}}\n\n//{{{\nmerge(config.shadowTiddlers,{\n\n'MptwEditTemplate':[\n "<!--{{{-->",\n "<div class=\s"toolbar\s" macro=\s"toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler\s"></div>",\n "<div class=\s"title\s" macro=\s"view title\s"></div>",\n "<div class=\s"editLabel\s">Title</div><div class=\s"editor\s" macro=\s"edit title\s"></div>",\n "<div class=\s"editLabel\s">Tags</div><div class=\s"editor\s" macro=\s"edit tags\s"></div>",\n "<div class=\s"editorFooter\s"><span macro=\s"message views.editor.tagPrompt\s"></span><span macro=\s"tagChooser\s"></span></div>",\n "<div macro=\s"showWhenExists EditPanelTemplate\s">[[EditPanelTemplate]]</div>",\n "<div class=\s"editor\s" macro=\s"edit text\s"></div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\n'MptwPageTemplate':[\n "<!--{{{-->",\n "<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>",\n " <div class='headerShadow'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n " <div class='headerForeground'>",\n " <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;",\n " <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>",\n " </div>",\n "</div>",\n "<!-- horizontal MainMenu -->",\n "<div id='topMenu' refresh='content' tiddler='MainMenu'></div>",\n "<!-- original MainMenu menu -->",\n "<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->",\n "<div id='sidebar'>",\n " <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>",\n " <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>",\n "</div>",\n "<div id='displayArea'>",\n " <div id='messageArea'></div>",\n " <div id='tiddlerDisplay'></div>",\n "</div>",\n "<!--}}}-->",\n ""\n].join("\sn"),\n\n'MptwStyleSheet':[\n "/*{{{*/",\n "/* a contrasting background so I can see where one tiddler ends and the other begins */",\n "body {",\n " background: [[ColorPalette::TertiaryLight]];",\n "}",\n "",\n "/* sexy colours and font for the header */",\n ".headerForeground {",\n " color: [[ColorPalette::PrimaryPale]];",\n "}",\n ".headerShadow, .headerShadow a {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n ".headerForeground, .headerShadow {",\n " padding: 1em 1em 0;",\n " font-family: 'Trebuchet MS' sans-serif;",\n " font-weight:bold;",\n "}",\n ".headerForeground .siteSubtitle {",\n " color: [[ColorPalette::PrimaryLight]];",\n "}",\n ".headerShadow .siteSubtitle {",\n " color: [[ColorPalette::PrimaryMid]];",\n "}",\n "",\n "/* make shadow go and down right instead of up and left */",\n ".headerShadow {",\n " left: 1px;",\n " top: 1px;",\n "}",\n "",\n "/* prefer monospace for editing */",\n ".editor textarea {",\n " font-family: 'Consolas' monospace;",\n "}",\n "",\n "/* sexy tiddler titles */",\n ".title {",\n " font-size: 250%;",\n " color: [[ColorPalette::PrimaryLight]];",\n " font-family: 'Trebuchet MS' sans-serif;",\n "}",\n "",\n "/* more subtle tiddler subtitle */",\n ".subtitle {",\n " padding:0px;",\n " margin:0px;",\n " padding-left:0.5em;",\n " font-size: 90%;",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n ".subtitle .tiddlyLink {",\n " color: [[ColorPalette::TertiaryMid]];",\n "}",\n "",\n "/* a little bit of extra whitespace */",\n ".viewer {",\n " padding-bottom:3px;",\n "}",\n "",\n "/* don't want any background color for headings */",\n "h1,h2,h3,h4,h5,h6 {",\n " background: [[ColorPalette::Background]];",\n " color: [[ColorPalette::Foreground]];",\n "}",\n "",\n "/* give tiddlers 3d style border and explicit background */",\n ".tiddler {",\n " background: [[ColorPalette::Background]];",\n " border-right: 2px [[ColorPalette::TertiaryMid]] solid;",\n " border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;",\n " margin-bottom: 1em;",\n " padding-bottom: 2em;",\n "}",\n "",\n "/* make options slider look nicer */",\n "#sidebarOptions .sliderPanel {",\n " border:solid 1px [[ColorPalette::PrimaryLight]];",\n "}",\n "",\n "",\n "/* the borders look wrong with the body background */",\n "#sidebar .button {",\n " border-style: none;",\n "}",\n "",\n "/* displays the list of a tiddler's tags horizontally. used in ViewTemplate */",\n ".tagglyTagged li.listTitle {",\n " display:none",\n "}",\n ".tagglyTagged li {",\n " display: inline; font-size:90%;",\n "}",\n ".tagglyTagged ul {",\n " margin:0px; padding:0px;",\n "}",\n "",\n "/* this means you can put line breaks in SidebarOptions for readability */",\n "#sidebarOptions br {",\n " display:none;",\n "}",\n "/* undo the above in OptionsPanel */",\n "#sidebarOptions .sliderPanel br {",\n " display:inline;",\n "}",\n "",\n "/* horizontal main menu stuff */",\n "#displayArea {",\n " margin: 1em 15.7em 0em 1em; /* use the freed up space */",\n "}",\n "#topMenu br {",\n " display: none;",\n "}",\n "#topMenu {",\n " background: [[ColorPalette::PrimaryMid]];",\n " color:[[ColorPalette::PrimaryPale]];",\n "}",\n "#topMenu {",\n " padding:2px;",\n "}",\n "#topMenu .button, #topMenu .tiddlyLink, #topMenu a {",\n " margin-left: 0.5em;",\n " margin-right: 0.5em;",\n " padding-left: 3px;",\n " padding-right: 3px;",\n " color: [[ColorPalette::PrimaryPale]];",\n " font-size: 115%;",\n "}",\n "#topMenu .button:hover, #topMenu .tiddlyLink:hover {",\n " background: [[ColorPalette::PrimaryDark]];",\n "}",\n "",\n "/* make it print a little cleaner */",\n "@media print {",\n " #topMenu {",\n " display: none ! important;",\n " }",\n " /* not sure if we need all the importants */",\n " .tiddler {",\n " border-style: none ! important;",\n " margin:0px ! important;",\n " padding:0px ! important;",\n " padding-bottom:2em ! important;",\n " }",\n " .tagglyTagging .button, .tagglyTagging .hidebutton {",\n " display: none ! important;",\n " }",\n " .headerShadow {",\n " visibility: hidden ! important;",\n " }",\n " .tagglyTagged .quickopentag, .tagged .quickopentag {",\n " border-style: none ! important;",\n " }",\n " .quickopentag a.button, .miniTag {",\n " display: none ! important;",\n " }",\n "}",\n "/*}}}*/",\n ""\n].join("\sn"),\n\n'MptwViewTemplate':[\n "<!--{{{-->",\n "",\n "<div class='toolbar'>",\n " <span macro=\s"showWhenTagged systemConfig\s">",\n " <span macro=\s"toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'\s"></span>",\n " </span>",\n " <span style=\s"padding:1em;\s"></span>",\n " <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler undoChanges permalink references jump newHere newJournalHere'></span>",\n "</div>",\n "",\n "<div class=\s"tagglyTagged\s" macro=\s"tags\s"></div>",\n "",\n "<div class='titleContainer'>",\n " <span class='title' macro='view title'></span>",\n " <span macro=\s"miniTag\s"></span>",\n "</div>",\n "",\n "<div class='subtitle'>",\n " <span macro='view modifier link'></span>,",\n " <span macro='view modified date [[DD-MMM-YY]]'></span>",\n " (<span macro='message views.wikified.createdPrompt'></span>",\n " <span macro='view created date [[DD-MMM-YY]]'></span>)",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewPanelTemplate\s">[[ViewPanelTemplate]]</div>",\n "",\n "<div macro=\s"hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer' macro='view text wikified'></div>",\n "</div>",\n "<div macro=\s"showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')\s">",\n " <div class='viewer'><pre macro='view text'></pre></div>",\n "</div>",\n "",\n "<div macro=\s"showWhenExists ViewDashboardTemplate\s">[[ViewDashboardTemplate]]</div>",\n "",\n "<div class=\s"tagglyTagging\s" macro=\s"tagglyTagging\s"></div>",\n "",\n "<!--}}}-->",\n ""\n].join("\sn")\n\n});\n//}}}\n
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal toolbar commands|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nTo use edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\nNote: would be good if we could do this instead some day\n{{{<<newTiddler tag:{{tiddler.title}} label:'new here'>>}}}\n***/\n//{{{\nmerge(config.commands,{\n\n newHere: {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\n hideReadOnly: true,\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var t=document.getElementById('tiddler'+title);\n story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(config.macros.newTiddler.title, title, 0);\n story.focusTiddler(config.macros.newTiddler.title,"title"); // doesn't work??\n return false;\n }\n }\n },\n\n newJournalHere: {\n //text: 'new journal here', // too long\n text: 'new journal',\n hideReadOnly: true,\n dataFormat: 'DD MMM YYYY', // adjust to your preference\n //dataFormat: 'YYYY-0MM-0DD', \n tooltip: 'Create a new journal tiddler tagged as this tiddler',\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var now = new Date();\n var t=document.getElementById('tiddler'+title);\n var newtitle = now.formatString(this.dataFormat)\n story.displayTiddler(t,newtitle,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(newtitle, title, 0);\n story.focusTiddler(newtitle,"title");\n return false;\n }\n }\n }\n\n});\n//}}}\n
/***\n| Name:|NewTiddlerWithFieldsMacro|\n| Created by:|BJ Backitis|\n| Location:|http://tampageekland.tiddlyspot.com#NewTiddlerWithFieldsMacro|\n| Version:|0.1.0 (16 Nov 2006)|\n| Requires:|~TW2.1.x|\n!Description\nThis is a clone of the NewTiddler core macro that allows for adding custom fields and values. Any param "name: value" pair where the name is not a \nrecognized param (title, text, label, prompt, accessKey, template, focus, and tag) will be treated as a custom field name and value. \n!Usage\nUse like the existing {{{<<newTiddler>>}}} macro, but any unknown param "name: value" pairs will be treated as a custom field name and value.\nBe sure to have the custom field defined in your view and/or edit templates so you can see them (if you wish)!\n\nExample:\n{{{<<newTiddlerWithFields label:'New Example' tag: special customTiddler tiddlertype: Example>>}}}\n\ntry it here:\n<<newTiddlerWithFields label:'New Example' tag: special customTiddler tiddlertype: Example>>\n\n* v0.1.0 -- BJ Backitis, 16 Nov 2006 (Original, based on a suggestion from Simon Baird)\n!To Do\n* {{{<<newJournalWithFields>>}}}???\n\n!Code\n***/\n\n\nconfig.macros.newTiddlerWithFields = {\n text: "new Tiddler",\n prompt: "Create a new tiddler with custom fields",\n title: "new Tiddler"\n} \n \nconfig.macros.newTiddlerWithFields.fixedParams = ["title", "tag", "label", "text", "prompt", "accessKey", "focus", "template", "anon"];\n\nconfig.macros.newTiddlerWithFields.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if(!readOnly) {\n params = paramString.parseParams("anon",null,true,false,false);\n var title = params[1] && params[1].name == "anon" ? params[1].value : this.title;\n title = getParam(params,"title",title);\n this.createNewTiddlerWithFieldsButton(place,title,params,this.label,this.prompt,this.accessKey,"title",false);\n }\n}\n\nconfig.macros.newTiddlerWithFields.createNewTiddlerWithFieldsButton = function(place,title,params,label,prompt,accessKey,newFocus,isJournal) {\n var tags = [];\n var custFields = [];\n var custValues = [];\n for(var t=1; t<params.length; t++) {\n if (!this.fixedParams.contains(params[t].name)) {\n custFields.push(params[t].name);\n custValues.push(params[t].value);\n }\n else if((params[t].name == "anon" && t != 1) || (params[t].name == "tag"))\n tags.push(params[t].value);\n }\n label = getParam(params,"label",label);\n prompt = getParam(params,"prompt",prompt);\n accessKey = getParam(params,"accessKey",accessKey);\n newFocus = getParam(params,"focus",newFocus);\n var btn = createTiddlyButton(place,label,prompt,this.onClickNewTiddlerWithFields,null,null,accessKey);\n btn.setAttribute("newTitle",title);\n btn.setAttribute("isJournal",isJournal);\n btn.setAttribute("params",tags.join("|"));\n btn.setAttribute("custFields",custFields.join("|"));\n btn.setAttribute("custValues",custValues.join("|"));\n btn.setAttribute("newFocus",newFocus);\n btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE));\n var text = getParam(params,"text");\n if(text !== undefined) \n btn.setAttribute("newText",text);\n return btn;\n}\n\n\nconfig.macros.newTiddlerWithFields.onClickNewTiddlerWithFields = function() {\n var title = this.getAttribute("newTitle");\n if(this.getAttribute("isJournal")) {\n var now = new Date();\n title = now.formatString(title.trim());\n }\n var params = this.getAttribute("params").split("|");\n var custFields = this.getAttribute("custFields").split("|");\n var custValues = this.getAttribute("custValues").split("|");\n var focus = this.getAttribute("newFocus");\n var template = this.getAttribute("newTemplate");\n story.displayTiddler(null,title,template);\n var text = this.getAttribute("newText");\n if (typeof text == "string")\n story.getTiddlerField(title,"text").value = text.format([title]);\n for (var t=0;t<params.length;t++)\n story.setTiddlerTag(title,params[t],+1);\n for (var i=0;i<custFields.length;i++) \n story.setTiddlerField(title,custValues[i],+1,custFields[i]);\n story.focusTiddler(title,focus);\n return false;\n}\n\n\n\n
\n<!--{{{-->\n<!--div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n <div class='headerShadow'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div class='headerForeground'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n</div-->\n<!-- horizontal MainMenu -->\n<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n<div id='topMenu' refresh='content' tiddler='MainMenu' style="font-size:120%;"></div>\n</div>\n<!-- realm selector under construction -->\n<div id="extraToolbar" style="color:#555;background:#999;padding:3px;border-bottom:2px solid #777;padding-left:0.5em;font-size:120%;">\n <span id='realmSelector' macro="realmSelector"></span>\n <span style="margin:0 2em;">|</span>\n <span>Create:</span>\n <span macro="newTiddler label:'new action' title:'New Action' tag: Action Next GTD "></span>\n <span macro="newTiddler label:'new project' title:'New Project' tag: Project GTD "></span>\n <span macro="newTiddler label:'new tickler' title:'New Tickler' tag: Tickler GTD "></span>\n</div>\n<!--\n<div id='topBar' style="background:#ddd;padding:3px;border-bottom:1px solid #aaa;padding-left:0.5em;">\n <span macro="saveChanges" style="padding-left:2em;padding-right:2em;"></span>\n <span macro="selectPalette">select colour palette:</span>\n</div>\n-->\n<!-- original MainMenu menu -->\n<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->\n<div id='sidebar'>\n <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n <div style="padding:0.5em;" macro="calendar thismonth"></div>\n <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n <div id='messageArea'></div>\n <div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->\n\n
/***\n| Name:|QuickOpenTagPlugin|\n| Description:|Changes tag links to make it easier to open tags as tiddlers|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can to <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++) {\n var theListItem = createTiddlyElement(theDateList,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by QuickOpenTagPlugin */\sn"+\n".tagglyTagged .quickopentag, .tagged .quickopentag \sn"+\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n"/* extra specificity to make it work right */\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#displayArea .viewer .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink, \sn"+\n"#mainMenu .quickopentag a.tiddyLink \sn"+\n" { border:0px solid black; }\sn"+\n"#displayArea .viewer .quickopentag a.button, \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" { margin-left:0px; padding-left:2px; }\sn"+\n"#displayArea .viewer .quickopentag a.tiddlyLink, \sn"+\n"#mainMenu .quickopentag a.tiddlyLink \sn"+\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }\sn"+\n"a.miniTag {font-size:150%;} \sn"+\n"#mainMenu .quickopentag a.button \sn"+\n" /* looks better in right justified main menus */\sn"+\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }\sn" + \n"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\sn" +\n"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }\sn" +\n"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }\sn" +\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n if (store)\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"QuickOpenTagStyles", notify: refreshStyles});\n }\n\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
++++ Review Tips\n* [[Process Your Inbox|Process Inbox]]\n* Empty Your Head\n* Review Calendar\n* Review "Projects" Lists\n* Review "Next Actions" Lists\n* Review "Waiting For" Lists (see [[Dashboard|Dashboard]])\n* Review any relevant [[Checklists|Checklist]]\n* Review "Someday/Maybe" Lists\n* Review "[[Pending|Tickler]]" and [[Support|Support]] Files\n* //Be Creative and Courageous//: Any new, wonderful, hare-brained, thought-provoking, risk-taking ideas to add to your system?\n* See GettingThingsDoneOverview for more help\n@@color:#aaa;font-size:80%;Tips by Michael Lockhart@@\n====\n
\n// to use these you must add them to the tool bar in EditTemplate\n\nmerge(config.commands,{\n\n saveCloseTiddler: {\n text: 'done/close',\n tooltip: 'Undo changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.saveTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n },\n\n cancelCloseTiddler: {\n text: 'cancel/close',\n tooltip: 'Save changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.cancelTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n }\n\n});\n\n
/***\nQuick and dirtly palette switcher for 2.1.x\n<<selectPalette>>\nWARNING this will overwrite your ColorPalette tiddler.\n***/\n\n//{{{\n\nmerge(config.macros,{\n\n setPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var paletteName = params[0] ? params[0] : tiddler.title;\n createTiddlyButton(place,"apply","Apply this palette",function(e) {\n config.macros.selectPalette.updatePalette(tiddler.title);\n return false;\n });\n }\n },\n\n selectPalette: {\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyDropDown(place,this.onPaletteChange,this.getPalettes());\n },\n\n getPalettes: function() {\n var result = [\n {caption:"-palette-", name:""},\n {caption:"(Default)", name:"(default)"}\n ];\n var tagged = store.getTaggedTiddlers("palette","title");\n for(var t=0; t<tagged.length; t++) {\n var caption = tagged[t].title;\n var sliceTitle = store.getTiddlerSlice(caption,"Name");\n if (sliceTitle)\n caption = sliceTitle;\n result.push({caption:sliceTitle, name:tagged[t].title});\n }\n return result;\n },\n\n onPaletteChange: function(e) {\n config.macros.selectPalette.updatePalette(this.value);\n return true;\n },\n\n updatePalette: function(title) {\n if (title != "") {\n store.deleteTiddler("ColorPalette");\n if (title != "(default)")\n store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),\n config.options.txtUserName,undefined,"");\n this.refreshPalette();\n if(config.options.chkAutoSave)\n saveChanges(true);\n }\n },\n\n refreshPalette: function() {\n config.macros.refreshDisplay.onClick();\n }\n }\n});\n\n//}}}\n\n
<<tabs txtMainTab\n Timeline Timeline TabTimeline\n All 'All tiddlers' TabAll\n Tags 'Tags' TabTags\n Shadowed 'Shadowed tiddlers' TabMoreShadowed\n >>\n/%\n Tags 'All tags' TabTags\n More 'More lists' TabMore\n%/\n
powered by TiddlyWiki\n
My MonkeyGTD\n
\n[[MptwStyleSheet]]\n[[MonkeyGTDStyles]]\n\n
<<tag css>>\n<<tag html>>\n<<tag systemConfig>>\n/% very dodgey. placeholder for a better system %/\n
<<timeline modified 30>>\n
/***\n| Name:|TagglyTaggingPlugin|\n| Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| CoreVersion:|2.1.x|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"]\n },\n valuePrefix: "taggly."\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n for (var i=0;i<list.length;i++) {\n var countString = this.getTaggingCount(list[i].title);\n if (useCommas)\n output.push((i > 0 ? ", " : "") + "[[" + list[i].title + "]]" + countString);\n else\n output.push("*[[" + list[i].title + "]]" + countString + "\sn");\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + "\sn";\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(leftOvers[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + "\sn"+childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: \n"/*{{{*/\sn"+\n"/* created by TagglyTaggingPlugin */\sn"+\n".tagglyTagging { padding-top:0.5em; }\sn"+\n".tagglyTagging li.listTitle { display:none; }\sn"+\n".tagglyTagging ul {\sn"+\n" margin-top:0px; padding-top:0.5em; padding-left:2em;\sn"+\n" margin-bottom:0px; padding-bottom:0px;\sn"+\n"}\sn"+\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn"+\n".tagglyTagging table { margin:0px; padding:0px; }\sn"+\n".tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn"+\n".tagglyTagging .button, .tagglyTagging .hidebutton {\sn"+\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;\sn"+\n" border:0px; padding-left:0.3em;padding-right:0.3em;\sn"+\n"}\sn"+\n".tagglyTagging .button:hover, .hidebutton:hover {\sn"+\n" background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];\sn"+\n"}\sn"+\n".selected .tagglyTagging .button {\sn"+\n" display:inline;\sn"+\n"}\sn"+\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }\sn"+\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }\sn"+\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }\sn"+\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn"+\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn"+\n".tagglyTagging ul ul li {margin-left:0.5em; }\sn"+\n".editLabel { font-size:90%; padding-top:0.5em; }\sn"+\n".tagglyTagging .commas { padding-left:1.8em; }\sn"+\n"/*}}}*/\sn"+\n "",\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n if (store)\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n else\n config.notifyTiddlers.push({name:"TagglyTaggingStyles", notify: refreshStyles});\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n
\n/***\n\nAn under construction replacement for toggleTag\n\n<<tTag mode:text text:D tag:Done>>\n<<tTag mode:text text:N tag:Next>>\n***/\n//{{{\n\nmerge(config.macros,{\n\n tTag: {\n\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n\n var parsedParams = paramString.parseParams("tags",null,true);\n \n if (!tiddler)\n tiddler = store.getTiddler(getParam(parsedParams,"title"));\n \n var tag = getParam(parsedParams,"tag","checked");\n var title = getParam(parsedParams,"title",tiddler.title);\n\n var refreshAll = getParam(parsedParams,"refreshAll",false);\n\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = getParam(parsedParams,"label",defaultLabel);\n\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n\n var mode = getParam(parsedParams,"mode","checkbox");\n\n var theClass = getParam(parsedParams,"class",tag+"Button");\n\n\n var currentValue = theTiddler && \n (macroName == "tTag" ? theTiddler.isTagged(tag) : store.getValue(theTiddler,tag)=="true");\n\n if (mode == "checkbox") {\n // create the checkbox\n\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), currentValue, function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.tTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n //store.suspendNotifications(); \n if (macroName == "tTag")\n store.setTiddlerTag(title,this.checked,tag);\n else // it must be tField\n store.setValue(title,tag,this.checked?"true":null);\n\n if (refreshAll) {\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n }\n\n //store.resumeNotifications();\n return true;\n });\n }\n else if (mode == "text") {\n var text = getParam(parsedParams,"text","X");\n\n var cl = createTiddlyButton(place, text, "Toggle "+text, function(e) {\n if(!e) var e = window.event;\n\n if (!store.tiddlerExists(title)) {\n if (config.macros.tTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n //store.suspendNotifications(); \n var currentState = this.getAttribute("state")=="true";\n var newState = !currentState;\n\n store.setTiddlerTag(title,newState,tag);\n if (macroName == "tTag")\n store.setTiddlerTag(title,newState,tag);\n else // it must be tField\n store.setValue(title,tag,newState?"true":null);\n\n // this is terrible please refactor\n if (currentState) {\n cl.setAttribute("state","false");\n removeClass(cl,"on");\n addClass(cl,"off");\n }\n else {\n cl.setAttribute("state","true");\n removeClass(cl,"off");\n addClass(cl,"on");\n }\n\n //refreshDisplay(); \n if (refreshAll) {\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n }\n //store.resumeNotifications();\n\n e.cancelBubble = true;\n if(e.stopPropagation) e.stopPropagation();\n\n return false;\n });\n\n addClass(cl,theClass.replace(/ /g,''));\n\n if (currentValue) {\n cl.setAttribute("state","true");\n removeClass(cl,"off");\n addClass(cl,"on");\n }\n else {\n cl.setAttribute("state","false");\n removeClass(cl,"on");\n addClass(cl,"off");\n }\n \n }\n else if (mode == "popup") {\n var cl = createTiddlyButton(place, "zzz", "Toggle "+text, function(e) {\n // props to Saq\n if(!e) var e = window.event;\n var popup = Popup.create(this);\n createTiddlyButton(createTiddlyElement(popup,"li"),"foo","bar",function(e) {\n // under contruction\n alert(this.getAttribute("tag"));\n });\n Popup.show(popup,false);\n e.cancelBubble = true;\n if(e.stopPropagation) e.stopPropagation();\n return false ;\n });\n }\n\n }\n }\n\n});\n\nconfig.macros.tField = config.macros.tTag;\n\nsetStylesheet(["",\n".button.off {border-style:none;background:#fff;color:#ccc;}",\n".button.on {border-style:none;background:#ddd;color:#000;}",\n// TODO move this css elsewhere\n"#realmSelector .button.off {margin:0 0.5em;padding:0 1em;border:2px solid #aaa;background:#eee;color:#333;}", // actually reversed, ie off is "on"\n"#realmSelector .button.on {margin:0 0.5em;padding:0 1em;border:2px solid #999;background:#999;color:#ccc;}", // actually reversed, ie off is "on"\n""].join("\sn"),"tTag");\n\n//}}}\n\n\n\n\n
/***\n| Name:|ToggleTagMacro|\n| Description:|Makes a checkbox which toggles a tag in a tiddler|\n| Version:|$$version$$|\n| Date:|$$date$$|\n| Source:|http://tiddlyspot.com/mptw/#ToggleTagMacro|\n| Author:|SimonBaird|\n| License:|[[BSD open source license]]|\n| CoreVersion:|2.1|\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\n(Note if TiddlerName doesn't exist it will be silently created)\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing. Should it stick the tag in the edit box?\n\n***/\n//{{{\n\nmerge(config.macros,{\n\n toggleTag: {\n\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n label = (label == '-' ? '' : label);\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.toggleTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n //store.suspendNotifications(); \n store.setTiddlerTag(title,this.checked,tag);\n //refreshDisplay(); \n //store.resumeNotifications();\n return true;\n });\n }\n }\n});\n\n//}}}\n\n
/***\nContains the stuff you need to use Tiddlyspot\nNote you must also have UploadPlugin installed\n***/\n//{{{\n\n// edit this if you are migrating sites or retrofitting an existing TW\nconfig.tiddlyspotSiteId = 'mitry';\n\n// make it so you can by default see edit controls via http\nconfig.options.chkHttpReadOnly = false;\nwindow.readOnly = false; // make sure of it (for tw 2.2)\n\n// disable autosave in d3\nif (window.location.protocol != "file:")\n config.options.chkGTDLazyAutoSave = false;\n\n// tweak shadow tiddlers to add upload button, password entry box etc\nwith (config.shadowTiddlers) {\n SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';\n SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");\n OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");\n DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n MainMenu = MainMenu.replace(/^/,"[[Welcome to Tiddlyspot]] ");\n}\n\n// create some shadow tiddler content\nmerge(config.shadowTiddlers,{\n\n'Welcome to Tiddlyspot':[\n "This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",\n "<<tiddler TspotControls>>",\n "See also GettingStarted.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \s"save to web\s" button in the column on the right.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \s"upload\s" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",\n "",\n "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."\n].join("\sn"),\n\n'TspotControls':[\n "| tiddlyspot password:|<<option pasUploadPassword>>|",\n "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",\n "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"\n].join("\sn"),\n\n'TspotSidebar':[\n "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"\n].join("\sn"),\n\n'TspotOptions':[\n "tiddlyspot password:",\n "<<option pasUploadPassword>>",\n ""\n].join("\sn")\n\n});\n//}}}\n
<<option chkSaveBackups>> SaveBackups <<saveChanges>>\nTo upgrade select MonkeyGTDUpgrade (or MonkeyGTDUpgradeTs for tiddlyspot online use) then fetch and install all tiddlers. Click Continue if you get long-running script warnings. When it's done save and reload.\n<<importTiddlers>>\n
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 19/7/2007 17:34:41 | YourName | [[/|http://mitry.tiddlyspot.com/]] | [[store.cgi|http://mitry.tiddlyspot.com/store.cgi]] | . | index.html | . |
/***\n|''Name:''|UploadPlugin|\n|''Description:''|Save to web a TiddlyWiki|\n|''Version:''|3.4.5|\n|''Date:''|Oct 15, 2006|\n|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|\n|''Documentation:''|http://tiddlywiki.bidix.info/#UploadDoc|\n|''Author:''|BidiX (BidiX (at) bidix (dot) info)|\n|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|\n|''~CoreVersion:''|2.0.0|\n|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|\n|''Include:''|config.lib.file; config.lib.log; config.lib.options; PasswordTweak|\n|''Require:''|[[UploadService|http://tiddlywiki.bidix.info/#UploadService]]|\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 4, revision: 5, \n date: new Date(2006,9,15),\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n documentation: 'http://tiddlywiki.bidix.info/#UploadDoc',\n author: 'BidiX (BidiX (at) bidix (dot) info',\n license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',\n coreVersion: '2.0.0',\n browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 1}, \n date: new Date(2006,8,19)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 3, date: new Date(2006,8,30),\n type: 'tweak',\n source: '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 {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.className = "txtOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "pasOptionInput "+opt;\n place.appendChild(c);\n c.value = config.options[opt];\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n c.className = "chkOptionInput "+opt;\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n backupFileStored: "Previous file backuped in %0",\n crossDomain: "Certainly a cross-domain isue: access to an other site isn't allowed",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileLocked: "Files is locked: You are not allowed to Upload",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n passwordEmpty: "Unable to upload, your password is empty",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.toDirUrl(storeUrl, uploadDir, username)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.toRootUrl = function (storeUrl, username)\n{\n return root = (this.dirname(storeUrl)?this.dirname(storeUrl):this.dirname(document.location.toString()));\n}\nconfig.macros.upload.toDirUrl = function (storeUrl, uploadDir, username)\n{\n var root = this.toRootUrl(storeUrl, username);\n if (uploadDir && uploadDir != '.')\n root = root + '/' + uploadDir;\n return root;\n}\nconfig.macros.upload.toFileUrl = function (storeUrl, toFilename, uploadDir, username)\n{\n return this.toDirUrl(storeUrl, uploadDir, username) + '/' + toFilename;\n}\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (!password || password === '') {\n alert(config.macros.upload.messages.passwordEmpty);\n return;\n }\n if (storeUrl === '') {\n storeUrl = config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n // Check that file is not locked\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n if (BidiX.GroupAuthoring.lock.isLocked() && !BidiX.GroupAuthoring.lock.isMyLock()) {\n alert(config.macros.upload.messages.fileLocked);\n return;\n }\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n var toDir = config.macros.upload.toDirUrl(storeUrl, toFilename, uploadDir, username);\n displayMessage(config.macros.upload.messages.aboutToUpload.format([toDir]), toDir);\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, rssPath, uploadDir, username);\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [toFileUrl]), toFileUrl);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = 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\n revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");\n revised = revised.replaceChunk("<!--PRE-HEAD-START--"+">","<!--PRE-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPreHead","") + "\sn");\n revised = revised.replaceChunk("<!--POST-HEAD-START--"+">","<!--POST-HEAD-END--"+">","\sn" + store.getTiddlerText("MarkupPostHead","") + "\sn");\n revised = revised.replaceChunk("<!--PRE-BODY-START--"+">","<!--PRE-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPreBody","") + "\sn");\n revised = revised.replaceChunk("<!--POST-BODY-START--"+">","<!--POST-BODY-END--"+">","\sn" + store.getTiddlerText("MarkupPostBody","") + "\sn");\n\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n var toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n if (responseText.indexOf("destfile:") > 0) {\n var destfile = responseText.substring(responseText.indexOf("destfile:")+9, \n responseText.indexOf("\sn", responseText.indexOf("destfile:")));\n toFileUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + destfile;\n }\n else {\n toFileUrl = config.macros.upload.toFileUrl(storeUrl, toFilename, uploadDir, username);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [toFileUrl]), toFileUrl);\n if (backupDir && responseText.indexOf("backupfile:") > 0) {\n var backupFile = responseText.substring(responseText.indexOf("backupfile:")+11, \n responseText.indexOf("\sn", responseText.indexOf("backupfile:")));\n toBackupUrl = config.macros.upload.toRootUrl(storeUrl, username) + '/' + backupFile;\n displayMessage(config.macros.upload.messages.backupFileStored.format(\n [toBackupUrl]), toBackupUrl);\n }\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n // erase local lock\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n BidiX.GroupAuthoring.lock.eraseLock();\n // change mtime with new mtime after upload\n var mtime = responseText.substr(responseText.indexOf("mtime:")+6);\n BidiX.GroupAuthoring.lock.mtime = mtime;\n }\n \n \n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n 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 // add lock attributes to sheader\n if (window.BidiX && BidiX.GroupAuthoring && BidiX.GroupAuthoring.lock) {\n var l = BidiX.GroupAuthoring.lock.myLock;\n sheader += ";lockuser=" + l.user\n + ";mtime=" + l.mtime\n + ";locktime=" + l.locktime;\n }\n sheader += ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n //strailer = "--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n try {\n request.open("POST", storeUrl, true); \n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent + "\snStatus: "+request.status.statusText);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\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 try {\n request.open("GET", document.location.toString(), true);\n }\n catch(e) {\n alert(config.macros.upload.messages.crossDomain + "\snError:" +e);\n exit;\n }\n \n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]) + "\snStatus: "+request.status.statusText);\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nsetStylesheet(\n ".pasOptionInput {width: 11em;}\sn"+\n ".txtOptionInput.txtUploadStoreUrl {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadFilename {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadDir {width: 25em;}\sn"+\n ".txtOptionInput.txtUploadBackupDir {width: 25em;}\sn"+\n "",\n "UploadOptionsStyles");\nif (document.location.toString().substr(0,4) == "http") {\n config.options.chkAutoSave = false; \n saveOptionCookie('chkAutoSave');\n}\nconfig.shadowTiddlers.UploadDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadDoc ]]\sn"; \n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n};\n\n//}}}\n////===\n\n
\n<div macro="showWhenTagged GTD">\n\n<div macro="showWhen tiddler.tags.contains('MainDash')">[[MainDashDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Project')">[[ProjectDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Context')">[[ContextDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Area')">[[AreaDash]]</div>\n<div macro="showWhen tiddler.tags.contains('Realm')">[[RealmDash]]</div>\n\n<div macro="showWhen tiddler.title == 'Tickler'">[[TicklerTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Context'">[[ContextTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Realm'">[[RealmTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Area'">[[AreaTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Next'">[[NextTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Action'">[[ActionTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Project'">[[ProjectTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Starred'">[[StarredTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Inbox'">[[InboxTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Process Inbox'">[[ProcessInboxTiddlerDash]]</div>\n<div macro="showWhen tiddler.title == 'Collect Thoughts'">[[CollectThoughtsTiddlerDash]]</div>\n\n</div>\n\n
\n\n<table macro="showWhen tiddler.tags.contains('GTD')" class="mToolbar" width="100%" cellspacing="0" border="0">\n\n <tbody macro="hideWhen tiddler.tags.containsAny(config.mGTD.config.GTDComponent) ||\n config.mGTD.config.GTDComponent.contains(tiddler.title) ||\n tiddler.title == 'Starred' ||\n tiddler.title == 'Process Inbox' ||\n tiddler.title == 'Collect Thoughts'\n "\n > <!-- this seems clumsy. rethink? -->\n <tr>\n <td class="label">Type:</td>\n <td><span macro="checkboxList GTDComponent"></span></td>\n </tr>\n </tbody>\n\n <tbody macro="showWhen tiddler.tags.contains('MainDash')">[[MainDashPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Realm')">[[RealmPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Tickler')">[[TicklerPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Project')">[[ProjectPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Action')">[[ActionPanel]]</tbody>\n <tbody macro="showWhen tiddler.tags.contains('Area')">[[AreaPanel]]</tbody>\n</table>\n\n\n\n
\n<!--{{{-->\n\n<div class='toolbar'>\n <span macro="showWhenTagged systemConfig">\n <span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>\n </span>\n <span style="padding:1em;"></span>\n <span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler permalink references newHere refresh'></span>\n</div>\n\n<div class="tagglyTagged" macro="tags"></div>\n\n<div class='titleContainer'>\n <span class='title' macro='view title'></span>\n <span macro="miniTag"></span>\n <span macro="toggleTag GTD"></span>\n <span macro="showWhenTagged GTD">\n <span macro="tTag tag:Starred mode:text text:{{config.mGTD.star}}"></span>\n </span>\n</div>\n\n<div class='subtitle'>\n <span macro='view modifier link'></span>,\n <span macro="hideWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'">\n <span macro='view modified date [[DD/MM/YY]]'></span>\n (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[DD/MM/YY]]'></span>)\n </span>\n <span macro="showWhen store.getValue('MonkeyGTDSettings','mgtd.usemdy')=='true'">\n <span macro='view modified date [[MM/DD/YY]]'></span>\n (<span macro='message views.wikified.createdPrompt'></span>\n <span macro='view created date [[MM/DD/YY]]'></span>)\n </span>\n</div>\n\n<div macro="showWhenExists ViewPanelTemplate">[[ViewPanelTemplate]]</div>\n\n<!--\n<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer' macro='view text wikified'></div>\n</div>\n<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer'><pre macro='view text'></pre></div>\n</div>\n-->\n\n<div macro="hideWhenTagged GTD">\n <div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer' macro='view text wikified'></div>\n </div>\n <div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">\n <div class='viewer'><pre macro='view text'></pre></div>\n </div>\n</div>\n<div macro="showWhenTagged GTD">\n <div style="background:#ffd;padding:0.5em;margin:0.5em 0;border:1px solid #dda;" macro="showWhen tiddler.text.length > 0">\n <div style="font-size:90%;color:#996;">Notes</div>\n <div class='viewer' macro='view text wikified'></div>\n </div>\n</div>\n\n<div macro="showWhenExists ViewDashboardTemplate">[[ViewDashboardTemplate]]</div>\n\n<div macro="hideWhenTagged GTD">\n <div class="tagglyTagging" macro="tagglyTagging"></div>\n</div>\n\n<!--}}}-->\n