I've been Installing more [[Plugins]] to extend the functionality and accessibility of this TiddlyWiki.
My rating system is terribly biased and utterly incomprehensible. There are several artists that can do no wrong in my book, and I have a soft-spot for melodies and pop hooks.\nSo far, the lucky victims are, in no particular order:@@font-family:verdana;font-size:12px;\n|>|>|bgcolor(#8cf ):!Full Length New Releases|\n|[[Current 93 - Black Ships Ate The Sky]] ★★★★★|[[The Research - Breaking Up]] ★★★★★|[[Ratatat - Classics]] ★★★★★|\n|[[Lambchop - Damaged]] ★★★★★|[[Scott Walker - The Drift]] ★★★★★|[[Casiotone For The Painfully Alone - Etiquette]] ★★★★★|\n|[[The Roots - Game Theory]] ★★★★☆ |[[Zero 7 - The Garden]] ★★★★★|[[Viva Voce - Get Yr Blood Sucked Out]] ★★★★☆ |\n|[[Herman Düne - Giant]] ★★★★☆|[[Madeline Peyroux - Half The Perfect World]] ★★★★☆ |[[Final Fantasy - He Poos Clouds]] ★★★☆☆|\n|[[Mombojó - Homem-Espuma]] ★★★★★|[[Califone - Roots & Crowns]] ★★★★★|[[Headlights - Kill Them With Kindness]] ★★★★☆ |\n|[[The Mountain Goats - Get Lonely]] ★★★★☆|[[Sparks - Hello Young Lovers]] ★★☆☆☆ |[[The Album Leaf - Into The Blue Again]] ★★★★★|\n|[[Stuart A. Staples - Leaving Songs]] ★★★★★|[[The Minus 5 - (The Gun Album)]] ★★★★★|[[Mando Diao - Ode To Ochrasy]] ★★★★☆ |\n|[[Ellen Allien & Apparat - Orchestra Of Bubbles]] ★★★★★★|[[Aviette - Until We Hear From Dave]] ★★★★☆|[[Prot(o) = Prot(o)]] ★★★☆☆ |\n|[[Scanners - Violence Is Golden]] ★★★★☆ |[[Hot Chip - The Warning]] ★★★★☆|[[Gershon Kingsley - God Is A Moog]] ★★★★★|\n|[[The Boyfriends - The Boyfriends]] ★★★☆☆|[[Darkel - Darkel]] ★★★★☆|[[Bonobo - Days To Come]] ★★★★★|\n|[[Luomo - Paper Tigers]] ★★★★☆|[[Charlotte Gainsbourg - 5:55]] ★★★★☆|[[Jeremy Warmsley - Art Of Fiction]] ★☆☆☆☆|\n|[[Camouflage - Relocated]] ★★★☆☆|[[Gary Numan - Jagged]] ★★☆☆☆|[[The Puppini Sisters - Betcha Bottom Dollar]] (no rating)|\n|[[Destroyer - Destroyer's Rubies]] ★★★★☆|[[The Format - Dog Problems]] ★★★★★|[[Copeland - Eat, Sleep, Repeat]] ★★★☆☆|\n|[[Jóhann Jóhannsson - IBM 1401, A User’s Manual]] ★★★★★|[[Jarvis - Jarvis]] ★★★★☆|[[The Hidden Cameras - Awoo]] ★★★☆☆|\n|[[Damien Juardo - And Now That I'm In Your Shadow]] ★★★★☆|[[Metronomy - Pip Paine (Pay The £5000 You Owe)]] ★★★★☆ |[[The Divine Comedy - Victory For The Comic Muse]] ★★★★★|\n|[[Erase Errata - Nightlife]] ★★★★★|[[The Blood Arm - Lie Lover Lie]] ★★★★★|[[The Most Serene Republic - Phages]] ★★★★☆|\n|[[Mellowdrone - Box]] ★★★☆☆|[[Anathallo - Floating World]] ★★★☆☆|[[The Buzzcocks - Flat-Pack Philosophy]] ★★★★☆|\n\n|>|>|bgcolor(#8cf ):!Reissues/Remasters/Compilations|\n|[[Pulp - Different Class (Reissue)]] ★★★★★|[[Pulp - His 'N' Hers (Reissue)]] ★★★★☆|[[Pulp - This Is Hardcore (Reissue)]] ★★★★★|\n|[[Tortoise - A Lazarus Taxon (Compilation)]] ★★★★★ | [[The Glove - Blue Sunshine (Reissue)]] ★★★★★|[[Lambchop - The Decline of Country & Western Civilisation Part II]] ★★★★★|\n@@
\nI've been having some rather perplexing computer problems.\n\nToday [[Candace]] and I are invited to dinner with the local branch of her family. An aunt and uncle. I'm pretty sure her paternal grandmother will be there as well.\nI'm begrudgingly back on SoulSeek with some frequency now, but I'm still toying with the idea of releasing my mixes via BitTorrent.\n\n\n
\nDoryPrevin has been all over my PlayLists lately. I've been EarwormedBy "The Lady With The Braid" for about a week now.
Apparently unlisted among the fascinating [[International Standard Paper Sizes|http://www.cl.cam.ac.uk/~mgk25/iso-paper.html]], three inches by five inches is one of the common formats for the incredible [[IndexCard|IndexCards]].\n\n
\nMy name is [[Ktrey]] I like ManualTypewriters, CollectingButterflies, ReadingBooks, WearingSuits and [[Music]].
Aldous Leonard Huxley (pronounced [ˈæl.dəs ˈhʌk.sli]) (July 26, 1894 – November 22, 1963) was an English writer who emigrated to the United States. He was a member of the famous Huxley family. Best known for his novels and wide-ranging output of essays, he also published short stories, poetry, travel writing, and film stories and scripts. Through his novels and essays Huxley functioned as an examiner and sometimes critic of social mores, societal norms and ideals. While his earlier concerns might be called humanist, ultimately, he became quite interested in spiritual subjects like parapsychology and philosophical mysticism, about which he also wrote. By the end of his life, Huxley was considered, in certain circles, a 'leader of modern thought'.\n\nInterestingFacts:\n*He was six feet four and a half inches tall;\n*Studied ballet for several years;\n*Was George Orwell's French teacher for a term at Eton.\n*Is shown on the cover of The Beatles album Sgt. Pepper's Lonely Hearts Club Band as number 18, in the top right hand corner.\n
config.options.chkHttpReadOnly = false;\n
/***\n|Name|AutoOpenTiddlersPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#AutoOpenTiddlersPlugin|\n|Version|0.21|\n|Requires|~TW2.x|\n!!!Description:\nOpen a user defined number of recent tiddlers automatically when the TW loads.\nYou can also specify a tag and only load tiddlers that have that tag.\nTo change the number of tiddlers automatically opened, or define a tag to use, ed the config.autoOpenTiddlers part of the code below.\n\n!!!To Do\n*add an option to exclude tiddlers with a particular tag\n\n!!!Code\n***/\n//{{{\n//edit this section to change the default settings\nconfig.autoOpenTiddlers = \n{\n count: 10, //number of tiddlers opened.\n tag: 'blog' //change if you want to open tiddlers with a specific tag, eg: 'DefaultTiddlers'\n}\n\n\nconfig.autoOpenTiddlers.handler = function()\n{\n if (this.tag == undefined)\n var newTiddlers = store.getTiddlers("modified");\n else\n var newTiddlers = store.getTaggedTiddlers(this.tag,"modified");\n var newTiddlers = newTiddlers.reverse();\n var max = Math.min(this.count,newTiddlers.length-1);\n for (var i=max; i>=0; i--)\n { story.displayTiddler(null,newTiddlers[i].title);} \n}\n\nwindow.old_lewcid_autoOpenTiddlers_restart = restart;\nrestart = function ()\n{\n window.old_lewcid_autoOpenTiddlers_restart();\n config.autoOpenTiddlers.handler();\n}\n//}}}
[<img[Aviette - Until We Hear From Dave|http://img228.imageshack.us/img228/4253/avietteaea27c5mx1.jpg]]I'm actually quite pleased music like this is still being made somewhere. There's a dearth of information about this album on the internet, but for a //very// local act that seems to be primarily confined to the Minneapolis area for the moment, this is to be expected. The band does have a non-myspace web presence (http://www.aviettemusic.com/) which is always a plus in my book. I'd be hard pressed to remember precisely how this album managed to cross my desk in the first place, but regardless of providence, I've found myself giving the short (only eight tracks) slice of sometimes-noisy semi-regular rotation.\n\nHolly Muñoz's mostly subdued vocals bring to mind Dawn Smithson (of Jessamine), and the entire album seems to call to mind a comfortable sense of familiarity. From the start of the first track "Ruling Planet" it's pretty obvious why. We're treated to an intro that brings to mind the Breeders, and I find myself waiting for an inevitable choral eruption that doesn't happen. No sparkling production to accentuate the hooks here, just enjoyable unembellished Indie Rock of the early-to-mid-nineties variety.\n\nIn the pursuit of being novel, new acts so often borrow and outright pilfer from such a wide sphere of influences these days that most albums end up seeming like a showcase of unconnected brief moments of interest, and it's refreshing to review an album as straightforward and cohesive as this, plus it pleases me that music like this is still being made somewhere.\n\nDefinitely on the darker side as album's go (though I wouldn't go as far as nihilistic), "Transgression" continues in the same vein as the album's opener. "Everest/Spyhunter" includes a nice stirring string string section, combined with a Jawbox-y guitar. The song seems to meander a bit but there's panache when it finally finds itself about two and a half-to three minutes in, it's a sprawling tune that seems much longer than the mere 4:43 it clcoks in at.\n\nI enjoy the prominent bassline in "All Hollowed Out" but the vocals seem to be competing with the instrumentation. "Judd Nelson" may drive up the tempo slightly, but thankfully we're still faced with bass parts and guitar riffs that benefit from not being perfectly crisp and precise. I'm not sure if the intent here is to send the listener back in time, but it certainly has that affect on me.\n\nThe first half of "Red Rims" is constructed around an itsy-bitsy-spider unraveling guitar line that conjures up a misguided and decidedly gothic twin-brother of Weezer. Ms. Muñoz's vocals are much more confident here, even intelligible in places, and no longer hide behind the rest of the song. This remains for "1907" a song that, from what I can divine, strikes me as the most lyrically verbose. The closer is the laconic "Lotus." It also shares the distinction of being the longest track on the album, and some of it's atmospheric squeals remind me of a scrapyard or maybe a rusty weather vane. One of the busier songs here, it serves as a pleasing capstone for the album.\n\nIf they ever find their way over to Indianapolis, I'll definitely make an effort to catch them live. They strike me as a band that's live sound trumps anything committed to record. Just like some of the best Indie Rock to come out of the nineties.\n\n@@display:block;text-align:center;font-size:1.5em;Nostalgia forces my hand here for a full Four Stars ([[★★★★☆]]). I'll be keeping an ear out.@@\n\n
See: [[Flavor Of The Month]]
This is a placeholder tiddler that auto-magically generates a list of all the ★★★★★ ratings at the moment.\n<<listTags ★★★★★ title #>>Elaboration is forthcoming, and will hopefully be complete by the end of the year.
BitTorrent is the name of a peer-to-peer (P2P) file distribution protocol. The protocol was originally designed and created by programmer Bram Cohen, and is now maintained by BitTorrent Inc. BitTorrent is designed to distribute large amounts of data widely without incurring the corresponding consumption in costly server and bandwidth resources.\n\nI use the client Azureus for all of my BitTorrent needs and it seems to work relatively well.
# Idumæa (Vocals: Marc Almond) – 3:22\n# Sunset (The Death of Thumbelina) – 3:18\n# Black Ships in the Sky – 3:38\n# Then Kill Cæsar – 3:58\n# Idumæa (Vocals: Bonnie "Prince" Billy) – 2:42\n# This Autistic Imperium Is Nihil Reich – 4:03\n# The Dissolution of the Boat Millions of Years – 3:57\n# Idumæa (Vocals: Baby Dee) – 4:19\n# Bind Your Tortoise Mouth – 2:30\n# Idumæa (Vocals: Antony) – 2:02\n# Black Ships Seen Last Year South of Heaven – 4:07\n# Abba Amma (Babylon Destroyer) – 3:19\n# Idumæa (Vocals: Clodagh Simonds) – 2:35\n# Black Ships Were Sinking into Idumæa (Vocals: Cosey Fanni Tutti) – 11:05\n# The Beautiful Dancing Dust (Vocals: Antony) – 0:57\n# Idumæa (Vocals: Pantaleimon) – 3:06\n# Vauvauvau (Black Ships in Their Harbour) – 4:41\n# Idumæa (Vocals: David Tibet) – 1:50\n# Black Ships Ate the Sky – 4:20\n# Why Cæsar Is Burning, Pt. 2 – 2:48\n# Idumæa (Vocals: Shirley Collins) – 2:42@@
[>img[Bonobo - Days To Come|http://image.allmusic.com/00/amg/cov200/drh900/h974/h97463ig97o.jpg]]Days To Come is Bonobo's the third album of original studio material. It's also the British downtempo wizard's second album on Ninja Tune. Take a second look at that record label and you almost know what to expect, but even if chillout electronica isn't you're bag, [[Days To Come|Bonobo - Days To Come]] still receives a hearty recommendation from me. It's masterfully constructed full-bodied music. Dripping with organic warmth and so sopping wet in places it doesn't even seem electronic.\n\nFrom the start ("Intro") we're greeted with something out of a '60s French film but with a slightly Eastern feel. The short and sweet "Intro" is definitely a real tone-setter track, and should forcefully persuade you to listen further. \n\nWe're rewarded with the title track, "Days To Come" and several songs on this album feature intriguing vocals by Bajka (it's pronounced "Biker"). I've seen some contention about the vocals, and fans seem pretty divided on their contribution to the album as a whole. Luckily, there's a bonus disc of material that features instrumental tracks for the purists. I'm from the "vocals add" rather than "vocals detract" camp. They give the album a much jazzier feel, complimenting the music in the same way that Sia's vocals suit the music of [[Zero 7|Zero 7 - The Garden]]'s release this year.\n\nEastern pipes mesh nicely with the bass notes of "Between The Lines," and this theme carries over into the lush song "The Fever." Much like Luomo's [[Paper Tigers|Luomo - Paper Tigers]] the album can be equal parts compelling for intent listening and calming background music, all depending on your mood from the start. It only pulls you in if you're not looking to be pulled in, but is highly rewarding either way.\n\nThe dark clicks (handclaps?) of "Ketto" don't belittle the track's downright resonant bass. Like virtually all of this album, everything seems so expertly combined without coming across as too tweaked or contrived. But then again, I am a sucker for drum-breaks that don't detract. Even waiting for the stirring strings on "Nightlite" is enjoyable with enough layers to keep even the most analytical ear occupied. I'll leave you to experience the second half of the album //sans// spoilers, well alright, maybe one: there's some intriguing cello lurking in the drum driven "On Your Marks."\n\n@@display:block;text-align:center;font-size:1.5em; Five Stars ([[★★★★★]]) and I swear, I tend to despise downtempo!@@\n
Brave New World, published in 1932, was first intended as a dystopian novel by AldousHuxley. Set in London in the 26th century, the novel anticipates developments in reproductive technology, eugenics and hypnopædia that combine to change society. The world it describes could also be a utopia, albeit an ironic one: Humanity is carefree, healthy and technologically advanced. Warfare and poverty have been eliminated and everyone is permanently happy. The irony is that all of these things have been achieved by eliminating many things — family, cultural diversity, art, literature, science, religion and philosophy. It is also a hedonistic society, deriving pleasure from promiscuous sex and drug use.
<<calendar thismonth>>
/***\n''Name:'' Calendar plugin\n''Author:'' SteveRumsby\n\n// // updated by Jeremy Sheeley to add cacheing for reminders\n// // see http://www.geocities.com/allredfaq/reminderMacros.html\n// // ''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
[<img[Califone - Roots & Crowns|http://image.allmusic.com/00/amg/cov200/drh800/h811/h81192a4zay.jpg]]\n\n\n\nThis is easy: It's an amazing album. Even with it's utterly inscrutable lyrics. \nI especially enjoyed the Psychic TV cover song ("The Orchids").\n\nSo yes, this is a must-listen for 2006. \nApologies for the lack of length, although I've had no complaints before.\n\n\n\n\n @@display:block;text-align:center;font-size:2em;line-height:120%;A completely speechless ([[★★★★★]]).@@ \n
[<img[Camouflage - Relocated|http://ec1.images-amazon.com/images/P/B000GIXLZW.01._AA240_SCLZZZZZZZ_V62623668_.jpg]]Did you "Enjoy The Silence?" To you, is DM's non-stop single-fest [[Violator|Depeche Mode - Violator]] still the "Sweetest Perfection" as far as synthpop is concerned?\n\nThen, like me, you'll have a hard time listening to [[Relocated|Camouflage - Relocated]] without snarking. It's a solid effort, and it's been a long time since their last release (what was it, Spice Crackers?), but we're still treated to more counterfeit Depeche Mode. Longtime Camouflage fans will notice that their sound has matured somewhat, so instead of sounding like Black Celebration, [[Relocated|Camouflage - Relocated]] riffs on [[Violator|Depeche Mode - Violator]]. The lyrical content may suffer a little from the typical "English as a Second Language" syndrome, but they certainly have their sound down, even if they were beat to the punch by sixteen years. \nHere's a quick equivalence chart:\n|>|>|bgcolor(#8cf ):!Relocated vs Violator|\n|Passing By & Motif Sky|=|World In My Eyes|\n|We Are Lovers|=|Personal Jesus|\n|Pleasure Remains|=|Enjoy The Silence|\n|Perfect Key |=|A stripped down Stripped|\n\nThere's a lot more where that came from in the way of ersatz Gore & Gahan. Even their spookier moments end up sounding a bit like Alan Wilder's Recoil, especially some of the gospel bits in "How Do You Feel?" I'm all for the occasional bit of mimicry and pastiche, which is probably why I always make sure to check out the latest Camouflage release. \n\n@@display:block;text-align:center;font-size:1.5em;I'm generous, and have that festering soft spot for synthpop, so [[★★★☆☆]] for the tribute band that never was.@@\n\n
Candace is my girlfriend and a wonderful human being.
/***\n|''Name:''|CollapseTiddlersPlugin|\n|''Source:''|http://gensoft.revhost.net/Collapse.html|\n|''Author:''|Bradley Meck|\n|''License:''|unknown|\n|''~CoreVersion:''|2.0.10|\n\n|ELS 2/24/2006: added fallback to "CollapsedTemplate if "WebCollapsedTemplate" is not found |\n|ELS 2/6/2006: added check for 'readOnly' flag to use alternative "WebCollapsedTemplate" |\n\n***/\n\nconfig.commands.collapseTiddler = {\ntext: "fold",\ntooltip: "Collapse this tiddler",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nif(e.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nif(e.getAttribute("template") != t ){\ne.setAttribute("oldTemplate",e.getAttribute("template"));\nstory.displayTiddler(null,title,t);\n}\n}\n}\n}\n\nconfig.commands.expandTiddler = {\ntext: "unfold",\ntooltip: "Expand this tiddler",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nstory.displayTiddler(null,title,e.getAttribute("oldTemplate"));\n}\n}\n\nconfig.macros.collapseAll = {\nhandler: function(place,macroName,params,wikifier,paramString,tiddler){\ncreateTiddlyButton(place,"Collapse All","",function(){\nstory.forEachTiddler(function(title,tiddler){\nif(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE])\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nstory.displayTiddler(null,title,t);\n})})\n}\n}\n\nconfig.macros.expandAll = {\nhandler: function(place,macroName,params,wikifier,paramString,tiddler){\ncreateTiddlyButton(place,"Expand All","",function(){\nstory.forEachTiddler(function(title,tiddler){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nif(tiddler.getAttribute("template") == t) story.displayTiddler(null,title,tiddler.getAttribute("oldTemplate"));\n})})\n}\n}\n\nconfig.commands.collapseOthers = {\ntext: "focus",\ntooltip: "Expand this tiddler and collapse all others",\nhandler: function(event,src,title)\n{\nvar e = story.findContainingTiddler(src);\nstory.forEachTiddler(function(title,tiddler){\nif(tiddler.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]){\nvar t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";\nif (!store.tiddlerExists(t)) { alert("Can't find 'CollapsedTemplate'"); return; }\nif (e==tiddler) t=e.getAttribute("oldTemplate");\n//////////\n// ELS 2006.02.22 - removed this line. if t==null, then the *current* view template, not the default "ViewTemplate", will be used.\n// if (!t||!t.length) t=!readOnly?"ViewTemplate":"WebViewTemplate";\n//////////\nstory.displayTiddler(null,title,t);\n}\n})\n}\n}
<!--{{{-->\n<div class='toolbar' macro='toolbar expandTiddler +collapseOthers -closeTiddler closeOthers editTiddler sendTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<hr style="color:#fff;height:0px;border:1px solid #ffcccc;margin-bottom:5px;"/>\n<!--}}}-->
/***\nJust some bits and pieces\n***/\n//{{{\nconfig.messages.messageClose.text = "X"; // default is "close"\nconfig.views.wikified.defaultText = ""; // default is "The tiddler '%0' doesn't yet exist. Double-click to create it"\nconfig.options.chkHttpReadOnly = true; // Enable editing so that visitors can experiment with it\n//}}}
\nI can be emailed or telephoned.
[>img[Copeland - Eat, Sleep, Repeat|http://image.allmusic.com/00/amg/cov200/drh800/h886/h88684otp5x.jpg]]\nReleased on Halloween, this is the third album from the Florida-based band Copeland, and boy is it a blurry record. I napped several times in the process of absorbing the album for this review, and while I'd like to attribute that to the wintry weather, I get the feeling that it has more to do with the records consummately relaxing nature. It's very well put-together, each track showcasing some reflective lyrics delivered softly and effeminately by lead singer Aaron Marsh. But even the strategy of surreptitiously peppering the album with slightly more upbeat songs wasn't enough to keep me intensely engrossed.\n\nSo it's probably not my thing, and I may just be grumpy with a sore jaw from constantly yawning, but if you enjoy peaceful, sentimental music then I'll still recommend that you give this a spin or two or five, because it does gradually grow on you. The overall soft wistfulness even manages to camp out in busier, louder songs like "Control Freak," "By My Side," and the cacophonous cadences of the album opener. There are many of these very "nice" moments, like the beautiful horn section hiding at the end of "Love Affair" and the enjoyable strings in "When You Thought You'd Never Stand Out." These stirring bits of lovely are combined with some generally interesting time-signatures and a profusion of piano parts that seem to sneak their way into each song. Even heavy electric guitar parts drizzled into songs like "I'm A Sucker For A Kind Word" still keep the mood mellow and intimate.\n\nPerhaps the fragile prettiness of this album just crumbles when confronted by an unsympathetic, overly analytical ear. Well, that and the fact that I never could bring myself to like Bright Eyes.\n\n@@display:block;text-align:center;font-size:1.5em;I'll tack Three Stars ([[★★★☆☆]]) on it, because I have the sneaking suspicion I'm just not the target audience here.@@\n\n
[<img[Current 93 - Black Ships Ate The Sky|http://image.allmusic.com/00/amg/cov200/drh300/h334/h33430fiwfn.jpg]]Has it really been six years since the last release of completely new material from Current 93? Well if so, then the wait has been well worth it.\n\nThe album is constructed around the cap-stone song "Idumæa" which serves as a beautiful, if haunting leitmotif. The eighteenth century Methodist hymn is interpreted in various ways by several artists (Antony Hegarty, Bonnie 'Prince' Billy, Marc Almond, Cosey Fanni Tutti and Shirley Collins) and alternates between an efficient grounding mechanism and tonal springboard. Another recurring theme is that of the "Black Ships" themselves, they ominously insert themselves into the lyrics of various songs, culminating with the album's pulsing title track that features an overdriven guitar that fits in with the album by standing out.\n\nI read a review elsewhere that describes this release as "Christian rock that will strip the paint from your soul," and although I can't entirely agree with the "Christian Rock" appellation in regards to genre (this seems the very definition of Apocalyptic Folk, the term coined by David Tibet himself) this album could definitely be described as abrasive to those unfamiliar with Current 93's oeuvre. \n\nTo those familiar with Current 93, this album seems a bit more mellow than most, with the original compositions containing some of the most evocative lyrics by Tibet to date.\n\n@@display:block;text-align:center;font-size:1.5em;The album garners a full five stars ([[★★★★★]]) which will likely place it on my [[Best Of|Best Of 2006]] list this year.@@\n@@display:block;padding-left:2em;<<slider chkTestSlider BlackShipsTracklisting Tracklisting: "Tracklisting:">>@@
[>img[Damien Jurado - And Now I'm In Your Shadow|http://image.allmusic.com/00/amg/cov200/drh800/h807/h80797ffor2.jpg]]This is the first time I've been exposed to Damien Juardo, and probably won't be the last. \n>''a·da·gio'' (ə-dä'jō, -jē-ō', -zhō, -zhē-ō) \n>//adv. & adj. Music.//\n>In a slow tempo, usually considered to be slower than andante but faster than larghetto. Used chiefly as a direction.\nWe're invited to embrace the above definition in the new release by Damien Juardo, it's a somber and plaintive record. I'd classify it as minimalist folk. Drums appear only rarely, with cymbals accenting rather than providing a beat. The entire album seems to progressively build upon itself. I was pleased to discover that confessional material is new territory for Damien Juardo, but he takes to it well with his quiet carefully painted narratives. The small details included in his lyrics stand out and create a complete and pensive immersion in the stories he tells.\n\nNow for some quick summations, for the album is better heard as a whole:\n*"Denton, TX" and "Shannon Rhodes" are remarkably sympathetic songs about women now missing from the songwriter's life.\n*One of a couple gingerly unraveled murder ballads, "I Had No Intentions" is gloomy to the point of being on par with Bill Callahan (Smog). \n*The harmonica coda at the end of sadly sweet wrencher "I Am Still Here."\n*"Gas Station" with it's echoes of "Denton, TX." I'm a sucker for song-spanning narratives.\nThe drum machine-driven track: "What Were the Chances" (a duet with Jenna Conrad) deserves special mention. There are shades of [[Casiotone For The Painfully Alone]] here, but in a good way. The duet eschews the typical call-and-response device by having Ms. Conrad foreshadow each line. The repetition and the crosstalk are an interesting lyrical device. This changes in the middle of the song, and the abrupt shift in the lyrics is powerful and timely.Check it out.\n\n@@display:block;text-align:center;font-size:1.5em;Four Stars, ([[★★★★☆]]), five if you listen to it in the middle of a "sad drunk."@@\n\n
[>img[Darkel - Darkel|http://image.allmusic.com/00/amg/cov200/drh600/h699/h69986iwjbf.jpg]]Darkel is the debut solo album by Darkel (~Jean-Benoît Dunckel), one-half of the French electronica band Air and that is almost precisely how it sounds. Air divided by two. Apparently recorded whilst Dunckel was working on [[Charlotte Gainsbourg|Charlotte Gainsbourg - 5:55]]'s new album, most of the tunes come across like unworkable material and cullings from the ~B-Side bin. Oh well, it's a nice filler to pop in while waiting for the next Air album\n\nSounding more like a sequel to [[Moon Safari|Air - Moon Safari]] than the sublime [[Talkie Walkie|Air - Talkie Walkie]], [[Darkel|Darkel - Darkel]] is occasionally catchy, mostly cheesy pop. Dunkel's feminine vocals are characteristically wispy, lispy, light and detached, but like most native francophones working in English, many of the songs fall lyrically flat. Although one can hear what may be the ghost of Marc Bolan in "My Own Sun." \n\nThe album doesn't seem to actually begin until the stomper "TV Destroy" but, exhausted from the anti-television tirade, the songs that follow seem to quickly mellow, "Earth" and it's repetitive refrain shows shades of Psychedelic Furs. The album kicks back up briefly for another ~T-Rex-y tune, an endearing love song: "Beautiful Woman." \n\nMy favorite track has to be "How Brave You Are." Here Dunkel's vocals form a wonderful chorus over the arpeggios. Soft and encouraging, this is definitely a chance to witness the birth of an earworm. The album closes on an optimistic instrumental note with "Bathroom Spirit" and it's trickling piano.\n\n@@display:block;text-align:center;font-size:1.5em;My soft spot for pop doles out an extra star here, for a total of Four, ([[★★★★☆]])@@\n
/***\n''Date Plugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#DatePlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n^^last update: <<date tiddler "DDD, MMM DDth, YYYY hh:0mm:0ss">>^^\n\nThere are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.\n\nThis plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.\n!!!!!Usage\n<<<\nWhen installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.\n\nHowever, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:\n* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.\n* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values. \n* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"\n>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^\n>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^\n>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^\n>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^\n* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format\n\nIn addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:\n\n''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' \n\nNote that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:\n* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.\n* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.\n<<<\n!!!!!Examples\n<<<\nThe current date: <<date>>\nThe current time: <<date today "0hh:0mm:0ss">>\nToday's blog: <<date link today "DDD, MMM DDth, YYYY">>\nRecent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>\nThe first day of next month will be a <<date Y M+1 1 "DDD">>\nThis tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>\nThe SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>\nThis document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DatePlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.\n''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.\n''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.\n''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").\n''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.\n''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox crash bug when referencing global variables\n''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.\n''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()\n''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)\nadded flag param to showDate() API to override internal weekend[] array\n''2005.12.27 [2.0.0]'' Update for TW2.0\nAdded parameter handling for 'linkformat'\n''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.\n''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter\n''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter\n''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.\n''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).\n''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...\n''2005.10.31 [1.0.1]'' documentation and code cleanup\n''2005.10.31 [1.0.0]'' initial public release\n''2005.10.30 [0.9.0]'' pre-release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.date = {major: 2, minor: 2, revision: 1, date: new Date(2006,5,9)};\n//}}}\n\n//{{{\nconfig.macros.date = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#babb1e", // "babble"\n todaybg: "#ffab1e", // "fable"\n weekendbg: "#c0c0c0", // "cocoa"\n holidaybg: "#ffaace", // "face"\n modifiedsbg: "#bbeeff", // "beef"\n remindersbg: "#c0ffee", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};\n//}}}\n\n//{{{\nconfig.macros.date.handler = function(place,macroName,params)\n{\n // do we want to see a link, a popup, or just a formatted date?\n var mode="display";\n if (params[0]=="display") { mode=params[0]; params.shift(); }\n if (params[0]=="popup") { mode=params[0]; params.shift(); }\n if (params[0]=="link") { mode=params[0]; params.shift(); }\n // get the date\n var now = new Date();\n var date = now;\n if (!params[0] || params[0]=="today")\n { params.shift(); }\n else if (params[0]=="filedate")\n { date=new Date(document.lastModified); params.shift(); }\n else if (params[0]=="tiddler")\n { date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }\n else if (params[0].substr(0,8)=="tiddler:")\n { var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }\n else {\n var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));\n var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));\n var d = eval(params.shift().replace(/D/ig,now.getDate()+0));\n date = new Date(y,m-1,d);\n }\n // date format with optional custom override\n var format=this.format; if (params[0]) format=params.shift();\n var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();\n showDate(place,date,mode,format,linkformat);\n}\n//}}}\n\n//{{{\nwindow.showDate=showDate;\nfunction showDate(place,date,mode,format,linkformat,autostyle,weekend)\n{\n if (!mode) mode="display";\n if (!format) format=config.macros.date.format;\n if (!linkformat) linkformat=config.macros.date.linkformat;\n if (!autostyle) autostyle=false;\n\n // format the date output\n var title = date.formatString(format);\n var linkto = date.formatString(linkformat);\n\n // just show the formatted output\n if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }\n\n // link to a 'dated tiddler'\n var link = createTiddlyLink(place, linkto, false);\n link.appendChild(document.createTextNode(title));\n link.title = linkto;\n link.date = date;\n link.format = format;\n link.linkformat = linkformat;\n\n // if using a popup menu, replace click handler for dated tiddler link\n // with handler for popup and make link text non-italic (i.e., an 'existing link' look)\n if (mode=="popup") {\n link.onclick = onClickDatePopup;\n link.style.fontStyle="normal";\n }\n\n // format the popup link to show what kind of info it contains (for use with calendar generators)\n if (!autostyle) return;\n if (hasModifieds(date))\n { link.style.fontStyle="normal"; link.style.fontWeight="bold"; }\n if (hasReminders(date))\n { link.style.textDecoration="underline"; }\n if(isToday(date))\n { link.style.border="1px solid black"; }\n\n if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )\n { place.style.background = config.macros.date.weekendbg; }\n if(isHoliday(date)&&(config.macros.date.holidaybg!=""))\n { place.style.background = config.macros.date.holidaybg; }\n if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))\n { place.style.background = config.macros.date.modifiedsbg; }\n if (store.tiddlerExists(linkto)&&(config.macros.date.linkedbg!=""))\n { place.style.background = config.macros.date.linkedbg; }\n if (hasReminders(date)&&(config.macros.date.remindersbg!=""))\n { place.style.background = config.macros.date.remindersbg; }\n if(isToday(date)&&(config.macros.date.todaybg!=""))\n { place.style.background = config.macros.date.todaybg; }\n}\n//}}}\n\n//{{{\nfunction isToday(date) // returns true if date is today\n { var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }\n\nfunction isWeekend(date) // returns true if date is a weekend\n { return (config.macros.date.weekend[date.getDay()]); }\n\nfunction isHoliday(date) // returns true if date is a holiday\n{\n var longHoliday = date.formatString("0MM/0DD/YYYY");\n var shortHoliday = date.formatString("0MM/0DD");\n for(var i = 0; i < config.macros.date.holidays.length; i++) {\n var holiday=config.macros.date.holidays[i];\n if (holiday==longHoliday||holiday==shortHoliday) return true;\n }\n return false;\n}\n//}}}\n\n//{{{\n// Event handler for clicking on a day popup\nfunction onClickDatePopup(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = createTiddlerPopup(this);\n if(popup) {\n // always show dated tiddler link (or just date, if readOnly) at the top...\n if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))\n createTiddlyLink(popup,this.date.formatString(this.linkformat),true);\n else\n createTiddlyText(popup,this.date.formatString(this.linkformat));\n addModifiedsToPopup(popup,this.date,this.format);\n addRemindersToPopup(popup,this.date,this.linkformat);\n }\n scrollToTiddlerPopup(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nfunction indexModifieds() // build list of tiddlers, hash indexed by modification date\n{\n var modifieds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].modified.formatString("YYYY0MM0DD")\n if (!modifieds[date])\n modifieds[date]=new Array();\n modifieds[date].push(tiddlers[t].title);\n }\n return modifieds;\n}\nfunction hasModifieds(date) // returns true if date has modified tiddlers\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addModifiedsToPopup(popup,when,format)\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];\n if (mods) {\n mods.sort();\n var e=createTiddlyElement(popup,"div",null,null,"changes:");\n for(var t=0; t<mods.length; t++) {\n var link=createTiddlyLink(popup,mods[t],false);\n link.appendChild(document.createTextNode(indent+mods[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date\n{\n var reminders = { };\n if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed\n // DEBUG var starttime=new Date();\n var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);\n for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;\n // DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\sn";\n // DEBUG out+="startdate: "+date.toLocaleDateString()+"\sn"+"leadtime: "+leadtime+" days\sn\sn";\n // DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\sn"; }\n // DEBUG alert(out);\n }\n return reminders;\n}\n\nfunction hasReminders(date) // returns true if date has reminders\n{\n if (window.reminderCacheForCalendar)\n return window.reminderCacheForCalendar[date]; // use calendar cache\n if (!config.macros.date.reminders)\n config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache\n return (config.macros.date.reminders[date]);\n}\n\nfunction addRemindersToPopup(popup,when,format)\n{\n if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed\n\n var indent = String.fromCharCode(160)+String.fromCharCode(160);\n var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);\n var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));\n for(var t=0; t<reminders.length; t++) {\n link = createTiddlyLink(popup,reminders[t].tiddler,false);\n var diff=reminders[t].diff;\n diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");\n var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;\n link.appendChild(document.createTextNode(indent+diff+" - "+txt));\n createTiddlyElement(popup,"br",null,null,null);\n }\n if (readOnly) return; // omit "new reminder..." link\n var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");\n var title = when.formatString(format);\n link.title="add a reminder to '"+title+"'";\n link.onclick = function() {\n // show tiddler editor\n story.displayTiddler(null, title, 2, null, null, false, false);\n // find body 'textarea'\n var c =document.getElementById("tiddler" + title).getElementsByTagName("*");\n for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;\n // append reminder macro to tiddler content\n if (i<c.length) {\n if (store.tiddlerExists(title)) c[i].value+="\sn"; else c[i].value="";\n c[i].value += "<<reminder";\n c[i].value += " day:"+when.getDate();\n c[i].value += " month:"+(when.getMonth()+1);\n c[i].value += " year:"+when.getFullYear();\n c[i].value += ' title:"Enter a title" >>';\n }\n };\n}\n//}}}\n
// // date plugin calendar colors\n//{{{\nconfig.macros.date.holidays=[ "01/01", "07/04", "07/24", "11/24" ]; // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\nconfig.macros.date.weekend=[ 1,0,0,0,0,0,1 ]; // day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6\nconfig.macros.date.format="YYYY.0MM.0DD"; // default date display format\nconfig.macros.date.linkformat="YYYY.0MM.0DD"; // 'dated tiddler' link format\nconfig.macros.date.weekendbg="#c0c0c0";\nconfig.macros.date.holidaybg="#ffaace";\nconfig.macros.date.modifiedsbg="#bbeeff";\nconfig.macros.date.linkedbg="#babb1e";\nconfig.macros.date.remindersbg="#c0ffee";\n//}}}
I'm still slowly compiling my [[2006 Ratings]], a series of a MicroContent reviews to justify my charts this year. Music-wise it's been a very full year, and I've actually managed to stay on top of things.
I'm attempting to churn out at least four <<tag Reviews>> a day on my [[2006 Ratings]] rampage. This means hopefully at least eighty by the end of the year. I'd like to say that I'm shooting for an even and round one hundred though. The year deserves no less.
So I had only barely finished raving about [[Mombojó|Mombojó - Homem-Espuma]]'s latest album, when what should I discover...\n\n\n@@font-size:1.5em;display:block;text-align:center;''[[YOU CAN DOWNLOAD ALL OF THEIR MUSIC FREE ON THEIR OFFICIAL WEBSITE!!!|http://www.mombojo.com.br/downloads.htm]] ''@@\n\nDo this now. While you wait, you can [[read my review of Homem-Espuma|Mombojó - Homem-Espuma]] if you'd like. You can thank me later.\nIt's even licensed under the CreativeCommons for Pete's sake! It just keeps getting better...\n\nI somehow managed to lose one of my reviews earlier today, so now I get to do a little forensic tiddler reconstruction. Fun.
The [[Reviews]] continue to proceed slightly ahead of schedule, with over twenty-one completed at the time of this post. \n\nThe only hurdles I'm having are the obnoxious tendency to periodically add albums to my [[To Review List|2006 Ratings]] and my complete inability to articulate how much and precisely why I enjoy some of this year's best releases (like [[Califone's Roots & Crowns|Califone - Roots & Crowns]] or [[Scott Walker's The Drift|Scott Walker - The Drift]]). I instead seem predisposed to simply slap in some placeholder text consisting of rather simplistic raves and move on to the next one. \n\nMaybe after the initial inertia and self-imposed impeding deadlines die down I'll be able to fitfully revisit them.\n\nOh, and it's bloody cold out.\n\n
/***\n''DeliciousPlayTaggerPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#DeliciousPlayTaggerPlugin\nadapted from original source: http://del.icio.us/js/playtagger\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\n!!!!!Usage\n\nThis plugin defines an object class "Delicious.Mp3", which defines methods for adding the del.icio.us "play tagger" to any mp3 URLs embedded in tiddler content. Simply place {{{<<deliciousPlayTagger>>}}} into the tiddler content ''following any links to mp3 URLs'', and they will be 'del.icio.us'ly tagged to be played with the flash player.\n\n!!!!!Example\nMy favorite [[Friday Night Music|http://www.FridayNightMusic.com]] "Free Jazz" improv compositions:\nhttp://www.elsdesign.com/fnm/audio/030502-5.mp3 ("In The Shadows")\nhttp://www.elsdesign.com/fnm/audio/001103-4.mp3 ("The Sky's The Limit")\nhttp://www.elsdesign.com/fnm/audio/020830-6.mp3 ("Good Morning, Elijah")\n\n<<deliciousPlayTagger>>\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DeliciousPlayTaggerPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for this plugin^^\n<<<\n!!!!!Revision History\n<<<\n''2006.02.21 [1.0.0]''\ninitial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\nadapted from original source code located at: http://del.icio.us/js/playtagger\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.deliciousPlayTagger= {major: 1, minor: 0, revision: 0, date: new Date(2006,2,21)};\n\nconfig.macros.deliciousPlayTagger = { };\nconfig.macros.deliciousPlayTagger.handler = function(place,macroName,params) { Delicious.Mp3.go(place); }\n\nif(typeof(Delicious) == 'undefined') Delicious = {}\nDelicious.Mp3 = {\n playimg: null,\n player: null,\n go: function(place) { // ELS 2006.02.21: added 'place' param\n if (!place) var place=document;\n var all = place.getElementsByTagName('a')\n for (var i = 0, o; o = all[i]; i++) {\n if(o.href.match(/\s.mp3$/i)) {\n var img = document.createElement('img')\n img.src = 'http://del.icio.us/static/img/mp3/play.gif'; img.title = 'listen'\n img.height = img.width = 12\n img.style.marginRight = '0.5em'\n img.style.cursor = 'pointer'\n img.onclick = Delicious.Mp3.makeToggle(img, o.href)\n o.parentNode.insertBefore(img, o)\n }}},\n toggle: function(img, url) {\n if (Delicious.Mp3.playimg == img) Delicious.Mp3.destroy()\n else {\n if (Delicious.Mp3.playimg) Delicious.Mp3.destroy()\n var a = img.nextSibling, c=''\n if (document.defaultView && document.defaultView.getComputedStyle) c = document.defaultView.getComputedStyle(a,null).getPropertyValue('color')\n else if (a.currentStyle) c = a.currentStyle['color']\n c = c.replace(/^rgb|[ ()]/g, '')\n var hex = c.match(/^#?([a-f0-9]{6})$/), hexSm = c.match(/^#?([a-f0-9]{3})$/), rgb = c.match(/^([0-9]+),([0-9]+),([0-9]+)$/)\n if (rgb) { var c16 = "0123456789abcdef", c=''; for(var i=1,d;d=rgb[i];i++) { var j=d%16; c=c+c16.charAt((d-j)/16)+c16.charAt(j) } }\n else if (hex) c = hex[1]\n else if (hexSm) c = hexSm[1].charAt(0) + hexSm[1].charAt(0) + hexSm[1].charAt(1) + hexSm[1].charAt(1) + hexSm[1].charAt(2) + hexSm[1].charAt(2)\n else c = "000000"\n img.src = 'http://del.icio.us/static/img/mp3/stop.gif'; Delicious.Mp3.playimg = img;\n Delicious.Mp3.player = document.createElement('span')\n Delicious.Mp3.player.innerHTML = '<object style="vertical-align:bottom;margin-right:0.2em" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' +\n 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"' +\n 'width="100" height="14" id="player" align="middle">' +\n '<param name="wmode" value="transparent" />' +\n '<param name="allowScriptAccess" value="sameDomain" />' +\n '<param name="flashVars" value="theLink='+url+'&amp;fontColor='+c+'" />' +\n '<param name="movie" value="http://del.icio.us/static/swf/playtagger.swf" /><param name="quality" value="high" />' +\n '<embed style="vertical-align:bottom;margin-right:0.2em" src="http://del.icio.us/static/swf/playtagger.swf" flashVars="theLink='+url+'&amp;fontColor='+c+'"'+\n 'quality="high" wmode="transparent" width="100" height="14" name="player"' +\n 'align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"' +\n ' pluginspage="http://www.macromedia.com/go/getflashplayer" /></object>'\n img.parentNode.insertBefore(Delicious.Mp3.player, img.nextSibling)\n }},\n destroy: function() {\n Delicious.Mp3.playimg.src = 'http://del.icio.us/static/img/mp3/play.gif'; Delicious.Mp3.playimg = null\n Delicious.Mp3.player.removeChild(Delicious.Mp3.player.firstChild); Delicious.Mp3.player.parentNode.removeChild(Delicious.Mp3.player); Delicious.Mp3.player = null\n },\n makeToggle: function(img, url) { return function(){ Delicious.Mp3.toggle(img, url) }}\n}\n\n//}}}
This MGM film was based on the popular, dialogue-rich Broadway hit by George S. Kaufman and Edna Ferber, that was originally produced on the stage by Sam H. Harris. It is a witty romantic comedy is filled with choice lines of dialogue, and revolves around various complex relationships between the characters. Suicide, financial ruin, love, infidelity, economic pressures, class conflict, the dawn of the talkies, divorce, aging and fading careers, and alcoholism affect their interactions.\n\nThe screenplay for the film was written by Herman Mankiewicz, Frances Marion, and Donald Ogden Stewart. It was apparently poorly remade as a TV movie in 1989 starring Marsha Mason, Lauren Bacall, and Harry Hamlin.\n\nThe 1932 film received no Academy Award nominations.\n\nThe dinner party (of the film's title) is being hosted by scheming, social-climbing Millicent Jordan (Billie Burke), wife of ailing and soon-to-be-bankrupt shipping magnate Oliver Jordan (Lionel Barrymore). The film looks at the tangled and changed lives of the high society guests, from the time the invitations are given out for "dinner at eight" at the Jordans to the time of the party itself.\n\n The well-known closing lines of the film are set up when Kitty makes conversation with Carlotta about reading a book [a reference, presumably, to the popular novel of the day, AldousHuxley's 1932 BraveNewWorld]. They are on their way into dinner, promptly served at eight:\n>Kitty: I was reading a book the other day.\n>Carlotta (staggering at the thought): Reading a book!\n>Kitty: Yes. It's all about civilization or something, a nutty kind of a book. Do you know that the guy said that machinery is going to take the place of every profession?\n>Carlotta (eyeing Kitty's costume, breasts and shapely physical charms): Oh, my dear, that's something you need never worry about.
config.macros.dropTagging={};\nconfig.macros.dropTagging.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\n//config.macros.dropTagging.dropdownchar = "▼"; // uncomment previous line and comment this for smaller version in FF\nconfig.macros.dropTagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var arrow=': '+ config.macros.dropTagging.dropdownchar;\n if(params[0] && store.tiddlerExists(params[0]))\n tiddler = store.getTiddler(params[0]);\n\n\n\n var droptagginglabel= (params[1] && params[1] !='.')? params[1]: 'tagging'+arrow;\n var droptaggingtooltip="tiddlers tagged with '"+tiddler.title+"'";\n \n if(params[0] && store.tiddlerExists(params[0]))\n tiddler = store.getTiddler(params[0]);\n var tagged = store.getTaggedTiddlers(tiddler.title);\n\n if(tagged.length==0)\n return false; \n \n var droptagging = function(e)\n { if (!e) var e = window.event;\n var popup = Popup.create(this);\n \n\n\n for(var t=0; t<tagged.length; t++)\n createTiddlyLink(createTiddlyElement(popup,"li"),tagged[t].title,true);\n\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation)\n e.stopPropagation();\n return(false);\n };\n \nvar createdropperButton = function(place){\nvar sp = createTiddlyElement(place,"span",null,"taggingdropbutton");\nvar theDropDownBtn = createTiddlyButton(sp,droptagginglabel,droptaggingtooltip,droptagging);\n };\ncreatedropperButton(place);\n};\n\nsetStylesheet(\n ".toolbar .taggingdropbutton {margin-right:0em; border:0px solid #eee; padding:0px; padding-right:0px; padding-left:0px; }\sn"+\n ".taggingdropbutton a.button {padding:2px; padding-left:2px; padding-right:2px;}\sn"+\n// ".taggingdropbutton {font-size:150%;}\sn"+\n".popup .highlight{background: #fe8; color:#000;}\sn"+\n "",\n"DropTaggingStyles");
<!---\n| Name:|~TagglyTaggingEditTemplate |\n| Version:|1.1 (12-Jan-2006)|\n| Source:|http://simonbaird.com/mptw/#TagglyTaggingEditTemplate|\n| Purpose:|See TagglyTagging for more info|\n| Requires:|You need the CSS in TagglyTaggingStyles to make it look right|\n-->\n<!--{{{-->\n<div class='toolbar' macro='toolbar slice +saveTiddler closeOthers cancelTiddler deleteTiddler wikibar'></div>\n<div class='title' macro='view title'></div>\n<div class='editLabel'>Title</div><div class='editor' macro='edit title'></div>\n<br>\n<div class='editor' macro='edit text'></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<br>\n<!--}}}-->
[>img[Ellen Allien & Apparat - Orchestra Of Bubbles|http://image.allmusic.com/00/amg/cov200/drh200/h232/h23283bif16.jpg]]If you manage to buy only one electronic album for 2006, please do your self a favor and make sure that it's this one. \n\nThe combination of Apparat's warm IDM and Allein's melodic techno seems like an ill-fit on paper, but the two artists have managed to produce something notable, without sacrificing a slice of their respective sounds. [[Orchestra Of Bubbles|Ellen Allien & Apparat - Orchestra Of Bubbles]] makes labelhead/DJ Allien's monolithic [[Thrills|Ellen Allien - Thrills]] sound tinny and under-developed while at the same time accentuating the complexity of Apparat's more Glitch-friendly double EP [[Apparat - Silizium |Silizium]].\n\nFrom the shuffling start of "Turbo Dreams" we enter the cozy, synth-laden dystopia of this album. This is a dark vision that one can still dance to, and even if Allien's vocals on "Way Out" don't sell you, the song itself should sit like a sleeper cell in your brain, at least briefly. "Retina" reminds me of some of the best places of [[Rossz Csillag Alatt Született|Venetian Snares - Rossz Csillag Alatt Született]] but again, much more pattern-recognition friendly. "Jet" is also nice with what sounds like a french horn, and a new spen on some familiar house samples. Whilst it's rising melodic line and rhythm may conjure up a trance vibration to some, it's overall mood is far too low-key for me to make such comparisons. The more traditionally structured song "Sleepless" segues into the tempo-breaker "Metric," which does little to prepare us for the metallic cadences and dirge-like Nords on "Floating Points."\n\n\n\n\n@@color:#fff;\nDupstep "Do Not Break"\nThe next electronic song is called Floating Points and consists in a massive tech-house with electro dance stuff, preparing the experimental track Under to come into the attention – big breaks with massive bass lines. Edison puts a sad fingerprint upon the album, with an astonishing downtempo track, a nostalgic melody and a few deep sounds. Profound and atmospheric, this track ends up by leaving some blotches of sadness to the listeners. Leave Me Alone is one of the jazziest tracks here, with some great male vocals featured in. In the same manner as the track Way Out was made, Do Not Break delivers an astonishing full energetic rhythm with some distorted awesome vocals filled up with effects and mini-scratches. After another interesting track called Metric, the last tune from this album, Bubbles, closes the album in a peaceful manner. Deep and smooth, this last track enhances the effect of nostalgia and numbness created by the track “Edison”.\n@@\n\n\n\n\n
[>img[Erase Errata - Nightlife|http://image.allmusic.com/00/amg/cov200/drh300/h345/h34597k0x9d.jpg]][[Nightlife|Erase Errata - Nightlife]] came out on [[Candace]]'s birthday this year, and with a dozen angular and anxious songs crammed into half an hour of menacing music I quickly arrived at the conclusion that it's quite good. \n\nAlthough they are being billed as New [[No Wave|http://en.wikipedia.org/wiki/No_wave]] (in much the same way the music press has bandied about the imaginative "New New Wave" when attempting to describe the sound of [[Baskin-Robbins bands]] such as The Bravery and The Killers), I'm finding Erase Errata's uncompromising music on this full length more musically akin to demoniacally dancey groups like Brainiac (unfortunately filed under "Experimental Rock" most places) with hints of ~Post-Punk luminaries like the Young Marble Giants or even Gang Of Four. These ingredients are combined to create a real sense of urgency on this very topical and terse album. \n\nThe Brainiac/Enon sound I'm referring to seems to be captured with the album's opener "Cruising." Once I had made this mental connection, I was justifiably intriged enough to merit an immediate, unabridged listen. I also found myself enjoying "Hotel Suicide," from the mournful battlefield trumpet to the lyrical namechecking of [[The Gideons|http://en.wikipedia.org/wiki/Gideon_Bible]]. Politically charged songs like "Another Genius Idea From Our Government, " "Wasteland (In A...)," and "Tax Dollar" still manage to come across as frantically dance-able, and throughout most of the repetitive "Rider" some unmistakably [[Moxham|http://en.wikipedia.org/wiki/Young_Marble_Giants]] moments //really// show. \n\nThe album is not completely bereft of potential ~Indie-Club friendly tracks though, the shortest "He Wants What's Mine" and short "Giant Hans" seem downright friendly when contrasted with the rest of the tempestuous whole. \n\n@@display:block;text-align:center;font-size:1.5em;A+ for Effort gals, and Five Stars ([[★★★★★]]).@@ \n
\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| ==Strikethrough== | {{{==Strikethrough==}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\n\n//For backwards compatibility, the following highlight syntax is also accepted://\n{{{\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@\n}}}\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@
Wow, it's been ages. \n\nI managed to finally remember my password for this site, and I suppose a lot has changed in the two years since I last updated it.\n\nI should probably get cracking to update it to the latest version of TiddlyWiki and re-do some of the now-ancient plug-ins that it uses to their modern and much more slick counterparts.\n\nOr I suppose I could start over... Hmmm...\n\n
\nIt seems like I signed up for [[ http://www.flickr.com | Flickr]] ages ago.\n\nI really don't use it enough to justify the Pro Account I purchased in October last year after purchasing a new camera.\n\n\n
<html>\n<a href="http://www.flickr.com" style="text-align:center;">www.<strong style="color:#3993ff">flick<span style="color:#ff1c92">r</span></strong>.com</a><br>\n<iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="113" height="151" frameborder="0" scrolling="no" src="http://www.flickr.com/apps/badge/badge_iframe.gne?zg_bg_color=ffffff&zg_person_id=37718678182@N01" title="Flickr Badge"></iframe>\n</html>
> "Like running downstairs to answer the doorbell during the first night of marriage." - JohnBarrymore (also alternatively attributed to NoelCoward)\n> "Tedious information set aside where it can be easily skipped." - LeonardLevinson
This TiddlyWiki may occassionally use footnotes. They will open in floating panel (see MovablePanelPlugin) which can be resized, folded, and placed where-ever you wish. \n\nIn my humble opinion, footnotes faciliate digression and imagination. However, here's a few more takes on them:\n\n<<tiddler [[FootnoteQuotes]]>>\n\nI may be able to gradually wean myself off of them and embrace MicroContent.
/***\n|Name|FullScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#FullScreenPlugin|\n|Version|1.1|\n|Requires|~TW2.x|\n!Description:\nToggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.\n\n!Demo:\nClick the ↕ button in the toolbar for this tiddler. Click it again to turn off fullscreen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nEdit the ViewTemplate to add the fullscreen command to the toolbar.\n\n!History:\n*25-07-06: ver 1.1\n*20-07-06: ver 1.0\n\n!Code\n***/\n//{{{\nvar lewcidFullScreen = false;\n\nconfig.commands.fullscreen =\n{\n text:" ↕ ",\n tooltip:"Fullscreen mode"\n};\n\nconfig.commands.fullscreen.handler = function (event,src,title)\n{\n if (lewcidFullScreen == false)\n {\n lewcidFullScreen = true;\n setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important;}',"lewcidFullScreenStyle");\n }\n else\n {\n lewcidFullScreen = false;\n setStylesheet(' ',"lewcidFullScreenStyle");\n }\n}\n\nconfig.macros.fullscreen={};\nconfig.macros.fullscreen.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = params[0]||" ↕ ";\n var tooltip = params[1]||"Fullscreen mode";\n createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);\n}\n\nvar lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler =function(title,animate,slowly)\n{\n lewcid_fullscreen_closeTiddler.apply(this,arguments);\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n\n\nSlider.prototype.lewcidStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n{\n this.lewcidStop();\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n//}}}
[<img[Gary Numan - Jagged|http://image.allmusic.com/00/amg/cov200/drh200/h240/h24070t4lmw.jpg]]Fellow Numanoids like myself have had a long, five years to digest Pure, Gary Numan's last album. Most have made friends with it. I still haven't.\n\nSlated for release in 2003, but delayed until now for various reasons, [[Jagged|Gary Numan - Jagged]] finds us picking up precisely where Pure left off. Sure, the more rabid among us have already heard "Haunted," "Halo," and "Does It Bleed" and so this realization doesn't really come as a surprise. On this album, we're treated to more lengthy, dark and otherworldly intros, and more unfortunately formulaic quiet-loud-quiet-LOUDER-quiet-again songs. \n\nIt's more than passingly interesting phenomenon though. Numan's sphere of influence is huge, with pop-dustrial poster-child Trent Reznor professing an unabashed love for Gary Numan's distinctive brand of electronic music, it seems that Numan has since more than returned the favor. His last few albums have been drenched in a dated Nine Inch Nails sound that's been done to death these days. [[Jagged|Gary Numan - Jagged]] unfortunately doesn't break the cycle. It would seem these rupestrian roles have been exchanged: the influenced are influencing.\n\nThe album is heavy and sullen, as the sampled overdriven guitars on "Haunted" attest, but with vocals that contain more and more pathos and emotion. Gary Numan's self-professed [[Asperger's|http://en.wikipedia.org/wiki/Aspergers]] made for some great alienist records in the seventies and eighties, but it seems that now the man behind the android has opened up and and can't refrain from letting emotions out. In my opinion the music suffers from this "Pressure."\n\nLyrically, the major themes become dead horses ripe for the beating here, "In A Dark Place" and "Melt" question God again with the same agnostic angst we heard on Sacrifice and Exile. This was stirring on Sacrifice, an album that I'll always have a soft spot for, but no new trails are blazed here. "Scanner" is just another "Deadliner" mixed with "Magic." The pervading betrayal boils down to just another recurring motif. Sadly, it's not the same kind of heart-wrenching picture painted in lovely classics like Telekon's "I Die: You Die." At least we've still got the tell-tale Numan vocal delivery and occasional synth wizardry: I too hear echoes of "Rip" in the title track.\n\nI realize I'm being overtly harsh here, particularly when the album itself makes a vivid plea for cautionary restraint in "Before You Hate It," and I don't hate it. I wouldn't review it if I hated it. It's just not terribly memorable for me yet, and time will have to tell to determine if it ever manages to become so.\n\n@@display:block;text-align:center;font-size:1.5em;line-height:120%;It's a sad day, with a Gary Numan album only garnering two stars ([[★★☆☆☆]]) \nI believe this is the lowest I've ever doled out to the Gazzer.@@\n
Welcome to your brand new [[MonkeyPirateTiddlyWiki|http://simonbaird.com/mptw/]]. This is the standard empty [[TiddlyWiki|http://www.tiddlywiki.com/]] (version <<version>>) preconfigured with a few bits and pieces from MPTW, in particular the layout, the colours, and the popular [[TagglyTagging|http://simonbaird.com/mptw/#TagglyTagging]]. If you're new to ~TagglyTagging then try the [[FAQ|http://simonbaird.com/mptw/#TagglyTaggingFAQ]] and [[Tutorial|http://simonbaird.com/mptw/#TagglyTaggingTutorial]].\n\nTo get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened\nYou'll also need to enter your username for signing your edits: <<option txtUserName>>\n\nTo create your own tiddlers, click 'new tiddler' in the right sidebar. To edit a tiddler click the 'edit' button in the tiddler's toolbar. To save all your tiddlers click 'save changes' in the right sidebar. If you're new to TiddlyWiki check out the formatting info [[here|http://www.tiddlywiki.com/#MainFeatures]].\n\nUse this to import tiddlers from another TiddlyWiki. You can use a local file (click Browse...) or type the url of an online TiddlyWiki.\n<<importTiddlers inline>>\nTo change your colour scheme you can edit the styles in StyleSheet. (Refer to StyleSheetColors and StyleSheetLayout for all styles used).\n\n
<<gradient horiz #bbbbbb #eeeeee #ffffff>>The new GradientMacro allows simple horizontal and vertical coloured gradients. They are constructed from coloured HTML elements, and don't require any images to work.>>\nThe GradientMacro is an ExtendedMacro that processes the text after it up until the next '>>' sequence. It looks like this:\n{{{\n<<gradient vert #ffffff #ffdddd #ff8888>>gradient fill>>\n}}}\nThe first parameter can be ''vert'' or ''horiz'' to indicate the direction of the gradient. The following parameters are two or more colours (CSS RGB(r,g,b) format is also acceptable). The GradientMacro constructs a smooth linear gradient between each of the colours in turn.\n\n| <<gradient vert #ffffff #ffdddd #ff8888>>No images were harmed in the making of this gradient fill>> | <<gradient vert #ffffff #ddffdd #88ff88>>No images were harmed in the making of this gradient fill>> | <<gradient vert #ffffff #ddddff #8888ff>>No images were harmed in the making of this gradient fill>> |\n\nInline CSS definitions can be added to gradient filles like this:\n\n<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>\n{{{\n<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>\n}}}\n
/***\n|Name|HaloscanMacro|\n|Created by|JimSpeth|\n|Location|http://end.com/~speth/HaloscanMacro.html|\n|Version|1.1.0|\n|Requires|~TW2.x|\n\n!Description\nComment and trackback support for TiddlyWiki (via Haloscan).\n\n!History\n* 16-Feb-06, version 1.1.0, drastic changes, now uses settings from haloscan account config\n* 31-Jan-06, version 1.0.1, fixed display of counts for default tiddlers\n* 30-Jan-06, version 1.0, initial release\n\n!Examples\n|!Source|!Output|h\n|{{{<<haloscan comments>>}}}|<<haloscan comments>>|\n|{{{<<haloscan trackbacks>>}}}|<<haloscan trackbacks>>|\n\n!Installation\nRegister for a [[Haloscan|http://www.haloscan.com]] account. It's free and painless.\nInstall the HaloscanMacro in a new tiddler with a tag of systemConfig (save and reload to activate).\nIn the macro configuration code (below), change //YourName// to your Haloscan account name.\nUse the macro somewhere in a tiddler (see ViewTemplate for an example).\n\n!Settings\nYou can adjust various options for your account in the member configuration area of Haloscan's web site. The macro will use these settings when formatting the links.\n\n!Code\n***/\n//{{{\n\n/* change "YourName" to your Haloscan account name */\nconfig.macros.haloscan = {account: "ktrey", baseURL: "http://www.haloscan.com/load/"};\n\nvar haloscanLoaded = 0;\nconfig.macros.haloscan.load = function ()\n{\n if (haloscanLoaded == 1)\n return;\n \n account = config.macros.haloscan.account;\n if (!account || (account == "YourName"))\n account = store.getTiddlerText("SiteTitle");\n \n var el = document.createElement('script');\n el.language = 'JavaScript'; \n el.type = 'text/javascript'; \n el.src = config.macros.haloscan.baseURL + account;\n document.documentElement.childNodes[0].appendChild(el);\n \n haloscanLoaded = 1;\n}\nconfig.macros.haloscan.load();\n\n/* this totally clobbers document.write, i hope that's ok */\nvar safeWrite = function(s)\n{\n document.written = s;\n return s;\n};\ndocument.write = safeWrite;\n\nconfig.macros.haloscan.refreshDefaultTiddlers = function ()\n{\n var start = store.getTiddlerText("DefaultTiddlers");\n if (start)\n {\n var titles = start.readBracketedList();\n for (var t=titles.length-1; t>=0; t--)\n story.refreshTiddler(titles[t], DEFAULT_VIEW_TEMPLATE, 1);\n }\n}\n\nvar haloscanRefreshed = 0;\nconfig.macros.haloscan.handler = function (place, macroName, params, wikifier, paramString, tiddler)\n{\n if (typeof HaloScan == 'undefined')\n {\n if (haloscanRefreshed == 0)\n {\n setTimeout("config.macros.haloscan.refreshDefaultTiddlers()", 1);\n haloscanRefreshed = 1;\n }\n return;\n }\n \n var id = story.findContainingTiddler(place).id.substr(7);\n var hs_search = new RegExp('\s\sW','gi');\n id = id.replace(hs_search,"_");\n \n account = config.macros.haloscan.account;\n if (!account || (account == "YourName"))\n account = store.getTiddlerText("SiteTitle");\n \n var haloscanError = function (msg)\n {\n createTiddlyError(place, config.messages.macroError.format(["HaloscanMacro"]), config.messages.macroErrorDetails.format(["HaloscanMacro", msg]));\n }\n \n if (params.length == 1)\n {\n if (params[0] == "comments")\n {\n postCount(id);\n commentsLabel = document.written;\n commentsPrompt = "Comments on this tiddler";\n var commentsHandler = function(e) { HaloScan(id); return false; };\n var commentsButton = createTiddlyButton(place, commentsLabel, commentsPrompt, commentsHandler);\n }\n else if (params[0] == "trackbacks")\n {\n postCountTB(id);\n trackbacksLabel = document.written;\n trackbacksPrompt = "Trackbacks for this tiddler";\n var trackbacksHandler = function(e) { HaloScanTB(id); return false; };\n var trackbackButton = createTiddlyButton(place, trackbacksLabel, trackbacksPrompt, trackbacksHandler);\n }\n else\n haloscanError("unknown parameter: " + params[0]);\n }\n else if (params.length == 0)\n haloscanError("missing parameter");\n else\n haloscanError("bad parameter count");\n}\n\n//}}}\n
[>img[Headlights - Kill Them With Kindness|http://image.allmusic.com/00/amg/cov200/drh400/h433/h43352yby0s.jpg]]Ah, from the initial listen it certainly seemed like I'd inadvertently stumbled across this years' [[Funeral|The Arcade Fire - Funeral]], but after giving the album an honest ear, it seems someone substituted the occasionally stirring somberness and masterfully frantic passages of one of 2004's best albums for slightly infectious and generally optimistic pop. It's a fair swap, but the album continues to distance itself from the comparison by attempting to go into too many directions at once, instead of forming a unified (albeit sometimes contrived) front.\n\nMy attention wasn't truly grabbed until the superb analog synth line in "TV." And although "Put Us Back Together Right" found it's way on a split single with The Most Serene Republic earlier this year, the album seems to gradually descend from "TV"s highpoint. Especially with the disappointing rhymes behind "Pity City." But the interplay between the vocalists on this album is something akin to kryptonite for me, and definitely tugs at my hard on for pop-appreciation even if we've heard it's ilk many times before.\n\n"Songy Darko" isn't saved by a sawing organ and somewhat startling cymbals. There's also a "Moby Octopad" arpeggio lurking in the background that's vaguely disenchanting. The track "Owl Eyes" builds to a nice crescendo in time for the second chorus, but again, the device seems to reek of familiar. Next we have "The Midwest Is Best," a thankfully short and done-to-death banter track à la The Chronic (but with a brief burbling harmonica, heavens no). Whilst some might appreciate the endearing unintelligible intrastudio chatter, I'd personally prefer to get back to the meat of the album, which seems to pick up again from this convenient line of demarcation. "Lions" is far too short, but excellently catchy, and "Lullabies" also works for me, but still not as well as "TV." I'm afraid we're in for another segue track with the instrumental "Struggle With Numbers" unfortunately.\n\nThese breaks work to the album's disadvantage, because "Words Make You Tired" would have easily kept the ascending pace of "Lullabies," even if it is rather conventional electro-pop. Not to be outdone, "~Hi-Ya!" gives us more of the same keyword-catchy instrumentation and vocal work. I hear the Velocity Girl comparisons. Keep an ear open for the gotcha-ghost of Frankie Valli in "Signs Point To Yes (But Outlook Not So Good)." The faint last number, "I Love, You Laugh," does very little to provide any real cohesion or closure to the album. It seems like the tracklist could have just as easily been randomized. Which is good for the sprinkling of Single material here. Gosh, "TV" is excellently earwormy.\n\n@@display:block;text-align:center;font-size:1.5em; We have a very solid Four Star ([[★★★★☆]]) album here, definitely worth a listen for fans of ~Indie-Pop.@@\n
/***\nTo use, add {{{[[HorizontalMainMenuStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also HorizontalMainMenu and PageTemplate.\n***/\n/*{{{*/\n\n#topMenu br {display:none; }\n#topMenu { background: #5599aa; }\n#topMenu { padding:2px; }\n#topMenu .button, #topMenu .tiddlyLink {\n margin-left:0.5em; margin-right:0.5em;\n padding-left:3px; padding-right:3px;\n color:white; font-size:115%;\n}\n#topMenu .button:hover, #topMenu .tiddlyLink:hover { background:#178;}\n\n#displayArea { margin: 1em 15.7em 0em 1em; } /* so we use the freed up space */\n\n/* just in case want some QuickOpenTags in your topMenu */\n#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\n#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }\n#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }\n\n\n/*}}}*/
Occasionally, tiny bits of poetry insert themselves into Instant Messenger conversations. Here's a repository of some examples.\n\n----\nSaturday, September 02, 2006 12:17:26 PM\n\n@@color(#aaaaaa):(12:15:54) @@@@color(#ff0000):Suyos: without a doubt@@\n@@color(#aaaaaa):(12:15:56) Suyos logged out.@@\n----\n\n
/***\n''Import Tiddlers Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#ImportTiddlersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen many people share and edit copies of the same TiddlyWiki document, the ability to quickly collect all these changes back into a single, updated document that can then be redistributed to the entire group is very important. This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. It can also be very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\n!!!!!Inline interface (live)\n<<<\n<<importTiddlers inline>>\n<<<\n!!!!!Macro Syntax\n<<<\n{{{<<importTiddlers>>}}}\ncreates "import tiddlers" link. click to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n{{{<<importTiddlers filter source quiet ask>>}}}\nnon-interactive 'automatic' import.\n''filter'' determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"new"'' retrieves only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' retrieves only tiddlers that exist in both documents for which the import source tiddler is newer than the existing tiddler\n>''"updates"'' retrieves both ''new'' and ''changed'' tiddlers (this is the default action when none is specified)\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n''source'' is the location of the imported document. It can be either a local document or an URL:\n>filename is any local path/file, in whatever format your system requires\n>URL is any remote web location that starts with "http://" or "https://"\n''"quiet"'' (optional)\n>supresses all status message during the import processing (e.g., "opening local file...", "found NN tiddlers..." etc). Note that if ANY tiddlers are actualy imported, a final information message will still be displayed (along with the ImportedTiddlers report), even when 'quiet' is specified. This ensures that changes to your document cannot occur without any visible indication at all.\n''"ask"'' (optional)\n>adds interactive confirmation. A browser message box (OK/Cancel) is displayed for each tiddler that will be imported, so that you can manually bypass any tiddlers that you do not want to import.\n\n''Special tag values: importReplace and importPublic''\n\nBy adding these special tags to an existing tiddler, you can precisely control whether or not to allow updates to that tiddler as well as decide which tiddlers in your document can be automatically imported by others.\n*''For maximum safety, the default action is to prevent existing tiddlers from being unintentionally overwritten by incoming tiddlers.'' To allow an existing tiddler to be overwritten by an imported tiddler, you must tag the existing tiddler with ''<<tag importReplace>>''\n*''For maximum privacy, the default action for //outgoing// tiddlers is to NOT automatically share your tiddlers with others.'' To allow a tiddler in your document to be shared via auto-import actions by others, you must tag it with ''<<tag importPublic>>''\n//Note: these tags are only applied when using the auto-import processing. When using the interactive control panel, all tiddlers in the imported document are available in the listbox, regardless of their tag values.//\n<<<\n!!!!!Interactive Usage\n<<<\nWhen used interactively, a control panel is displayed consisting of an "import source document" filename input (text field plus a ''[Browse...]'' button), a listbox of available tiddlers, a "differences only" checkbox, an "add tags" input field and four push buttons: ''[open]'', ''[select all]'', ''[import]'' and ''[close]''.\n\nPress ''[browse]'' to select a TiddlyWiki document file to import. You can also type in the path/filename or a remote document URL (starting with http://)and press ''[open]''. //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//\n\nSelect one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items). You can press ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time. When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.\n\n''select: all, new, changes, or differences''\n\nYou can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:\n>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document\n>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)\n\n''Import Tagging:''\n\nTiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document. New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.\n\n''Skip, Rename, Merge, or Replace:''\n\nWhen importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.\n\nTo bypass importing this tiddler, press ''[skip]''. To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.\n\n//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//\n\n''Import Report History''\n\nWhen tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.\n\nWhen the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.\n\nIf a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.\n\nNote: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.\n\n<<<\n!!!!!Installation\n<<<\ncopy/paste the following tiddlers into your document:\n''ImportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < ImportTiddlers > >" macro^^\n\n''Quick Installation Tip #1:''\nIf you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.\n<<<\n!!!!!Revision History\n<<<\n''2006.02.17 [2.6.0]''\nRemoved "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.\n''2006.02.16 [2.5.4]''\nadded checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.\n''2006.02.14 [2.5.3]''\nFF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]''\ncorrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]''\nmoved globals from window.* to config.macros.importTiddlers.* to avoid FireFox crash bug when referencing globals\n''2006.01.18 [2.5.0]''\nadded checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.\n''2006.01.15 [2.4.1]''\nadded "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]''\nAdded support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.\n''2006.01.15 [2.3.2]''\nAdded "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]''\nStrip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.\n''2006.01.12 [2.3.0]''\nReorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.\n''2006.01.11 [2.2.0]''\nAdded "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]''\nWhen a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.\n''2006.01.08 [2.1.0]''\nIMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.\n''2006.01.06 [2.0.2]''\nWhen refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.\n''2006.01.04 [2.0.1]''\nWhen "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.\n''2005.12.27 [2.0.0]''\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.22 [1.3.1]''\ntweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]''\nDynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)\n''2005.11.29 [1.2.1]''\nfixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]''\nadded 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]''\nonly load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.\n''2005.10.25 [1.0.5]''\nfixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]''\ncombined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]''\nmoved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]''\ncore update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]''\nadded parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n\n// // Version\n//{{{\nversion.extensions.importTiddlers = {major: 2, minor: 6, revision: 0, date: new Date(2006,2,17)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n// // IE needs explicit global scoping for functions/vars called from browser events\n//{{{\nwindow.onClickImportButton=onClickImportButton;\nwindow.loadImportFile=loadImportFile;\nwindow.refreshImportList=refreshImportList;\n//}}}\n\n// // default cookie/option values\n//{{{\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n//}}}\n\n\n// // ''MACRO DEFINITION''\n\n//{{{\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n countMsg: "%0 tiddlers selected for import",\n src: "", // path/filename or URL of document to import\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: "", // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 8, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n index: 0, // current processing index in import list\n sort: "" // sort order for imported tiddler listbox\n};\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params) {\n // LINK WITH FLOATING PANEL\n if (!params[0]) {\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n return;\n }\n // INLINE TIDDLER CONTENT\n if (params[0]=="inline") {\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n return;\n }\n // NON-INTERACTIVE BATCH MODE\n switch (params[0]) {\n case 'all':\n case 'new':\n case 'changes':\n case 'updates':\n var filter=params.shift();\n break;\n default:\n var filter="updates";\n break;\n } \n if (!params[0]||!params[0].length) return; // filename is required\n config.macros.importTiddlers.src=params.shift();\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="ask"); if (ask) params.shift();\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n // load storeArea from a hidden IFRAME, then apply import rules and add/replace tiddlers\n loadImportFile(config.macros.importTiddlers.src,filter,quiet,ask,autoImportTiddlers);\n}\n//}}}\n\n// // ''READ TIDDLERS FROM ANOTHER DOCUMENT''\n\n//{{{\nfunction loadImportFile(src,filter,quiet,ask,callback) {\n if (!quiet) clearMessage();\n // LOCAL FILE\n if ((src.substr(0,7)!="http://")&&(src.substr(0,8)!="https://")) {\n if (!quiet) displayMessage("Opening local document: "+ src);\n var txt=loadFile(src);\n if(!txt) { if (!quiet) displayMessage("Could not open local document: "+src); }\n else {\n var s="<html><body>"+txt.substr(txt.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(txt.length+" bytes in document. ("+s.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(convertUTF8ToUnicode(s));\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n return;\n }\n // REMOTE FILE\n var x; // XML object\n try {x = new XMLHttpRequest()}\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")}\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")}\n catch (e) { return }\n }\n }\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status == 200) {\n var sa="<html><body>"+x.responseText.substr(x.responseText.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(x.responseText.length+" bytes in document. ("+sa.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(sa);\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n else\n if (!quiet) displayMessage("Could not open remote document:"+ src+" (error="+x.status+")");\n }\n }\n if (document.location.protocol=="file:") { // UniversalBrowserRead only works from a local file context\n try {netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead')}\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n if (!quiet) displayMessage("Opening remote document: "+ src);\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n x.open("GET",url,true);\n x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage("Could not open remote document: "+src);\n displayMessage(e.description?e.description:e.toString());\n }\n }\n}\n\nfunction readImportedTiddlers(txt)\n{\n var importedTiddlers = [];\n // create frame\n var f=document.getElementById("importFrame");\n if (f) document.body.removeChild(f);\n f=document.createElement("iframe");\n f.id="importFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n // get document\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n // load source into document\n d.open(); d.writeln(txt); d.close();\n // read tiddler DIVs from storeArea DOM element \n var importStore = [];\n var importStoreArea = d.getElementById("storeArea");\n if (!importStoreArea || !(importStore=importStoreArea.childNodes) || (importStore.length==0)) { return null; }\n importStoreArea.normalize();\n for(var t = 0; t < importStore.length; t++) {\n var e = importStore[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && (e.id.substr(0,5) == "store"))\n title = e.id.substr(5);\n if(title && title != "") {\n var theImported = new Tiddler();\n theImported.loadFromDiv(e,title);\n importedTiddlers.push(theImported);\n }\n }\n return importedTiddlers;\n}\n//}}}\n\n// // ''NON-INTERACTIVE IMPORT''\n\n// // import all/new/changed tiddlers into store, replacing or adding tiddlers as needed\n//{{{\nfunction autoImportTiddlers(src,filter,quiet,ask)\n{\n var count=0;\n if (config.macros.importTiddlers.inbound) for (var t=0;t<config.macros.importTiddlers.inbound.length;t++) {\n var theImported = config.macros.importTiddlers.inbound[t];\n var theExisting = store.getTiddler(theImported.title);\n\n // only import tiddlers if tagged with "importPublic"\n if (theImported.tags && theImported.tags.find("importPublic")==null)\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // never import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // check existing tiddler for importReplace, or systemConfig tags\n config.macros.importTiddlers.inbound[t].status="added"; // default - add any tiddlers not filtered out\n if (store.tiddlerExists(theImported.title)) {\n config.macros.importTiddlers.inbound[t].status="replaced";\n if (!theExisting.tags||(theExisting.tags.find("importReplace")==null))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists (use importReplace to allow changes)"; continue; }\n if ((theExisting.tags.find("systemConfig")!=null)||(theImported.tags.find("systemConfig")!=null))\n config.macros.importTiddlers.inbound[t].status+=" - WARNING: an active systemConfig plugin has been added or updated";\n }\n\n // apply the all/new/changes/updates filter \n if (filter!="all") {\n if ((filter=="new") && store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists"; continue; }\n if ((filter=="changes") && !store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - new tiddler"; continue; }\n if (store.tiddlerExists(theImported.title) && ((theExisting.modified.getTime()-theImported.modified.getTime())>=0))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler is unchanged"; continue; }\n }\n\n // get confirmation if required\n if (ask && !confirm("Import "+(theExisting?"updated":"new")+" tiddler '"+theImported.title+"'\snfrom "+src))\n { config.macros.importTiddlers.inbound[t].status="skipped - cancelled by user"; continue; }\n\n // DO THE IMPORT!!\n store.addTiddler(theImported); count++;\n }\n importReport(quiet); // generate a report (as needed) and display it if not 'quiet'\n if (count) store.setDirty(true); \n // always show final message when tiddlers were actually imported\n if (!quiet||count) displayMessage("Imported "+count+" tiddler"+(count!=1?"s":"")+" from "+src);\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n\n//{{{\nfunction importReport(quiet)\n{\n if (!config.macros.importTiddlers.inbound) return;\n // DEBUG alert('importReport: start');\n\n // if import was not completed, the Ask panel will still be open... close it now.\n var askpanel=document.getElementById('importAskPanel'); if (askpanel) askpanel.style.display='none'; \n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // gather the statistics\n var count=tiddlers.length;\n var added=0; var replaced=0; var renamed=0; var skipped=0; var merged=0;\n for (var t=0; t<count; t++)\n if (tiddlers[t].status)\n {\n if (tiddlers[t].status=='added') added++;\n if (tiddlers[t].status.substr(0,7)=='skipped') skipped++;\n if (tiddlers[t].status.substr(0,6)=='rename') renamed++;\n if (tiddlers[t].status.substr(0,7)=='replace') replaced++;\n if (tiddlers[t].status.substr(0,6)=='merged') merged++;\n }\n var omitted=count-(added+replaced+renamed+skipped+merged);\n // DEBUG alert('stats done: '+count+' total, '+added+' added, '+skipped+' skipped, '+renamed+' renamed, '+replaced+' replaced, '+merged+' merged');\n // skip the report if nothing was imported\n if (added+replaced+renamed+merged==0) return;\n // skip the report if not desired by user\n if (!config.options.chkImportReport) {\n // reset status flags\n for (var t=0; t<count; t++) config.macros.importTiddlers.inbound[t].status="";\n // refresh display since tiddlers have been imported\n store.notifyAll();\n // quick message area summary report\n var msg=(added+replaced+renamed+merged)+' of '+count+' tiddler'+((count!=1)?'s':"");\n msg+=' imported from '+config.macros.importTiddlers.src.replace(/\s\s/g,'/')\n displayMessage(msg);\n return;\n }\n // create the report tiddler (if not already present)\n var tiddler = store.getTiddler('ImportedTiddlers');\n if (!tiddler) // create new report tiddler if it doesn't exist\n {\n tiddler = new Tiddler();\n tiddler.title = 'ImportedTiddlers';\n tiddler.text = "";\n }\n // format the report header\n var now = new Date();\n var newText = "";\n newText += "On "+now.toLocaleString()+", "+config.options.txtUserName+" imported tiddlers from\sn";\n newText += "[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n newText += "<"+"<"+"<\sn";\n newText += "Out of "+count+" tiddler"+((count!=1)?"s ":" ")+" in {{{"+config.macros.importTiddlers.src.replace(/\s\s/g,'/')+"}}}:\sn";\n if (added+renamed>0)\n newText += (added+renamed)+" new tiddler"+(((added+renamed)!=1)?"s were":" was")+" added to your document.\sn";\n if (merged>0)\n newText += merged+" tiddler"+((merged!=1)?"s were":" was")+" merged with "+((merged!=1)?"":"an ")+"existing tiddler"+((merged!=1)?"s":"")+".\sn"; \n if (replaced>0)\n newText += replaced+" existing tiddler"+((replaced!=1)?"s were":" was")+" replaced.\sn"; \n if (skipped>0)\n newText += skipped+" tiddler"+((skipped!=1)?"s were":" was")+" skipped after asking.\sn"; \n if (omitted>0)\n newText += omitted+" tiddler"+((omitted!=1)?"s":"")+((omitted!=1)?" were":" was")+" not imported.\sn";\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newText += "imported tiddlers were tagged with: \s""+config.macros.importTiddlers.newTags+"\s"\sn";\n // output the tiddler detail and reset status flags\n for (var t=0; t<count; t++)\n if (tiddlers[t].status!="")\n {\n newText += "#["+"["+tiddlers[t].title+"]"+"]";\n newText += ((tiddlers[t].status!="added")?("^^\sn"+tiddlers[t].status+"^^"):"")+"\sn";\n config.macros.importTiddlers.inbound[t].status="";\n }\n newText += "<"+"<"+"<\sn";\n // output 'discard report' link\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+tiddler.title+"'); store.deleteTiddler('"+tiddler.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n tiddler.text = newText+((tiddler.text!="")?'\sn----\sn':"")+tiddler.text;\n tiddler.modifier = config.options.txtUserName;\n tiddler.modified = new Date();\n store.addTiddler(tiddler);\n if (!quiet) story.displayTiddler(null,"ImportedTiddlers",1,null,null,false);\n story.refreshTiddler("ImportedTiddlers",1,true);\n // refresh the display\n store.notifyAll();\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\n\n// // Handle link click to create/show/hide control panel\n//{{{\nfunction onClickImportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("importPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createImportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // Create control panel: HTML, CSS, register for notification\n//{{{\nfunction createImportPanel(place) {\n var panel=document.getElementById("importPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.importTiddlers.css,"importTiddlers");\n panel=createTiddlyElement(place,"span","importPanel",null,null)\n panel.innerHTML=config.macros.importTiddlers.html;\n store.addNotification(null,refreshImportList); // refresh listbox after every tiddler change\n refreshImportList();\n return panel;\n}\n//}}}\n\n// // CSS\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n padding: 0.5em; margin:0em; text-align:left; font-size: 8pt;\s\n background-color: #eee; color:#000000; \s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px; -moz-border-radius:1em;\s\n}\s\n#importPanel a { color:#009; }\s\n#importPanel input { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel select { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#importAskPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML\n//{{{\nconfig.macros.importTiddlers.html = '\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n import from source document\s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <input type=checkbox id="chkImportReport" checked style="height:1em; width:auto"\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;">create a report\s\n</span>\s\n<input type="file" id="fileImportSource" size=56\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n select:\s\n <a href="JavaScript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n &nbsp;added&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been updated in source document">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been added or are different from existing tiddlers">\s\n &nbsp;differences&nbsp;</a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <a href="JavaScript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n &nbsp;=&nbsp;</a>\s\n</span>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<input type=checkbox id="chkAddTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox id="chkImportTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox id="chkKeepTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags\s\n<input type=text id="txtNewTags" size=15 onKeyUp="config.macros.importTiddlers.newTags=this.value" autocomplete=off>\s\n<div align=center>\s\n <input type=button id="importOpen" class="importButton" style="width:32%" value="open"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importAskPanel">\s\n tiddler already exists:\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n <div align=center>\s\n <input type=button id="importSkip" class="importButton" style="width:23%" value="skip"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // refresh listbox\n//{{{\nfunction refreshImportList(selectedIndex)\n{\n var theList = document.getElementById("importList");\n if (!theList) return;\n // if nothing to show, reset list content and size\n if (!config.macros.importTiddlers.inbound) \n {\n while (theList.length > 0) { theList.options[0] = null; }\n theList.options[0]=new Option('please open a document...',"",false,false);\n theList.size=config.macros.importTiddlers.listsize;\n return;\n }\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) config.macros.importTiddlers.sort='title'; // heading\n if (selectedIndex==1) config.macros.importTiddlers.sort='title';\n if (selectedIndex==2) config.macros.importTiddlers.sort='modified';\n if (selectedIndex==3) config.macros.importTiddlers.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < theList.options.length; t++) count+=(theList.options[t].selected&&theList.options[t].value!="")?1:0;\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n return; // no refresh needed\n }\n\n // get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)\n var tiddlers=config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=new Option(tiddlers.length+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="title" )?">":indent)+' [by title]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="modified")?">":indent)+' [by date]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="tags")?">":indent)+' [by tags]',"",false,false);\n // output the tiddler list\n switch(config.macros.importTiddlers.sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n if (theList.size<config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;\n if (theList.size>theList.options.length) theList.size=theList.options.length;\n}\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(which.id);\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theAskPanel = document.getElementById('importAskPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'fileImportSource':\n case 'importOpen': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (config.macros.importTiddlers.src=="") break;\n // Load document into hidden iframe so we can read it's DOM and fill the list\n loadImportFile(config.macros.importTiddlers.src,"all",null,null,function(src,filter,quiet,ask){window.refreshImportList(0);});\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value==""||!store.tiddlerExists(theList.options[t].value)) continue;\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified>0); // updated tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importToggleFilter': // show/hide filter\n case 'importFilter': // apply filter\n alert("coming soon!");\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.index=0;\n config.macros.importTiddlers.index=importTiddlers(0);\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!config.macros.importTiddlers.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: [['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (theList.options.length==1) break;\n theList.size-=(theList.size>5)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (theList.options.length==1) break;\n theList.size+=(theList.size<theList.options.length)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (theList.options.length==1) break;\n theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;\n break;\n }\n}\n//}}}\n\n// // re-entrant processing for handling import with interactive collision prompting\n//{{{\nfunction importTiddlers(startIndex)\n{\n if (!config.macros.importTiddlers.inbound) return -1;\n\n var theList = document.getElementById('importList');\n if (!theList) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<config.macros.importTiddlers.inbound.length;t++)\n config.macros.importTiddlers.inbound[t].status="";\n for (var i=startIndex; i<theList.options.length; i++)\n {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!theList.options[i].selected) || ((t=theList.options[i].value)==""))\n continue;\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==t) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theImported.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (theImported.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (theImported.status.substr(0,7)!="replace") && (theImported.status.substr(0,5)!="merge"))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = "";\n if (config.macros.importTiddlers.importTags)\n newTags+=theImported.getTags() // import remote tags\n if (config.macros.importTiddlers.keepTags && theExisting)\n newTags+=" "+theExisting.getTags(); // keep existing tags\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newTags+=" "+config.macros.importTiddlers.newTags; // add new tags\n theImported.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n theImported.status=(theImported.status=="")?'added':theImported.status;\n // do the import!\n store.addTiddler(theImported);\n store.setDirty(true);\n }\n return(-1); // signals that we really finished the entire list\n}\n//}}}\n\n//{{{\nfunction importStopped()\n{\n var theList = document.getElementById('importList');\n var theNewTitle = document.getElementById('importNewTitle');\n if (!theList) return;\n if (config.macros.importTiddlers.index==-1)\n importReport(); // import finished... generate the report\n else\n {\n // DEBUG alert('import stopped at: '+config.macros.importTiddlers.index);\n // import collision... show the ask panel and set the title edit field\n document.getElementById('importAskPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n
IndexCards, IndexCards, IndexCards.\n\nFifteen square inches (on a [[3x5]] anyway) of planning potential! \n\nAn index card is a piece of heavy paper stock, cut to a standard size and often used for recording individual items of information that can then be easily rearranged and filed. The most common size in the United States and Russia is [[3 inch by 5 inch|3x5]] (76 by 127 mm), hence the synonym 3-by-5 card. Other sizes widely available include 4 in by 6 in (102 by 152 mm), 5 in by 8 in (127 by 203 mm) and ~ISO-size A7 (74 mm by 105 mm). Cards are available ruled or blank, white or colored. Stationers also sell special divider cards with protruding tabs and a variety of cases and trays to hold the cards.\n\nBefore the days of WordProcessors and TiddlyWiki writers like VladimirNabokov could use IndexCards to create with some of the NonDestructiveEditing features (Copy, Paste, et al) that we so cheerfully take for granted.\n\nIndexCards also figure quite prominently in [[HipsterPDA]]s.
[>img[Jeremy Warmsley - Art Of Fiction|http://image.allmusic.com/00/amg/cov200/dri000/i055/i05581lpkji.jpg]]It's remarkably rare that listening to a new album doesn't instill or solicit some sense of overall emotion for me. Right now I'm really struggling to find a word which aptly describes just how I feel about [[Art Of Fiction|Jeremy Warmsley - Art Of Fiction]]. When I find it, I'm fairly certain it won't be a nice word.\n\nBut the old saw "if you can't say anything nice..." doesn't really seem to apply to a music review, a situation where I feel compelled to say //something//, at least as a public service announcement, or a stern warning to others. However, there are a few factors preventing me from getting really venomous here: he's still quite young and this //is// a debut (i.e. his output may inexplicably improve later) and I'll be forced to eat my words.\n\nOn four separate occasions, I sat down with a mug of Earl Grey and a handful of biscuits, resolutely determined to find //something// positive to say about this album. The closest I've been able to manage so far is that it's only 45 minutes long, and therefore it only wasted three hours of my life. Three hours in which I could be listening to virtually //anything// else. Oh, and I find myself really drawn to the final track (humorously titled "Hush"), because it means the albums almost over.\n\nThis is an album that I don't really care for. Musically, Warmsley comes across as an oddly pretentious busker with a laptop. It's eclectic and "fashionably" homespun, but in the worst possible way. He'll stumble upon something (an instrument, a melody) that seems to capture his attention for a fleeting moment, then remove that element before "old-fashioned" listeners like myself can latch on to anything remotely endearing about it. The best (and by no means wonderful or new) glitchy electronic bits are layered over more organic portions of the music with no uniform regard for melody or structure. This may be wonderfully iconoclastic somehow, but even these moments are swiftly snatched away by what seems to be an embarrassed mouse-click. Were I a doctor, I'd prescribe healthful doses of ADHD medication. Failing that, extremely strong sedatives for myself. \n\nLyrically, we're dealing with an overflowing fountain of inexplicable metaphors and rather dull descriptions of frankly uninteresting situations and social interactions. Don't let the intriguing short-story-style track titles ("The Young Man Sees The City As A Chess Board" "Jonathan And The Oak Tree") trap you, I haven't had the heart to wade any deeper into this morass and try to puzzle out the narratives. I'm also incensed by other people's attempts to compare him in any way with Scott Walker.\n\nThere's a growing movement of bedroom-studio singer-songwriters. This type of music is fairly far removed from my cup of tea (my kingdom for Production!) to begin with. This is an example of how it can go wrong, even with help. I still haven't found a word for [[Art Of Fiction|Jeremy Warmsley - Art Of Fiction]] yet, but it did miraculously manage to give me indigestion. That's a first. \n\n@@display:block;text-align:center;font-size:1.5em;One Star ([[★☆☆☆☆]]). Please don't go on to make decent music and make me feel worse about this.@@\n\n
John Sidney Blyth Barrymore (born: February 15, 1882 in Philadelphia, Pennsylvania – died :May 29, 1942 in Los Angeles, California), was an American actor.\n\nHe gained fame as a Shakespearean, lauded for his Hamlet, and was frequently regarded as the greatest actor of his generation. He was the grandfather of Drew Barrymore and brother of Lionel Barrymore and Ethel Barrymore.\n\nHe also starred in DinnerAtEight, a ClassicMovies favorite shared by [[Candace]] and [[YoursTruly|Ktrey]]. JohnBarrymore's part was that of LarryRenault, a washed-up actor who unceremoniously commits suicide by gassing himself in the hotel room he can no longer afford.\n\nIn actuality, his real-life DyingWords were "Die? I should say not, dear fellow. No Barrymore would allow such a conventional thing to happen to him." According to ErrolFlynn's memoirs, film director RaoulWalsh "borrowed" Barrymore's body after the funeral, and left his corpse propped in a chair for a drunken Flynn to discover when he returned home from The Cock and Bull Bar.
There was a time, long ago, when I journaled religiously. It was a habit that I enjoyed immensely, but sadly I've kicked it.\nSo now most memories go by unrecorded, and that's quite sad.\n<<listTags journal title #>>
For the unaware, I present: [[The Ktrey pronunciation guide | http://www.m-w.com/cgi-bin/audio.pl?tray0001.wav=tray]] [audio required].\n\nThe leading letter is somewhat superfluous and, contrary to grating public opinion, utterly silent. It is also capitalized. The outrageous origins of this VestigialCharacter may or may not prove slightly interesting to some, and as I have grown quite weary of its repetitive relation, I intend to provide it here for posterity.\n\nI developed an obscene knack for simple spelling as I approached my fourth birthday, initially puzzling out simple three letter words with a rudimentary sense of phonics instilled by my love of books and burning desire to decipher the written word therein. My father encouraged and challenged my newly discovered habit, only conceding that I had truly mastered a word when I had spelled it several times backwards without error. It would not be entirely inaccurate to suppose that my PredilectionForPalindromes are rooted in this rote ritual, my tiny brow furrowing in frustration as I attempted to ransack my frantically folding gray matter and struggle through short-term memory aerobics, only to discover delightfully that racecar spelled backwards was indeed, r-a-c-e-c-a-r.\n\nWithin months I was readily reading, eschewing the banal staples of a running Spot for a musty and pedantic incomplete set of scientific encyclopedia. I would install myself inconspicuously in the corner of our sepia striped couch, quietly reciting entries at an intermittent pace as I contorted my mouth around awkward words such as “molecule” and “agriculture.” Appreciating the wanton encouragement I received from any adult who experienced my newfound passion, I began to read with confidence to any audience that presented itself, certainly malforming my sleeping sister’s malleable infant dreams with long-winded literature-led lectures on plutonium. My endless oration no doubt bored our first household pet, Dusty the dog, to death, for after several attempts to nuzzle my hand with his wet black beaded nose; he wandered off in search of more tangible attention, eventually finding it in the form of the unforgiving bumper of a black Ford.\n\nMy introduction to the dictionary was the direct result of a particularly problematic piece in the published periodical known as “NationalGeographic.” The article revolved predictably enough around the solar system, focusing narrowly on the marvelous planet Mars and startling recent discoveries concerning its diminutive satellites. After consistent corrections on the part of a pseudo-grandfather figure known only as PaPo, I was gifted a rather cumbersome hardbound edition of Webster’s opus. I was initiated into the fascinating process of cross-referencing and began to build a backdrop of understanding for the mysterious morphemes and worrisome words that I had stumbled across sandwiched between simpler vocabularies. In an effort to train my creatively confusing phonetic tendencies I was taught how to unlock the cryptic cuneiform and cabalistic glyphs of the pronunciation keys.\n\nDespite my diligent improvement in reading comprehension, I was still lacking a most crucial skill: the ability to write. My first few feeble forays into they written word consisted of several strange spiral scrawlings in crayon on a few pieces of cardboard. Rapidly approaching my kindergarten enrollment, I redoubled my efforts to scribe, producing seamless strings of unintelligible script, with a few odd pictograms and hieroglyphic uncials tossed in for good measure. I understood the formation of sentences, and strove to duplicate the structure somewhat, haphazardly placing spacing and including some promiscuous punctuation. For my fifth birthday, alongside a brontosaurus birthday cake, I received several pads of wide-lined handwriting paper, and promptly filled them with my own vulgar Voynich. I found the process of reproducing capitals incredibly time consuming and tedious, each letter became it’s own artistic endeavor as I painstakingly reproduced the thickness of each line, planning each mark carefully and deliberately. The upper-case alphabet alone took the better part of a day.\n\nOnce I began to attend kindergarten, my problems magnified exponentially, while I briefly dazzled my teacher with my unusually large vocabulary and demonstrated a remarkable eagerness to peruse the sparsely populated bookshelf and read instead of napping, I was still months behind in the PenManship department, and I absolutely refused to learn.\n\nPerhaps my fascination with antique writing machines and ManualTypewriters stems from the long months spent attempting to overcome this handicap. I would later discover that part of the problem was a degree of confusion surrounding my dominant hand. I attempted to mimic the seemingly fluid and effortless strokes of the chalk-wielding teacher with my right hand, and was assumed to be right-handed. Sadly this was not the case, for a battery of tests indicated that I favored my left. It was eventually determined that I was ambidextrous, a trait that most people would give their right arm to possess. With my right hand, my handwriting attempts were atrocious. With the left, my efforts were too deliberate and time-consuming to be considered feasible. Discouraged by my lack of progress, I promptly devoted all of my time to reading and a small degree of notation in my own schizophrenic shorthand.\n\nOne letter I had managed to master however was the letter “K.” The single vertical stroke downward was easily accomplished, and when assisted by gravity on our tilted tablets, it was often extremely straight. A right angle placed with the vertex jutting against the center of the premier line completed the character. I was quite proud of my uniform and consistent Ks, using them at every available opportunity by beginning every word of every composition with my best letter:\n\nKthe Kcat Kran Kacross Kthe Kroof.\n\nMy egregious usage of my new favorite letter alarmed my handwriting instructor, who saw it’s flagrant abuse as an obvious sign of some hereto-unknown learning disability. I was sent through another amusing series of cognitive and creative tests, only to score admirably. This served only to frustrate the teacher further, and in an attempt to explain the gravity of the situation to my mother, she called for a parent-teacher conference.\n\nThe conference was a somber affair, I was banished to a beanbag chair and a wonderfully illustrated book about ScandinavianTrolls. My mother arrived with my toddler sister in tow. She was a bit agitated at the hasty presumptions of the teacher, and impatient to get home after a long day at work. When the teacher confronted her with the evidence of my “problem,” my mother merely chalked it up to my impish creativity. This frustrated an already flustered instructor, who brashly played her trump card:\n\n“Look here, he doesn’t even know how to spell his name!” she spat, flinging several sheets of my assignments across the table.\n\nMy mother replied calmly, “How does he spell it?”\n\n“~K-T-R-E-Y!” intoned my soon to be former teacher.\n\n“Well then, that’s how it’s spelled. Now if you’ll excuse me, I have more important people to attend to.”\n\nMy mother retrieved my sister from a pile of primary colored wooden blocks nearby, and hoisted me by the hand from my amorphous throne. I was led out of the room giggling maniacally.\n\n
[<img[Lambchop - Damaged|http://image.allmusic.com/00/amg/cov200/drh400/h432/h43282jdmsg.jpg]]It really is a shame that I insist on refraining from listing my [[Best Of|Best Of 2006]]s in order of just how "Best" they really are. If I did, I can almost guarantee that Lambchop's [[Damaged|Lambchop - Damaged]] would steal the number one spot, and I may violate the cardinal principles of MicroContent describing why. \n\nFirstly, a bit of background: there was a moment there where we may not have even had the privilege of this album. Lambchop's only constant, creative center and frontman Kurt Wagner underwent surgery to reconstruct his jaw with bone transplanted from his hip. This and the ensuing cancer scare left many Lambchop fans wondering if the masterful Aw Cmon/No You Cmon would be Lambchop's swansong.\n\nThankfully, this was not the case.\n\nWe're treated to one of the album's strongest tracks from the start: the initially puzzling "Paperback Bible," a song that, on the surface seemed to be a maudlin recital of a series of classified advertisements. With everything from puppies to prom dresses up for grabs, the song is simultaneously humorous and touching. The trickling piano embellishments only heighten the bittersweet sense of sadness that seems so out of place next to such mundane lyrics. Turns out my first guess wasn't to far off, the song is apparently an ode to "The Swap Shop" a public radio phenomenon of East Tennessee's [[WDKN|http://en.wikipedia.org/wiki/WDKN]]. For some reason, the contrast of emotions evoked by this song really do it for me. It's a winner.\n\n"Prepared" begins with a downtrodden and plodding piano that finds itself just in time for an exceptional bassline to kick in. Again Wagner's restrained (until the closer, but more on that later) delivery makes this song and the entire album ripe for relistening. I won't deign to perform any sonic psychometry on this song, there's just a vast chasm of negation in the narrative here, decorated with a beautiful and simple simile comparing a smile to a sunbeam. \n\nA certain tender softness finally creeps back into the vocals on "The Rise And Fall Of The Letter P," positioned aptly after the two songs beginning with the letter. The slide guitar also demonstrates that Lambchop hasn't strayed to far from it's alt-country appellation. The title line is especially nice.\n\nSparkling like its missing namesake in the sun, the music behind "A Day Without Glasses" does a wonderful job of reconstructing the situation. Lyrically, the song seems almost apologetic, but it's over and "Beers Before The Barbican" (with it's wonderful horn section, one that recalls Thriller's "You're Fucking Sunny Day") is beginning before we've gathered our bearings. "Beers" is one of many Lambchop song titles that almost seem to be intentionally constructed to be intensely intriguing, and it certainly doesn't disappoint. \n\n"I Would Have Waited All Day" was apparently written for Candi Staton. Sung from the perspective of a housewife, it succeeds in cynically depicting her daily ennui and mindset. [[Candace]] recently had me read "The Feminine Mystique" and the "Problem Without A Name" is poignantly painted here. But the beautiful banality is far from boring: the narrative is deliciously synchronous. Featuring the line "There’s a righteous piece of cheese," "Crackers" isn't, and "Fear" begins to touch on the sense of mortality that must have haunted Wagner prior to this album. The melodic "Short" encapsulates a relationship turning sour, but is quick to advise us that the story isn' t quite over yet.\n\nThe cathartic closer anthem simply has to be heard to believed. Suffice to say it namechecks Wagner's previous success with How I Quite Smoking, Pitchfork, and Jim Neighbors. Peppered with triumphant stabs at his health problems ("I still hold my hip each time I sneeze"), the lyrical delivery here makes for a fitting album ending. So many albums leave one feeling short-changed and unsatisfied today, it's good to find one that makes one feel spent and even slightly optimistic. \n\nThere's a Bonus Disc of material as well, but that'll have to wait for another day.\n\n@@display:block;text-align:center;font-size:1.5em;Five Stars, ([[★★★★★]]) if six were possible, I'd eagerly assign the extra. [[Best Of 2006]].@@\n
Compiler of the wonderful [[Left Handed Dictionary |http://www.amazon.com/exec/obidos/tg/detail/-/B000CMKEM0?v=glance]].\n\nBiographical information potentially forthcoming.
\nOkay, so I'm ashamed to admit it, but I've really been enjoying the release "Hold On Now Youngster" by Los Campesinos! It may just make my [[Best Of 2006]] album list.\n\nThere is unfortunately a dearth of information about them on the internet at present. I did manage to find the band's web presence on myspace.\n\nLinks:\n*[[Los Camesinos! on Myspace | http://www.myspace.com/loscampesinos]]\n*[[Listen to the song "You! Me! Dancing!" by Los Camesinos! (courtesy of S K A T T E R B R A I N) | http://blownbythewind.blogspot.com/2006/07/los-campesinos-you-me-dancing.html]]\n*[[Death to Los Camesinos! | http://www.ezarchive.com/eddie/AlbumSpace/7VED661O1I/_zid-1468632/_open-/Los_Campesinos!_-_Death_To_Los_Campesinos.mp3]]\n\n<<deliciousPlayTagger>>
[<img[Luomo - Paper Tigers|http://image.allmusic.com/00/amg/cov200/drh900/h968/h96865o0dkv.jpg]]Let me preface this review by stating for the record that I've been rotating a whole lot of electronica this year, mainly out of a half-hearted attempt to rediscover a genre that's been conspicuously absent from my previous lists. You see, I used to really enjoy electronica, and still love mixing it, but without any real opportunities to DJ lately, I'm forced to keep any gems I stumble across to myself.\n\nSpeaking of gems, Luomo's Vocalcity (reissued last year on his own Huume label) is what first drew me to this Finnish musician with too many pseudonyms to list. For sanity's sake, I'll try to refrain from referring to Sistol, Conoco, Uusitalo, or Vladislav Delay in this review and speak only of Luomo. Those electronica artists love their side-projects.\n\nLuomo is apparently a pioneer in yet another new sub-genre of electronic music, aptly dubbed (pun intended) Microhouse. A pleasing appellation that conjures a much more accessible version of the almighty [[Brian Eno]]'s work on the Windows 95 start up sound. [[Constrained writing|Constrained Writing]] is one of my personal passions, and the concept of constrained composition is doubly so. But back to our sheep: \n\n[[Paper Tigers|Luomo - Paper Tigers]] didn't really offer much on the initial listen. Collaborator Johanna Iivanainen's breathy, clipped and chopped voice was a welcome departure from some of the more conventional trip-hop I've been spinning lately. The vocals here are treated as another instrument, something to be looped and painstakingly sequenced, cut up into tiny phrases and layered on top of the warm basslines and constant clicks and cuts of the music. It's refreshing to know that the composer has been given room to breathe here, and the outcome makes for some surprisingly palatable departures from the traditional chorus/verse structure, without completely alienating the hooks that seem to abound here. \n\nUpon repeat listens, an unmistakably organic sentiment pervades the entire album, creating (though not for the first time) some sort of soulful kind of glitch. There are some pretty accessible echoes of R&B here, peeking out periodically from behind the doorways of lovingly mutilated dub. Most of the characteristic starts, stops, and stylistic shifts appear mid-track though, so don't be surprised if you have a difficult time assaying where tracks (and even the album for that matter) begin and end. I know I certainly did.\n\nAnd now for some track highlights, this is heavy and dark, lush electronica, more mood music than pop.:\n*Our title track and opener "Paper Tigers" does a pleasant job of setting the tone, and paints an accurate picture of the overall direction of the album. \n*Sparkling synths playfully compete with the ring-modulated and close-cropped vocals on "Really Don't Mind." Beware the barbed hooks though, they begin here and reappear throughout.\n*"Tease Is Over" seems to almost intentionally channel Portishead in places. Give it a careful listen if you disagree.\n*The conventional "Cowgirls" provides nice and easy, dub-by-numbers background music, it's interesting without being particularly compelling. A good trait in background music.\n*In "Make Believe" the vocals are masterfully manipulated with all the aplomb of a confident turntablist.\n@@display:block;text-align:center;font-size:1.5em;Hard, but I'm going to stick with four stars for now ([[★★★★☆]]), definitely a grower, and may earn the extra before the year's through.\nShame there are no Unicode half-stars.@@\n
[[Macros]] let you write tiddlers containing more exotic objects than just text. Here are some of the built-in macros (also see the GradientMacro and [[Sparklines]]):\n\nToday's date:\n{{{\n<<today>>\n}}}\nwill result in: <<today>>\n\nTag popup:\n{{{\n<<tag features>>\n}}}\nwill result in <<tag features>>\n\nNew journal entry:\n{{{\n<<newJournal "DD MMM YYYY, hh:mm">>\n}}}\nwill result in the button <<newJournal "DD MMM YYYY, hh:mm">>\nThe first parameter is DateFormatString\n\nTiddler inclusion:\n{{{\n<<tiddler MicroContent>>\n}}}\nwill insert the text of the tiddler MicroContent. //Note that there is no protection at the moment against inadvertantly setting up endless loops//\n<<tiddler MicroContent>>\n\nSlider:\n{{{\n<<slider chkTestSlider OptionsPanel options "Change TiddlyWiki advanced options">>\n}}}\nResults in this button <<slider chkTestSlider OptionsPanel options "Change TiddlyWiki advanced options">>\nThe parameters are:\n* cookie name to be used to save the state of the slider\n* name of the tiddler to include in the slider\n* title text of the slider\n* tooltip text of the slider\n
[[Welcome]] [[About Me]] [[Contact]] [[Projects]] [[Journal]]
MicroContent being a fashionable word for self-contained fragments of content that are typically smaller than entire pages. Often MicroContent is presented via some kind of aggregation that reduces the perceptual shock and resource cost of context switching (eg Blogs aggregating several entries onto a page or Flickr presenting photos in an album). This TiddlyWiki aggregates MicroContent items that called 'tiddlers' into pages that are loaded in one gulp and progressively displayed as the user clicks hypertext links to read them.
[>img[Mombojó - Homem-Espuma|http://img228.imageshack.us/img228/5088/mombojohomemespu101bacdhd5.jpg]]Preface: I don't speak Portuguese, I can only fake Portuguese. Therefore this review might find itself a little on the short-in-substance side. Apparently the title of the album translates into "Foam Man" if that helps. \n\nHere's a remarkably unhelpful Wikipedia extract:\n>Created in 2001, Mombojó is a Brazilian rock/pop band from Recife, Pernambuco. \n>The band experiments on the drums-guitar-bass formula, adding samplers, loops and psychedelia. \nIt's not often that I'm compelled to make demands on my readers, that being said: __Acquire this album immediately__ \n(No excuses, It's [[ON THEIR WEBSITE FREE!|http://www.mombojo.com.br/downloads.htm]])\n\nYes, it's that good. Doubly if you've ever found yourself enjoying Thrill Jockey bands like Tortoise. \n\nOne of the most noticeable difference between post-rockers Tortoise and Mombojó is that Mombojó just isn't as repetitive or restrained. In fact they really rock in places like the songs "Realismo Convincente" and "Desencanto."\n\nThere's a lovely spot of Astrud Gilberto/Stan Getz in the beginning of "Tempo de Carne e Osso" (Time of meat and bone, if my knowledge or Romance languages amounts to anything) but that just may be the Portuguese talking. The song quickly transforms itself into something very, very different. And different here should read "good" bordering on "great."\n\nThere's an almost Heavenly (the band, and the adjective!) moment in "Swinga" and watch your head on that Anita Ward bit in the opening of "Saborosa." Also be mindful of that neat sample (where have I heard it before?) and the robust exuberance of the second half of the track. "Saborosa" is truly full of flavor. The intro to the rather mellow "~Video-Game" is so fun it hurts, and again here the sampling really shines.\n\n"~Pàra-Quedas" really reeks of Tortoises' TNT out of the gate, but give it a chance. You see, there's this lovely bit slightly-under-a-minute-in that has me absolutely speechless (and we all know how rare that is). Awesome. Even the brooding stutter-vocal closing track "Minar" and it's meandering coffeehouse outro leaves me wanting more. Heck, I even love the album's cover artwork!\n\nSo grab a food processor and add the following ingredients: bossa nova, jazz, unpretentious progressive/post/kraut rock, samba, sampling, lounge, and surf. You'll end up with something much lumpier than the amazingly well-blended offerings on this album, and nowhere near as wonderful. The only way this album could be better is if I learned Portuguese, which I just may do.\n\nAlbums like this reaffirm my passion for music.\n\n@@display:block;text-align:center;font-size:1.5em; Cinco estrelas ([[★★★★★]])! Em minha [[lista de 2006|Best Of 2006]]!@@\n
/***\n''MoveablePanelPlugin for TiddlyWiki version 2.x''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#MoveablePanelPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nAdd move, size, max/restore mouse event handling and fold/unfold, hover/scroll, and close/dock toolbar command items to any floating panel or tiddler. (see NestedSlidersPlugin for floating panel syntax/usage).\n\n!!!!!Usage\n<<<\nsyntax: {{{<<moveablePanel>>}}}\n\nexample: //using NestedSlidersPlugin 'floating panel' syntax//\n//{{{\n+++^30em^[panel]<<moveablePanel>>this is a headline for the panel\n----\n this is a moveable floating panel\n with a few lines of text\n as an example for you to try...\n //note: this line is really long so you can see what happens to word wrapping when you re-size this panel//\n===\n//}}}\nTry it: +++^30em^[panel]<<moveablePanel>>this is a headline for the panel\n----\n this is a moveable floating panel\n with a few lines of text\n as an example for you to try...\n //note: this line is really long so you can see what happens to word wrapping when you re-size this panel//\n===\n\n\nWhen the mouse is just inside the edges of the tiddler/panel, the cursor will change to a "crossed-arrows" symbol, indicating that the panel is "moveable". Grab (click-hold) the panel anywhere in the edge area and then drag the mouse to reposition the panel.\n\nTo resize the panel, hold the ''shift'' key and then grab the panel: the cursor will change to a "double-arrow" symbol. Drag a side edge of the panel to stretch horizontally or vertically, or drag a corner of the panel to stretch in both dimensions at once.\n\nDouble-clicking anywhere in the edge area of a panel will 'maximize' it to fit the current browser window.\n\nWhen the mouse is anywhere over a panel (not just near the edge), a 'toolbar menu' appears in the ''upper right corner'', with the following command items:\n*fold/unfold: ''fold'' temporarily reduces the panel height to show just one line of text. ''unfold'' restores the panel height.\n*hover/scroll: when you scroll the browser window, the moveable panels scroll with it. ''hover'' lets you keep a panel in view, while the rest of the page content moves in the window. ''scroll'' restores the default scrolling behavior for the panel. //Note: Due to browser limitations, this feature is not currently available when using Internet Explorer (v6 or lower)... sorry.//\n*close: ''close'' hides a panel from the page display. If you have moved/resized a panel, closing it restores its default position and size.\n*dock: unlike a floating panel, a moveable //tiddler// does not "float" on the page until it has actually been moved from its default position. When moving a tiddler, the ''close'' command is replaced with ''dock'', which restores the tiddler to its default //non-floating// location on the page.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''MoveablePanelPlugin'' (tagged with <<tag systemConfig>>)\nNote: for compatibility, please also install the current version of ''NestedSlidersPlugin''.\n<<<\n!!!!!Revision History\n<<<\n''2006.05.25 [1.3.3]'' in closePanel(), use p.button.onclick() so that normal processing (updating slider button tooltip, access key, etc.) is performed\n''2006.05.11 [1.3.2]'' doc update\n''2006.05.11 [1.3.1]'' re-define all functions within moveablePanel object (eliminate global window.* function definitions (and some "leaky closures" in IE)\n''2006.05.11 [1.3.0]'' converted from inline javascript to true plugin\n''2006.05.09 [1.2.3]'' in closePanel(), set focus to sliderpanel button (if any)\n''2006.05.02 [1.2.2]'' in MoveOrSizePanel(), calculate adjustments for top and left when inside nested floating panels\n''2006.04.06 [1.2.1]'' in getPanel(), allow redefinition or bypass of "moveable" tag (changed from hard-coded "tearoff")\n''2006.03.29 [1.2.0]'' in getPanel(), require "tearoff" tag to enable floating tiddlers\n''2006.03.13 [1.1.0]'' added handling for floating tiddlers and conditional menu display\n''2006.03.06 [1.0.2]'' set move or resize cursor during mousetracking\n''2006.03.05 [1.0.1]'' use "window" vs "document.body" so mousetracking in FF doesn't drop the panel when moving too quickly\n''2006.03.04 [1.0.0]'' Initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.moveablePanel= {major: 1, minor: 3, revision: 3, date: new Date(2006,5,25)};\n//}}}\n//{{{\nconfig.macros.moveablePanel= { \n handler:\n function(place,macroName,params) {\n var p=this.getPanel(place); if (!p) return;\n\n // remember original panel event handlers, size, location, border\n if (!p.saved) p.saved= {\n mouseover: p.onmouseover,\n mouseout: p.onmouseout,\n dblclick: p.ondblclick,\n top: p.style.top,\n left: p.style.left,\n width: p.style.width,\n height: p.style.height,\n position: p.style.position,\n border: p.style.border\n };\n\n // create control menu items\n var menupos=p.className=="floatingPanel"?"float:right;":"position:absolute;right:2em;top:3em;";\n var menustyle=p.className!="floatingPanel"?'style="border:1px solid #666;background:#ccc;color:#000;padding:0px .5em;"':"";\n var html='<div style="font-size:7pt;display:none;'+menupos+'">&nbsp;';\n if (p.className=="floatingPanel")\n html+='<a href="javascript:;" title="reduce panel size" '+menustyle\n +' onclick="return config.macros.moveablePanel.foldPanel(this,event)">fold</a>&nbsp; ';\n if (!config.browser.isIE)\n html+='<a href="javascript:;" title="keep panel in view when scrolling"'+menustyle\n +' onclick="return config.macros.moveablePanel.hoverPanel(this,event)">hover</a>&nbsp; ';\n if (p.className=="floatingPanel")\n html+='<a href="javascript:;" title="close panel and reset to default size and position"'+menustyle\n +' onclick="return config.macros.moveablePanel.closePanel(this,event)">close</a>';\n else\n html+='<a href="javascript:;" title="reset panel to default size and position"'+menustyle\n +' onclick="return config.macros.moveablePanel.closePanel(this,event)">dock</a>';\n html+='</div>';\n p.menudiv=createTiddlyElement(place,"span");\n p.menudiv.innerHTML=html;\n\n // init mouse handling and tooltip\n p.title="drag edge to move, shift key=stretch, double-click=max/restore";\n p.onmouseover=function(event) {\n if (this.className=="floatingPanel"||this.style.position=="absolute"||this.style.position=="fixed") {\n if (this.className!="floatingPanel") this.style.border="1px dotted #999"; // border around tiddler\n this.menudiv.firstChild.style.display="inline";\n }\n if (this.saved.mouseover) return this.saved.mouseover(event);\n };\n p.onmouseout=function(event) {\n this.menudiv.firstChild.style.display="none";\n if (this.className!="floatingPanel") this.style.border=this.saved.border;\n if (this.saved.mouseout) return this.saved.mouseout(event);\n };\n p.ondblclick=function(event) {\n if (!config.macros.moveablePanel.maximizePanel(this,event)) return false; // processed\n return this.saved.dblclick?this.saved.dblclick(event):true;\n };\n p.onmousemove=function(event) { return config.macros.moveablePanel.setCursorPanel(this,event); };\n p.onmousedown=function(event) { return config.macros.moveablePanel.moveOrSizePanel(this,event); };\n },\n\n getPanel:\n function(place) {\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode; if (p) return p; // floatingPanel\n p=story.findContainingTiddler(place); if (!p || !store.getTiddler(p.getAttribute("tiddler"))) return null; // not in a tiddler\n\n // moveable **tiddlers** in IE have LOTS of problems... DISABLED FOR NOW... but floating panels still work in IE\n if (config.browser.isIE) return null;\n\n // tiddlers tagged (e.g. with "moveable") to allow movement? use null or "" to bypass tag check\n var tag="moveable"; if (!tag || !tag.trim().length) return p;\n return (store.getTiddler(p.getAttribute("tiddler")).tags.find(tag)!=null)?p:null; // tiddler is tagged for moving\n },\n\n processed:\n function(event) {\n event.cancelBubble=true; if (event.stopPropagation) event.stopPropagation(); return false;\n },\n\n getClientWidth:\n function() {\n if(document.width!=undefined) return document.width;\n if(document.documentElement && document.documentElement.clientWidth) return document.documentElement.clientWidth;\n if(document.body && document.body.clientWidth) return document.body.clientWidth;\n if(window.innerWidth!=undefined) return window.innerWidth;\n return 100; // should never get here\n },\n\n closePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (p.hover) this.hoverPanel(p.hoverButton,event); \n if (p.folded) this.foldPanel(p.foldButton,event); \n p.maxed=false; \n p.style.top=p.saved.top;\n p.style.left=p.saved.left;\n p.style.width=p.saved.width;\n p.style.height=p.saved.height;\n p.style.position=p.saved.position;\n if (p.button) { p.button.focus(); onClickNestedSlider({target:p.button}); } // click on slider "button" (if any) to close the panel\n return this.processed(event);\n },\n\n foldPanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (!p.foldButton) p.foldButton=place;\n if (p.folded) {\n p.style.height=p.folded_savedheight;\n p.style.overflow=p.folded_savedoverflow;\n } else {\n p.folded_savedheight=p.style.height; p.style.height="1em"; \n p.folded_savedoverflow=p.style.overflow; p.style.overflow="hidden";\n }\n p.folded=!p.folded;\n place.innerHTML=p.folded?"unfold":"fold";\n place.title=p.folded?"restore panel size":"reduce panel size";\n return this.processed(event);\n },\n\n hoverPanel:\n function(place,event) {\n if (config.browser.isIE) { return this.processed(event); } // 'fixed' position is not handled properly by IE :-(\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n if (!p.hoverButton) p.hoverButton=place;\n if (p.hover)\n p.style.position=p.hover_savedposition;\n else\n { p.hover_savedposition=p.style.position; p.style.position="fixed"; }\n p.hover=!p.hover;\n place.innerHTML=p.hover?"scroll":"hover";\n place.title=p.hover?"make panel move with page when scrolling":"keep panel in view when scrolling page";\n return this.processed(event);\n },\n\n maximizePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight))\n return true; // not near an edge... let double click bubble through\n if (p.folded) this.foldPanel(p.foldButton,event); // unfold panel first (if needed)\n if (p.maxed) {\n p.style.top=p.max_savedtop;\n p.style.left=p.max_savedleft;\n p.style.width=p.max_savedwidth;\n p.style.height=p.max_savedheight;\n p.style.position=p.max_savedposition;\n } else {\n p.max_savedwidth=p.style.width;\n p.max_savedheight=p.style.height;\n p.max_savedtop=p.style.top;\n p.max_savedleft=p.style.left;\n p.max_savedposition=p.style.position;\n // IE gets the percentage stretch wrong if floating panel is inside a table\n p.style.width=config.browser.isIE?(getClientWidth()*0.95+"px"):"95%";\n p.style.height="95%";\n p.style.top=p.style.left='1em';\n p.style.position="absolute";\n }\n p.maxed=!p.maxed;\n return this.processed(event);\n },\n\n setCursorPanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight))\n { p.style.cursor="auto"; if (!p.savedtitle) p.savedtitle=p.title; p.title=""; }\n else {\n p.style.cursor=!event.shiftKey?"move":((isTop?'n':(isBottom?'s':''))+(isLeft?'w':(isRight?'e':''))+'-resize');\n if (p.savedtitle) p.title=p.savedtitle;\n }\n return true; // let mouseover event bubble through\n },\n\n moveOrSizePanel:\n function(place,event) {\n if (!event) var event=window.event;\n var p=this.getPanel(place); if (!p) return true;\n var left=findPosX(p); var top=findPosY(p);\n var width=p.offsetWidth; var height=p.offsetHeight;\n var x=!config.browser.isIE?event.pageX:event.clientX;\n var y=!config.browser.isIE?event.pageY:event.clientY;\n if (x<left||x>=left+width||y<top||y>=top+height) return true; // not inside panel, let mousedown bubble through\n var edgeWidth=10; var edgeHeight=10;\n var isTop=(y-top<edgeHeight);\n var isLeft=(x-left<edgeWidth);\n var isBottom=(top+height-y<edgeHeight);\n var isRight=(left+width-x<edgeWidth);\n if (!(isTop||isLeft||isBottom||isRight)) return true; // not near an edge... let mousedown bubble through\n \n // when resizing, change cursor to show directional (NSEW) "drag arrows"\n var sizing=event.shiftKey; // remember this for use during mousemove tracking\n if (sizing) p.style.cursor=((isTop?'n':(isBottom?'s':''))+(isLeft?'w':(isRight?'e':''))+'-resize');\n \n var adjustLeft=0; var adjustTop=0;\n var pp=p.parentNode; while (pp && pp.className!="floatingPanel") pp=pp.parentNode;\n if (pp) { adjustLeft=findPosX(pp); adjustTop=findPosY(pp); }\n \n // start tracking mousemove events\n config.macros.moveablePanel.activepanel=p;\n var target=p; // if 'capture' handling not supported, track within panel only\n if (document.body.setCapture) { document.body.setCapture(); var target=document.body; } // IE\n if (window.captureEvents) { window.captureEvents(Event.MouseMove|Event.MouseUp,true); var target=window; } // moz\n if (target.onmousemove!=undefined) target.saved_mousemove=target.onmousemove;\n target.onmousemove=function(e){\n if (!e) var e=window.event;\n var p=config.macros.moveablePanel.activepanel;\n if (!p) { this.onmousemove=this.saved_mousemove?this.saved_mousemove:null; return; }\n \n // PROBLEM: p.offsetWidth and p.offsetHeight do not seem to account for padding or borders\n // WORKAROUND: subtract padding and border (in px) when calculating new panel width and height\n // TBD: get these values from p.style... convert to px as needed.\n var paddingWidth=10.6667; var paddingHeight=10.6667;\n var borderWidth=1; var borderHeight=1;\n var adjustWidth=-(paddingWidth*2+borderWidth*2);\n var adjustHeight=-(paddingHeight*2+borderHeight*2);\n \n if (p.style.position!="absolute") { // convert relative DIV to movable absolute DIV\n p.style.position="absolute";\n p.style.left=left+"px"; p.style.top=top+"px";\n p.style.width=(width+adjustWidth)+"px"; p.style.top=(height+adjustHeight)+"px";\n }\n var newX=!config.browser.isIE?e.pageX:e.clientX;\n var newY=!config.browser.isIE?e.pageY:e.clientY;\n if (sizing) { // resize panel\n // don't let panel get smaller than edge "grab" zones\n var minWidth=edgeWidth*2-adjustWidth;\n var minHeight=edgeHeight*2-adjustHeight;\n p.maxed=false; // make sure panel is not maximized\n if (p.folded) this.foldPanel(p.foldButton,e); // make sure panel is unfolded\n if (isBottom) var newHeight=height+newY-y+1;\n if (isTop) var newHeight=height-newY+y+1;\n if (isLeft) var newWidth=width-newX+x+1;\n if (isRight) var newWidth=width+newX-x+1;\n if (isLeft||isRight) p.style.width=(newWidth>minWidth?newWidth:minWidth)+adjustWidth+"px";\n if (isLeft) p.style.left=left-adjustLeft+newX-x+1+"px";\n if (isTop||isBottom) p.style.height=(newHeight>minHeight?newHeight:minHeight)+adjustHeight+"px";\n if (isTop) p.style.top=top-adjustTop+newY-y+1+"px";\n } else { // move panel\n p.style.top=top-adjustTop+newY-y+1+"px";\n p.style.left=left-adjustLeft+newX-x+1+"px";\n }\n var status=sizing?("size: "+p.style.width+","+p.style.height):("pos: "+p.style.left+","+p.style.top);\n window.status=status.replace(/(\s.[0-9]+)|px/g,""); // remove decimals and "px"\n return config.macros.moveablePanel.processed(e);\n };\n \n // stop tracking mousemove events\n if (target.onmouseup!=undefined) target.saved_mouseup=target.onmouseup;\n target.onmouseup=function(e){\n if (!e) var e=window.event;\n if (this.releaseCapture) this.releaseCapture(); // IE\n if (this.releaseEvents) this.releaseEvents(Event.MouseMove|Event.MouseUp); // moz\n this.onmousemove=this.saved_mousemove?this.saved_mousemove:null;\n this.onmouseup=this.saved_mouseup?this.saved_mouseup:null;\n config.macros.moveablePanel.activepanel=null;\n window.status="";\n return config.macros.moveablePanel.processed(e);\n };\n return this.processed(event); // mousedown handled\n }\n};\n//}}}
\nI love music most of the time, but I'm fickle.\n\nI love [[Earworms]].\n
/***\n''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#NestedSlidersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''\n\nYou can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n===\n++++!!!!![Usage]>\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*mouse auto rollover\n*custom class/label/tooltip/accesskey\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip]}}}>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{^width^}}} (or just {{{^}}})^^\nmakes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)^^\n* {{{*}}}^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{{{class{[label=key|tooltip]}}}}}}^^\nuses custom label/tooltip/accesskey. {{{{{class{...}}}}}}, {{{=key}}} and {{{|tooltip}}} are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, sized floater, rollover, class, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n===\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.07.28 - 2.0.0'' added custom class syntax around label/tip/key syntax: {{{{{classname{[label=key|tip]}}}}}}\n''2006.07.25 - 1.9.3'' when parsing slider, save default open/closed state in button element, then in onClickNestedSlider(), if slider state matches saved default, instead of saving cookie, delete it. Significantly reduces the 'cookie overhead' when default slider states are used.\n''2006.06.29 - 1.9.2'' in onClickNestedSlider(), when setting focus to first control, skip over type="hidden"\n''2006.06.22 - 1.9.1'' added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value\n''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label\n''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element\n''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position\n''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)\n''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox crash bug when assigning to globals\n''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin. This lets other plugins 'hijack' the function even when they are loaded first.\n''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels. While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels. Short-term workaround is to only adjust the position for 'top-level' floaters.\n''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to. Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.\n''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state\n''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\nformatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin\nmore documentation\n''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}\ntweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\ncode cleanup, added documentation\n''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\nchanged name to EasySlidersPlugin\n''2005.11.03 - 1.0.0'' initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.nestedSliders = {major: 2, minor: 0, revision: 0, date: new Date(2006,7,28)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^(?:[^\s\s^\s\s*\s\s[\s\s>]*\s\s^)?)?(\s\s*)?(?:\s\s{\s\s{([\s\sw]+[\s\ss\s\sw]*)\s\s{)?(\s\s[[^\s\s]]*\s\s])?(?:\s\s}{3})?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n // defopen=lookaheadMatch[1]\n // cookiename=lookaheadMatch[2]\n // header=lookaheadMatch[3]\n // panelwidth=lookaheadMatch[4]\n // rollover=lookaheadMatch[5]\n // class=lookaheadMatch[6]\n // label=lookaheadMatch[7]\n // blockquote=lookaheadMatch[8]\n // deferred=lookaheadMatch[9]\n\n lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey\n var show="none"; var title=">"; var tooltip="show"; var cookie=""; var key="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().slice(1,-1);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // parse custom label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[7]) {\n title = lookaheadMatch[7].trim().slice(1,-1);\n var pos=title.indexOf("|");\n if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }\n if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }\n if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);\n\n // set extra button attributes\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)\n btn.keyparam=key; // save the access key letter ("" if none)\n if (key.length) {\n btn.setAttribute("accessKey",key); // init access key\n btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus\n }\n\n // "non-click" MouseOver open/close slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.button = btn; // so the slider panel know which button it belongs to\n panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):""; // save requested panel size\n btn.sliderPanel=panel;\n panel.style.display = show;\n panel.style.width=panel.defaultPanelWidth;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[9]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[8]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align slider/floater position with button\n adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[8]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nwindow.onClickNestedSlider=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n // reset to default width (might have been changed via plugin code)\n theSlider.style.width=theSlider.defaultPanelWidth;\n // align slider/floater position with target button\n if (!isOpen) adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n // if showing panel, set focus to first 'focus-able' element in panel\n if (theSlider.style.display!="none") {\n var ctrls=theSlider.getElementsByTagName("*");\n for (var c=0; c<ctrls.length; c++) {\n var t=ctrls[c].tagName.toLowerCase();\n if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n if (this.sliderCookie && this.sliderCookie.length) {\n config.options[this.sliderCookie]=!isOpen;\n if (config.options[this.sliderCookie]!=this.defOpen)\n saveOptionCookie(this.sliderCookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = this.sliderCookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n}\n\n// hijack animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }\n\n// adjust panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n if (panelClass=="floatingPanel") {\n var left=0;\n var top=btn.offsetHeight; \n if (place.style.position!="relative") {\n var left=findPosX(btn);\n var top=findPosY(btn)+btn.offsetHeight;\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;\n if (p) { left-=findPosX(p); top-=findPosY(p); }\n }\n if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}
/***\n|Name|NewHereCommand|\n|Source|http://simonbaird.com/mptw/#NewHereCommand|\n|Version|1.0|\n\nCode originally by ArphenLin. Small tweak by SimonBaird\nhttp://aiddlywiki.sourceforge.net/NewHere_demo.html#NewHereCommand\nTo use this you must edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\n***/\n\n//{{{\n\nconfig.commands.newHere = {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\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");\n return false;\n }\n }\n};\n\n//}}}
The hobbled and hacked style sheet and heavy-handed design for this particular TiddlySpot TiddlyWiki is being done on a [[Windows XP]] machine using [[Firefox 2.0]].\nIt may look quite horrible when viewed with the [[Internet Explorer]] browser, but frankly I can't be bothered to hack this into cross-platform compatibility.\nIt's not you, it's me.
<!---\nI've just tweaked my gradient colours and the topMenu bit. See HorizontalMainMenu.\nAlso made MainMenu and PageFooter editable on a double click.\n--->\n<!--{{{-->\n<div class='header' macro='gradient vert #337788 #666'>\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 id='topMenu' ondblclick="story.displayTiddler(null,'MainMenu', DEFAULT_EDIT_TEMPLATE)" refresh='content' tiddler='MainMenu'></div>\n</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 id='pageFooter' ondblclick="story.displayTiddler(null,'PageFooter', DEFAULT_EDIT_TEMPLATE)" refresh='content' tiddler='PageFooter'></div>\n</div>\n<!--}}}-->\n
~~\n+++^50em^[1]<<moveablePanel>>//...footnotes are fun.//\n----\n<<tiddler Welcome>>\n===\n~~
Here's a somewhat current image of my handwriting:\n<html><a href="http://www.flickr.com/photos/ktrey/101990890/" title="Photo Sharing"><img src="http://static.flickr.com/26/101990890_1df60a1b93.jpg" width="500" height="260" \nalt="Handwriting 1" /></a></html>
[[Plugins]] are just tiddlers containing JavaScript code that is tagged with <<tag systemConfig>> (see [[TiddlyWiki/Dev]] for information on writing your own plugins). TiddlyWiki executes any [[Plugins]] as it loads; they can add [[Macros]] or otherwise extend and enhance the base code.
*[[2006 Ratings]] (and an eventual [[Best Of 2006]])
When all else fails, play dead.\n\nI have had too many blogs, online journals, and neglected web presences to count.
/***\n| Name:|QuickOpenTagPlugin|\n| Purpose:|Makes tag links into a Taggly style open tag plus a normal style drop down menu|\n| Creator:|SimonBaird|\n| Source:|http://simonbaird.com/mptw/#QuickOpenTagPlugin|\n| Requires:|TW 2.x|\n| Version|1.1 (7-Feb-06)|\n\n!History\n* Version 1.1 (07/02/2006)\n** Fix Firefox crashes\n** Updated by ~BidiX[at]~BidiX.info\n* Version 1.0 (?/01/2006)\n** First release\n\n***/\n//{{{\n\n//⊻ ⊽ ⋁ ▼ \n\nwindow.createTagButton_orig_mptw = createTagButton;\nwindow.createTagButton = function(place,tag,excludeTiddler) {\n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyLink(sp,tag,true,"button");\n var theTag = createTiddlyButton(sp,config.macros.miniTag.dropdownchar,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\nconfig.macros.miniTag = {handler: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.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n}};\n\nconfig.macros.miniTag.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\n\nconfig.macros.allTags.handler = function(place,macroName,params)\n{\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul",null,null,null);\n if(tags.length === 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++)\n {\n var theListItem =createTiddlyElement(theDateList,"li",null,null,null);\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n\n var theDropDownBtn = createTiddlyButton(theListItem," "+config.macros.miniTag.dropdownchar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n};\n\n\nsetStylesheet(\n ".quickopentag { 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 "a.miniTag {font-size:150%;}\sn"+\n "",\n"QuickOpenTagStyles");\n\n//}}}\n\n/***\n<html>&#x22bb; &#x22bd; &#x22c1; &#x25bc; &#x25be;</html>\n***/\n
//{{{\n\n// adapted from: http://www.cs.utexas.edu/~joeraii/dragn/#Draggable\n// changes by ELS:\n// * hijack refreshTiddler() instead of overridding createTiddler()\n// * find title element by className instead of elementID\n// * set cursor style via code instead of stylesheet\n// * set tooltip help text\n// * set tiddler "position:relative" when starting drag event, restore saved value when drag ends\n\n// * update 2006.08.07: use getElementsByTagName("*") to find title element, even when it is 'buried' deep in tiddler DOM elements (due to custom template usage)\n\nStory.prototype.rearrangeTiddlersHijack_refreshTiddler = Story.prototype.refreshTiddler;\nStory.prototype.refreshTiddler = function(title,template,unused1,unused2,unused3,unused4,unused5)\n{\n this.rearrangeTiddlersHijack_refreshTiddler(title,template,unused1,unused2,unused3,unused4,unused5);\n var theTiddler = document.getElementById(this.idPrefix + title); if (!theTiddler) return;\n var theHandle;\n var children=theTiddler.getElementsByTagName("*");\n for (var i=0; i<children.length; i++) if (hasClass(children[i],"title")) { theHandle=children[i]; break; }\n if (!theHandle) return theTiddler;\n\n Drag.init(theHandle, theTiddler, 0, 0, null, null);\n theHandle.style.cursor="move";\n theHandle.title="drag title to re-arrange tiddlers"\n theTiddler.onDrag = function(x,y,myElem) {\n if (this.style.position!="relative")\n { this.savedstyle=this.style.position; this.style.position="relative"; }\n y = myElem.offsetTop;\n var next = myElem.nextSibling;\n var prev = myElem.previousSibling;\n if (next && y + myElem.offsetHeight > next.offsetTop + next.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n next.parentNode.insertBefore(myElem, next.nextSibling);//elems[pos+1]);\n myElem.style["top"] = -next.offsetHeight/2+"px";\n }\n if (prev && y < prev.offsetTop + prev.offsetHeight/2) { \n myElem.parentNode.removeChild(myElem);\n prev.parentNode.insertBefore(myElem, prev);\n myElem.style["top"] = prev.offsetHeight/2+"px";\n }\n };\n theTiddler.onDragEnd = function(x,y,myElem) {\n myElem.style["top"] = "0px";\n if (this.savedstyle!=undefined)\n this.style.position=this.savedstyle;\n }\n return theTiddler;\n}\n\n/**************************************************\n * dom-drag.js\n * 09.25.2001\n * www.youngpup.net\n **************************************************\n * 10.28.2001 - fixed minor bug where events\n * sometimes fired off the handle, not the root.\n **************************************************/\n\nvar Drag = {\n obj:null,\n\n init:\n function(o, oRoot, minX, maxX, minY, maxY) {\n o.onmousedown = Drag.start;\n o.root = oRoot && oRoot != null ? oRoot : o ;\n if (isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";\n if (isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";\n o.minX = typeof minX != 'undefined' ? minX : null;\n o.minY = typeof minY != 'undefined' ? minY : null;\n o.maxX = typeof maxX != 'undefined' ? maxX : null;\n o.maxY = typeof maxY != 'undefined' ? maxY : null;\n o.root.onDragStart = new Function();\n o.root.onDragEnd = new Function();\n o.root.onDrag = new Function();\n },\n\n start:\n function(e) {\n var o = Drag.obj = this;\n e = Drag.fixE(e);\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n o.root.onDragStart(x, y, Drag.obj.root);\n o.lastMouseX = e.clientX;\n o.lastMouseY = e.clientY;\n if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;\n if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;\n if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;\n if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;\n document.onmousemove = Drag.drag;\n document.onmouseup = Drag.end;\n Drag.obj.root.style["z-index"] = "10";\n return false;\n },\n\n drag:\n function(e) {\n e = Drag.fixE(e);\n var o = Drag.obj;\n var ey = e.clientY;\n var ex = e.clientX;\n var y = parseInt(o.root.style.top);\n var x = parseInt(o.root.style.left);\n var nx, ny;\n if (o.minX != null) ex = Math.max(ex, o.minMouseX);\n if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);\n if (o.minY != null) ey = Math.max(ey, o.minMouseY);\n if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);\n nx = x + (ex - o.lastMouseX);\n ny = y + (ey - o.lastMouseY);\n Drag.obj.root.style["left"] = nx + "px";\n Drag.obj.root.style["top"] = ny + "px";\n Drag.obj.lastMouseX = ex;\n Drag.obj.lastMouseY = ey;\n Drag.obj.root.onDrag(nx, ny, Drag.obj.root);\n return false;\n },\n\n end:\n function() {\n document.onmousemove = null;\n document.onmouseup = null;\n Drag.obj.root.style["z-index"] = "0";\n Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]), Drag.obj.root);\n Drag.obj = null;\n },\n\n fixE:\n function(e) {\n if (typeof e == 'undefined') e = window.event;\n if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;\n if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;\n return e;\n }\n};\n//}}}\n
/***\n| Name:|RenameTagsPlugin|\n| Purpose:|Allows you to easily rename tags|\n| Creator:|SimonBaird|\n| Source:|http://simonbaird.com/mptw/#RenameTagsPlugin|\n| Version:|1.0.1 (5-Mar-06)|\n\n!Description\nIf you rename a tiddler/tag that is tagging other tiddlers this plugin will ask you if you want to rename the tag in each tiddler where it is used. This is essential if you use tags and ever want to rename them. To use it, open the tag you want to rename as a tiddler (it's the last option in the tag popup menu), edit it, rename it and click done. You will asked if you want to rename the tag. Click OK to rename the tag in the tiddlers that use it. Click Cancel to not rename the tag.\n\n!Example\nTry renaming [[Plugins]] or [[CSS]] on this site.\n\n!History\n* 1.0.1 (5-Mar-06) - Added feature to allow renaming of tags without side-effect of creating a tiddler\n* 1.0.0 (5-Mar-06) - First working version\n\n!Code\n***/\n//{{{\n\nversion.extensions.RenameTagsPlugin = {\n major: 1, minor: 0, revision: 0,\n date: new Date(2006,3,5),\n source: "http://simonbaird.com/mptw/#RenameTagsPlugin"\n};\n\nconfig.macros.RenameTagsPlugin = {};\nconfig.macros.RenameTagsPlugin.prompt = "Rename the tag '%0' to '%1' in %2 tidder%3?";\n\n// these are very useful, perhaps they should be in the core\nif (!store.addTag) {\n store.addTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n t.tags.push(tag);\n };\n};\n\nif (!store.removeTag) {\n store.removeTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)!=null) t.tags.splice(t.tags.find(tag),1);\n };\n};\n\nstore.saveTiddler_orig_tagrename = store.saveTiddler;\nstore.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n if (title != newTitle && this.getTaggedTiddlers(title).length > 0) {\n // then we are renaming a tag\n var tagged = this.getTaggedTiddlers(title);\n if (confirm(config.macros.RenameTagsPlugin.prompt.format([title,newTitle,tagged.length,tagged.length>1?"s":""]))) {\n for (var i=0;i<tagged.length;i++) {\n store.removeTag(tagged[i].title,title);\n store.addTag(tagged[i].title,newTitle);\n // if tiddler is visible refresh it to show updated tag\n story.refreshTiddler(tagged[i].title,false,true);\n }\n }\n if (!this.tiddlerExists(title) && newBody == "") {\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_tagrename(title,newTitle,newBody,modifier,modified,tags);\n}\n\n//}}}\n\n
I attempt to write reviews about albums that cross my path, they're not necessarily well-written or even that informative, but I've been feeling compelled to write them nonetheless.\n<<listTags Reviews title #>>I don't think I've managed to find a "voice" or "style" yet, and one can only hope that they get better with practice.\nThey are geared more to my friends than the general public, but if you find them useful then feel free to let me know.
[<img[Scanners - Violence Is Golden | http://image.allmusic.com/00/amg/cov200/drh300/h340/h34071d4337.jpg]]It really is a shame that blatantly radio friendly acts tend to suffer when it comes to my rating scale. Here we have a very solid debut from the London four-piece Scanners, released in June in the United States in a wonderful reversal of typical distribution (as of now, I don't think it's been released overseas yet). This is some seriously sleek synth-driven, top forty-friendly electro pop, and for the first several listens I couldn't quite place why I liked it so much. Sarah Daly's vocal delivery is great, even if the lyrics can be a bit cringe-worthy at times. It wasn't until I decided to sit down and give it a straight-through couple of listens that I began to hit on the barre chord it struck with me: Elastica.\n\nI miss Elastica, those darlings of a different age, back when the Brit Pop tsunami was eroding our coastline by the mile. If the inroads were strong enough for me to hear the warning sirens in Texas of all places, on our local alternative radio station no less, it had to be bad. \n\nNow, before Elastica fans rush out to get their Justine-starved paws on this release, let me take my train of thought into the station. This band reminds me of an Elastica that didn't quite exist. Imagine a much more cohesive version of "The Menace" with less Mark E. Smith and heaps more of that destined-to-sound-dated contemporary electro sound. There are quite a few moments were the resemblance rings true, but just enough others to remind the listener that this is something quite different. Less carefree, and much darker, but with an unshakable tinge of optimism that comes with careful planning. This isn't the rather abrasive bird who gets pissed on lager and tries to pick a fight with the boy she'll be shagging later, this is the pretty, quiet one in the corner with the unusual scars, who you swear has been stalking you. \n\nI can almost condone skipping the album's opener, "Joy." The guitar work on the intro is promising, but it would take a stronger man than I to get past the rather insipid lyrics. Either way, we're in for a real treat with the next track. "Lowlife" was aptly chosen as a single if I'm not mistaken and it's a great piece of pop with strong hooks. The lyrical content isn't nearly as terrible on this song, and there's a rather nice repeated motif that carries over into the next song "In My Dreams."\n\n"Changing Times" and it's appropriate title shifts the mood while still clinging to the electro formula. Here the singer's vocals seem a bit more Toni Halliday in places, but we don't completely lose the tough-girl swash until later. The climbing guitars and steady percussion combined with a slightly more playful attitude are probably some of the things that have drawn me into repeated listens to "Bombs." It certainly doesn't hurt that a little over two-minutes in, there's an anachronistic guitar hook that hearkens back to the Brit Pop heyday.\n\nThis friskiness continues in "Air 164" and "Evil Twin" is our "Indian Song" from Elastica's debut. The short "Raw" was also selected for singledom, they certainly did raid the tacklebox for all the hooks on this album. We get softer for "Look What You Started" with it's bubbling electronics. "High Flyer" is positively tinged in Country, with Ms. Daly's tough-as-nails rocker persona lovingly placed back in it's box. The hiatus isn't wholly temporary however, for the softness stays with us for the title track. Even though "Violence Is Golden" picks back up on the fashionable angst that was sprinkled so liberally throughout the album, I couldn't help finding myself wanting a little more, especially if the little more was a little more like "High Flyer." \n\n@@display:block;text-align:center;font-size:1.5em;I'm tempted to gatecrash my [[Best Of|Best Of 2006]] list and give it the full Five, and may later, but right now it stands at Four ([[★★★★☆]]).@@\n\n
[<img[Scott Walker - The Drift|http://image.allmusic.com/00/amg/cov200/drh300/h318/h31850heog3.jpg]]Finally, an easy review:\n\nListen to it. Initially, you will either give it ★☆☆☆☆ or ★★★★★.\n\nYeah, I didn't get Tilt at first either, and was so put off by it that it languished on my shelves for three years. [[The Drift|Scott Walker - The Drift]] is much more accessible than it's predecessor was to me. Probably because, after volumes of struggle, I finally made friends with Tilt. Unfamiliar with Scott Walker's recent oeuvre? Maybe that's where you should start too. Otherwise [[The Drift|Scott Walker - The Drift]] will be ejected from your CD player faster than you can say "Pee-pee soaked trousers."\n\nAnd that would be a real shame.\n\n<crickets try really hard to pronounce something that begins with //czch//>\n\nNo song-by-song summations here. I leave that as an unglamorous exercise for the reader. Enjoy, eventually.\n\n@@display:block;text-align:center;font-size:1.5em;Yeah, I was one of the ([[★★★★★]])s, and it continues to grow on me.@@\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'MMM DD YYYY'>><<saveChanges>><<upload http://ktrey.tiddlyspot.com/store.cgi index.html . . ktrey>><html><a href='http://tiddlyspot.com/download/ktrey' class='button'>download</a></html><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
/***\nThis CSS by DaveBirss.\n***/\n/*{{{*/\n\n.tabSelected {\n background: #fff;\n}\n\n.tabUnselected {\n background: #eee;\n}\n\n#sidebar {\n color: #000;\n}\n\n#sidebarOptions {\n background: #fff;\n}\n\n#sidebarOptions .button {\n color: #999;\n}\n\n#sidebarOptions .button:hover {\n color: #000;\n background: #fff;\n border-color:white;\n}\n\n#sidebarOptions .button:active {\n color: #000;\n background: #fff;\n}\n\n#sidebarOptions .sliderPanel {\n background: transparent;\n}\n\n#sidebarOptions .sliderPanel A {\n color: #999;\n}\n\n#sidebarOptions .sliderPanel A:hover {\n color: #000;\n background: #fff;\n}\n\n#sidebarOptions .sliderPanel A:active {\n color: #000;\n background: #fff;\n}\n\n.sidebarSubHeading {\n color: #000;\n}\n\n#sidebarTabs {`\n background: #fff\n}\n\n#sidebarTabs .tabSelected {\n color: #000;\n background: #fff;\n border-top: solid 1px #ccc;\n border-left: solid 1px #ccc;\n border-right: solid 1px #ccc;\n border-bottom: none;\n}\n\n#sidebarTabs .tabUnselected {\n color: #999;\n background: #eee;\n border-top: solid 1px #ccc;\n border-left: solid 1px #ccc;\n border-right: solid 1px #ccc;\n border-bottom: none;\n}\n\n#sidebarTabs .tabContents {\n background: #fff;\n}\n\n\n#sidebarTabs .txtMoreTab .tabSelected {\n background: #fff;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n background: #eee;\n}\n\n#sidebarTabs .txtMoreTab .tabContents {\n background: #fff;\n}\n\n#sidebarTabs .tabContents .tiddlyLink {\n color: #999;\n}\n\n#sidebarTabs .tabContents .tiddlyLink:hover {\n background: #fff;\n color: #000;\n}\n\n#sidebarTabs .tabContents {\n color: #000;\n}\n\n#sidebarTabs .button {\n color: #666;\n}\n\n#sidebarTabs .tabContents .button:hover {\n color: #000;\n background: #fff;\n}\n\n/*}}}*/
Wherein our protagonist ([[Ktrey]]) attempts to utilize this new-fangled TiddlyWiki nonsense by writing painfully amateurish album reviews.
"Some Songs Are Better Than Others."<html><br/></html>
[<img[Stuart A. Staples - Leaving Songs|http://image.allmusic.com/00/amg/cov200/drh300/h378/h37810wfiaq.jpg]]Stuart Ashton Staples strikes out on his own again here with [[Leaving Songs|Stuart A. Staples - Leaving Songs]]. Aided by the praiseworthy production of Lambchop's Mark Nevers, listeners familiar with his body of work will find orchestration that is slightly more minimalist than some of his lauded output with The Tindersticks, but make no mistake, the arrangements here still manage to muster an elegant and dramatic luxuriance. \n\nDistinguished by a laundry list of comparisons, Stuart A. Staples' threadbare baritone receives prominent treatment here. Resembling the best bits of Tom Waits, Leonard Cohen, or even Nick Cave, his intimate and melancholy delivery can really bewitch a listener, and I'm an easy mark for distinctive voices like this.\n\nThere's another chink in my armor, and this one's carefully shaped to accommodate duets. There are some really remarkable ones here that bring to mind that-which-really-worked-for-me in "Travelling Light" and "Buried Bones" from The Tindersticks back catalog. \n\n"Old Friends No. 1" is the first of many intimate epics, featuring a surprise reappearance of those Mariachi-esque horns that I'll never tire from. \n\nThere are so many breathtakingly poignant and dramatic moments on this album, I'm afraid I will have to refrain from a complete track synopsis until later. For now, I'll just produce a new portmanteau to sum up this album:\n\n@@display:block;text-align:center;font-size:1.5em;line-height:120%;Essensual. Essential + Sensual. Five Stars ([[★★★★★]]) , and undeniably on my [[Best Of 2006]] list.\nEven with the Gordon's Fisherman making a cameo on the cover.@@\n
/***\nCosmetic fixes that probably should be included in a future TW...\n***/\n/*{{{*/\n.viewer .listTitle { list-style-type:none; margin-left:-2em; }\n.editorFooter .button { padding-top: 0px; padding-bottom:0px; }\n/*}}}*/\n/***\nImportant stuff. See TagglyTaggingStyles and HorizontalMainMenuStyles\n***/\n/*{{{*/\n[[TagglyTaggingStyles]]\n[[HorizontalMainMenuStyles]]\n/*}}}*/\n/***\nClint's fix for weird IE behaviours\n***/\n/*{{{*/\nbody {position:static;}\n.tagClear{margin-top:1em;clear:both;}\n/*}}}*/\n/***\nJust colours, fonts, tweaks etc. See SideBarWhiteAndGrey\n***/\n/*{{{*/\nbody {background:#eee; }\na{ color: #069; }\na:hover{ background: #069; color: #fff; }\n.popup { background: #178; border: 1px solid #069; }\n.headerForeground a { color: #fff;}\n.headerShadow { left: 2px; top: 2px; }\n.title { padding:0px; margin:0px; }\n.siteSubtitle { padding:0px; margin:0px; }\n.subtitle { font-size:90%; color:#ccc; padding-left:0.25em; }\nh1,h2,h3,h4,h5 { color: #000; background: transparent; }\n.title {color:black; font-size:2em;}\n.shadow .title {color:#999; }\n.viewer pre { background-color:#f8f8ff; border-color:#ddf;}\n.viewer { padding-top:0px; }\n#sidebarOptions { border:1px #ccc solid; border-top:0px; }\n.tiddler {\n border-bottom:1px solid #ccc; border-right:1px solid #ccc; padding-bottom:1em; margin-bottom:1em; \n background:#fff; padding-right:1.5em;-moz-border-radius:1em; }\n#messageArea { background-color:#bde; border-color:#8ab; border-width:4px; border-style:dotted; font-size:90%; }\n#messageArea .button { text-decoration:none; font-weight:bold; background:transparent; border:0px; }\n#messageArea .button:hover {background: #acd; }\n[[SideBarWhiteAndGrey]]\n#adsense { margin: 1em 15.7em 0em 1em; border:1px solid #ddd; background:#f8f8f8; text-align:center;margin-bottom:1em;overflow:hidden;padding:0.5em;} \n/*}}}*/\n
/***\n!Colors Used\n*@@bgcolor(#8cf): #8cf - Background blue@@\n*@@bgcolor(#18f): #18f - Top blue@@\n*@@bgcolor(#04b): #04b - Mid blue@@\n*@@bgcolor(#014):color(#fff): #014 - Bottom blue@@\n*@@bgcolor(#ffc): #ffc - Bright yellow@@\n*@@bgcolor(#fe8): #fe8 - Highlight yellow@@\n*@@bgcolor(#db4): #db4 - Background yellow@@\n*@@bgcolor(#841): #841 - Border yellow@@\n*@@bgcolor(#703):color(#fff): #703 - Title red@@\n*@@bgcolor(#866): #866 - Subtitle grey@@\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n background: #fff;\n color: #000;\n}\n\na{\n color: #04b;\n}\n\na:hover{\n background: #04b;\n color: #fff;\n}\n\na img{\n border: 0;\n}\n\nh1,h2,h3,h4,h5 {\n color: #703;\n background: #8cf;\n}\n\n.button {\n color: #014;\n border: 1px solid #fff;\n}\n\n.button:hover {\n color: #014;\n background: #fff;\n border-color: dotted 1px #eee;\n}\n\n.button:active {\n color: #014;\n background: #fff;\n border-color: dotted 1px #eee;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n.header {\n background: #04b;\n}\n\n.headerShadow {\n color: #000;\n}\n\n.headerShadow a {\n font-weight: normal;\n color: #000;\n}\n\n.headerForeground {\n color: #fff;\n}\n\n.headerForeground a {\n font-weight: normal;\n color: #8cf;\n}\n\n/*}}}*/\n/***\n!General tabs /%=================================================%/\n***/\n/*{{{*/\n\n.tabSelected{\n color: #014;\n background: #eee;\n border-left: 1px solid #ccc;\n border-top: 1px solid #ccc;\n border-right: 1px solid #ccc;\n}\n\n.tabUnselected {\n color: #fff;\n background: #999;\n}\n\n.tabContents {\n color: #014;\n background: #eee;\n border: 1px solid #ccc;\n}\n\n.tabContents .button {\n border: 0;}\n\n/*}}}*/\n/***\n!Sidebar options /%=================================================%/\n~TiddlyLinks and buttons are treated identically in the sidebar and slider panel\n***/\n/*{{{*/\n#sidebar {\n}\n\n#sidebarOptions input {\n border: 1px solid #04b;\n}\n\n#sidebarOptions .sliderPanel {\n background: #8cf;\n}\n\n#sidebarOptions .sliderPanel a {\n border: none;\n color: #04b;\n}\n\n#sidebarOptions .sliderPanel a:hover {\n color: #fff;\n background: #04b;\n}\n\n#sidebarOptions .sliderPanel a:active {\n color: #04b;\n background: #fff;\n}\n/*}}}*/\n/***\n!Message Area /%=================================================%/\n***/\n/*{{{*/\n#messageArea {\n border: 1px solid #841;\n background: #db4;\n color: #014;\n}\n\n#messageArea .button {\n padding: 0.2em 0.2em 0.2em 0.2em;\n color: #014;\n background: #fff;\n}\n\n/*}}}*/\n/***\n!Popup /%=================================================%/\n***/\n/*{{{*/\n.popup {\n background: #18f;\n border: 1px solid #04b;\n}\n\n.popup hr {\n color: #014;\n background: #014;\n border-bottom: 1px;\n}\n\n.popup li.disabled {\n color: #04b;\n}\n\n.popup li a, .popup li a:visited {\n color: #eee;\n border: none;\n}\n\n.popup li a:hover {\n background: #014;\n color: #fff;\n border: none;\n}\n/*}}}*/\n/***\n!Tiddler Display /%=================================================%/\n***/\n/*{{{*/\n.tiddler .defaultCommand {\n font-weight: bold;\n}\n\n.shadow .title {\n color: #866;\n}\n\n.title {\n color: #703;\n}\n\n.subtitle {\n color: #866;\n}\n\n.toolbar {\n color: #04b;\n}\n\n.tagging, .tagged {\n border: 1px solid #eee;\n background-color: #eee;\n}\n\n.selected .tagging, .selected .tagged {\n background-color: #ddd;\n border: 1px solid #bbb;\n}\n\n.tagging .listTitle, .tagged .listTitle {\n color: #014;\n}\n\n.tagging .button, .tagged .button {\n border: none;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selected .footer {\n color: #888;\n}\n\n.sparkline {\n background: #8cf;\n border: 0;\n}\n\n.sparktick {\n background: #014;\n}\n\n.errorButton {\n color: #ff0;\n background: #f00;\n}\n\n.cascade {\n background: #eef;\n color: #aac;\n border: 1px solid #aac;\n}\n\n.imageLink, #displayArea .imageLink {\n background: transparent;\n}\n\n/*}}}*/\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n\n.viewer .listTitle {list-style-type: none; margin-left: -2em;}\n\n.viewer .button {\n color:#04b;\n border: 1px solid #696969;\n padding:1px;\n}\n\n.viewer blockquote {\n border-left: 3px solid #666;\n}\n\n.viewer table {\n border: 2px solid #333;\n}\n\n.viewer th, thead td {\n background: #db4;\n border: 1px solid #666;\n color: #fff;\n}\n\n.viewer td, .viewer tr {\n border: 1px solid #666;\n}\n\n.viewer pre {\n border: 1px solid #fe8;\n background: #ffc;\n}\n\n.viewer code {\n color: #703;\n}\n\n.viewer hr {\n border: 0;\n border-top: dashed 1px #666;\n color: #666;\n}\n\n.highlight, .marked {\n background: #fe8;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor input {\n border: 1px solid #04b;\n}\n\n.editor textarea {\n border: 1px solid #04b;\n width: 100%;\n}\n\n.editorFooter {\n color: #aaa;\n}\n\n/*}}}*/
/***\n!Sections in this Tiddler:\n*Generic rules\n**Links styles\n**Link Exceptions\n*Header\n*Main menu\n*Sidebar\n**Sidebar options\n**Sidebar tabs\n*Message area\n*Popup\n*Tabs\n*Tiddler display\n**Viewer\n**Editor\n*Misc. rules\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n position: relative;\n margin: 0;\n padding: 0;\n}\n\nimg { padding:.5em;padding-left:1em;padding-right:1em;}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n/*}}}*/\n/***\n''General Link Styles'' /%-----------------------------------------------------------------------------%/\n***/\n/*{{{*/\n.externalLink {\n text-decoration: underline;\n}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n/*}}}*/\n/***\n''Exceptions to common link styles'' /%------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 2em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 2em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 2em;\n}\n\n.siteSubtitle {\n font-size: 1em;\n}\n\n/*}}}*/\n/***\n!Main menu /%==================================================%/\n***/\n/*{{{*/\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n/*}}}*/\n/***\n!Sidebar rules /%==================================================%/\n***/\n/*{{{*/\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n/*}}}*/\n/***\n''Sidebar options'' /%----------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n/*}}}*/\n/***\n''Sidebar tabs'' /%-------------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n/*}}}*/\n/***\n!Message area /%==================================================%/\n***/\n/*{{{*/\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n/*}}}*/\n/***\n!Popup /%==================================================%/\n***/\n/*{{{*/\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n/*}}}*/\n/***\n!Tabs /%==================================================%/\n***/\n/*{{{*/\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n/*}}}*/\n/***\n!Tiddler display rules /%==================================================%/\n***/\n/*{{{*/\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-family:arial;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n font-family:georgia;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.2em;\n font-family:arial;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n font-family:arial;\n}\n\n/* I'm not a fan of how button looks in tiddlers... */\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.2em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1em;\n line-height: 1.2em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n/*}}}*/\n/***\n!Misc rules /%==================================================%/\n***/\n/*{{{*/\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n\n/*{{{*/\n#pageFooter {\ntext-align:center;\nmargin-top:1em;\n}\n.headerForeground {\nwidth:95%;\n}\n#topLinks {\nposition:absolute;\nright:1em;\ntext-align:right;\n}\n/*}}}*/\n\n/*}}}*/
/***\nTWkdLib consist of a set of usefull functions related to editing tiddler content.\n***/\n//{{{\nconfig.macros.twkdlib = {\nnoselection:"nothing selected",\nasktitle:"enter the new tiddler title",\nexists:" already exists, please enter another title",\naskForTagsLabel:"enter the new tiddler tags",\ntiddlercreated:" tiddler created"\n}\n//}}}\n// //set of common editing functions\n//{{{\ngetTiddlerEditField = function(title,field){\n var tiddler = document.getElementById(story.idPrefix + title);\n if(tiddler != null){\n var children = tiddler.getElementsByTagName("*")\n var e = null;\n for (var t=0; t<children.length; t++){\n var c = children[t];\n if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea"){\n if(!e) {e = c;}\n if(c.getAttribute("edit") == field){e = c;}\n }\n }\n if(e){return e;}\n }\n} // closes getTiddlerEditField function definition\n\n// get selection\ngetSelection = function(title,quiet) {\n var tiddlerTextArea = getTiddlerEditField(title,"text");\n var result = {};\n if (document.selection != null && tiddlerTextArea.selectionStart == null) {\n tiddlerTextArea.focus();\n var range = document.selection.createRange();\n var bookmark = range.getBookmark();\n var contents = tiddlerTextArea.value;\n var originalContents = contents;\n var marker = "##SELECTION_MARKER_" + Math.random() + "##";\n while(contents.indexOf(marker) != -1) {\n marker = "##SELECTION_MARKER_" + Math.random() + "##";\n }\n var selection = range.text;\n range.text = marker + range.text + marker;\n contents = tiddlerTextArea.value;\n result.start = contents.indexOf(marker);\n contents = contents.replace(marker, "");\n result.end = contents.indexOf(marker);\n tiddlerTextArea.value = originalContents;\n range.moveToBookmark(bookmark);\n range.select();\n }\n else {\n result.start=tiddlerTextArea.selectionStart;\n result.end=tiddlerTextArea.selectionEnd;\n }\n result.content=tiddlerTextArea.value.substring(result.start,result.end);\n result.source=title;\n if (!result.content&&!quiet) displayMessage(config.macros.twkdlib.noselection);\n return(result);\n}\n\n// replace selection or insert new content\nputInPlace=function(content,workplace) {\n var tiddlerText = getTiddlerEditField(workplace.source,"text");\n tiddlerText.value = tiddlerText.value.substring(0,workplace.start)+content+tiddlerText.value.substring(workplace.end);\n}\n\n// asking for title\naskForTitle = function(suggestion) {\n if (!suggestion)\n suggestion = "";\n var newtitle;\n while (!newtitle||store.tiddlerExists(newtitle))\n {\n if (store.tiddlerExists(newtitle))\n displayMessage(newtitle+config.macro.twkdlib.exists);\n newtitle = prompt(config.macros.twkdlib.asktitle,suggestion);\n if (newtitle==null)\n {\n displayMessage(config.macros.twkdlib.titlecancel);\n return(false);\n }\n }\n return(newtitle);\n}\n\n// creation of a new tiddler\nnewTWkdLibTiddler = function(title,content,from,askForTags){\n var tiddler = new Tiddler();\n tiddler.title = title;\n tiddler.modifier = config.options.txtUserName;\n tiddler.text = content;\n (from) ? tiddler.tags = [from] : tiddler.tags=[];\n if (askForTags)\n tiddler.tags = prompt(config.macros.twkdlib.askForTagsLabel,'[['+from+']]').readBracketedList();\n store.addTiddler(tiddler);\n //store.notifyAll();\n displayMessage(title+config.macros.twkdlib.tiddlercreated);\n}\n//}}}
/***\n|''Name:''|~TaggerPlugin|\n|''Version:''|1.0.1 (2006-06-01)|\n|''Source:''|http://lewcid.googlepages.com/lewcid.html/#TaggerPlugin|\n|''Author:''|SaqImtiaz|\n|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|\n|''Documentation:''|[[TaggerPluginDocumentation]]|\n|''Source Code:''|[[TaggerPluginSource]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n***/\n//{{{\n\nconfig.tagger={\n defaults:{\n label: 'Tags: ',\n tooltip: 'Manage tiddler tags',\n taglist: 'true',\n excludeTags: '',\n notags: 'tiddler has no tags',\n aretags: 'current tiddler tags:',\n toggletext: 'add tags:'\n }\n};\n\nconfig.macros.tagger={};\nconfig.macros.tagger.arrow = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\nconfig.macros.tagger.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var defaults = config.tagger.defaults;\n var nAV = paramString.parseParams('tagman', null, true);\n var label = ((nAV[0].label)&&(nAV[0].label[0])!='.')?nAV[0].label[0]+this.arrow: defaults.label+this.arrow;\n var tooltip = ((nAV[0].tooltip)&&(nAV[0].tooltip[0])!='.')?nAV[0].tooltip[0]: defaults.tooltip;\n var taglist = ((nAV[0].taglist)&&(nAV[0].taglist[0])!='.')?nAV[0].taglist[0]: defaults.taglist;\n var exclude = ((nAV[0].exclude)&&(nAV[0].exclude[0])!='.')?(nAV[0].exclude[0]).readBracketedList(): defaults.excludeTags.readBracketedList();\n if ((nAV[0].source)&&(nAV[0].source[0])!='.')var source = nAV[0].source[0];\n if (source&&!store.getTiddler(source)) return false;\n\n var onclick = function(e) {\n if (!e) var e = window.event;\n var popup = Popup.create(this);\n var tagsarray = store.getTags();\n var tags=new Array();\n\n for (var i=0; i<tagsarray.length; i++){\n tags.push(tagsarray[i][0]);}\n\n if (source)\n {var sourcetiddler=store.getTiddler(source);\n tags=sourcetiddler.tags.sort();}\n\n var currentTags = tiddler.tags.sort();\n\n var createButtons=function(text,theTag,tooltipPrefix){\n var sp = createTiddlyElement(createTiddlyElement(popup,"li"),"span",null,"tagger");\n var theToggle = createTiddlyButton(sp,text,tooltipPrefix+" '"+theTag+"'",taggerOnToggle,"button","toggleButton");\n theToggle.setAttribute("tiddler",tiddler.title);\n theToggle.setAttribute("tag",theTag);\n insertSpacer(sp);\n if (window.createTagButton_orig_mptw)\n createTagButton_orig_mptw(sp,theTag);\n else\n createTagButton(sp,theTag);\n }\n\n createTiddlyElement(popup,"li",null,"listTitle",(tiddler.tags.length == 0 ? defaults.notags : defaults.aretags));\n\n for (var t=0; t<currentTags.length; t++){\n createButtons("[x]",currentTags[t],"remove tag ");\n }\n\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n\n if (taglist!='false')\n { createTiddlyElement(popup,"li",null,"listTitle",defaults.toggletext);\n for (var i=0; i<tags.length; i++){\n if (!tiddler.tags.contains(tags[i])&&!exclude.contains(tags[i]))\n {createButtons("[ ]",tags[i],"add tag ");\n }\n }\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n }\n\n var newTagButton = createTiddlyButton(createTiddlyElement(popup,"li"),("Create new tag"),null,taggerOnToggle);\n newTagButton.setAttribute("tiddler",tiddler.title);\n if (source) newTagButton.setAttribute("source",source);\n\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n };\n\n createTiddlyButton(place,label,tooltip,onclick,"button","taggerDrpBtn");\n};\n\nwindow.taggerOnToggle = function(e) {\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n var tiddler = store.getTiddler(title);\n if (!tag)\n {\n var newtag=prompt("Enter new tag:","");\n if (newtag!=''&&newtag!=null)\n {\n var tag=newtag;\n if (this.getAttribute("source"))\n {var sourcetiddler = store.getTiddler(this.getAttribute("source"));\n sourcetiddler.tags.pushUnique(newtag);}\n }\n else\n {return false;};\n }\n if (!tiddler || !tiddler.tags)\n {store.saveTiddler(title,title,'',config.options.txtUserName,new Date(),tag);}\n else\n {if (tiddler.tags.find(tag)==null)\n {tiddler.tags.push(tag)}\n else if(!newtag)\n {tiddler.tags.splice(tiddler.tags.find(tag),1)};\n store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags);};\n story.refreshTiddler(title,null,true);\n if(config.options.chkAutoSave)\n saveChanges();\n return false;\n};\n\nsetStylesheet(\n ".tagger a.button {font-weight: bold;display:inline; padding:0px;}\sn"+\n ".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\sn"+\n "#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\sn"+\n ".popup .listTitle {color:#000;}\sn"+\n "",\n"TaggerStyles");\n\nwindow.lewcidTiddlerSwapTag = function (tiddler, oldTag, newTag){\n for (var i = 0; i < tiddler.tags.length; i++)\n if (tiddler.tags[i] == oldTag) {\n tiddler.tags[i] = newTag;\n return true;}\n return false;\n}\n\nwindow.lewcidRenameTag = function(e) {\n var tag=this.getAttribute("tag");\n var newtag=prompt("Rename tag '"+tag+"' to:",tag);\n\n if ((newtag==tag)||(newtag==null)) {return false;}\n\n if(store.tiddlerExists(newtag))\n {if(confirm(config.messages.overwriteWarning.format([newtag.toString()])))\n story.closeTiddler(newtag,false,false);\n else\n return null;}\n\n tagged=store.getTaggedTiddlers(tag);\n if (tagged.length!=0){\n for (var j = 0; j < tagged.length; j++)\n lewcidTiddlerSwapTag(tagged[j],tag,newtag);}\n\n if (store.tiddlerExists(tag))\n {store.saveTiddler(tag,newtag);}\n if (document.getElementById("tiddler"+tag))\n {var oldTagTiddler = document.getElementById(story.idPrefix + tag);\n var before= story.positionTiddler(oldTagTiddler);\n var place = document.getElementById(story.container);\n story.closeTiddler(tag,false,false);\n story.createTiddler(place,before,newtag,null);\n story.saveTiddler(newtag);}\n if(config.options.chkAutoSave)\n saveChanges();\n return false;\n}\n\n\nwindow.onClickTag=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n\n var nested = (!isNested(theTarget));\n if ((Popup.stack.length > 1)&&(nested==true)) {Popup.removeFrom(1);}\n else if(Popup.stack.length > 0 && nested==false) {Popup.removeFrom(0);};\n\n var theId = (nested==false)? "popup" : "nestedtagger";\n var popup = createTiddlyElement(document.body,"ol",theId,"popup",null);\n Popup.stack.push({root: this, popup: popup});\n\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n if(popup && tag)\n {\n var tagged = store.getTaggedTiddlers(tag);\n var titles = [];\n var li,r;\n for(r=0;r<tagged.length;r++)\n if(tagged[r].title != title)\n titles.push(tagged[r].title);\n var lingo = config.views.wikified.tag;\n if(titles.length > 0)\n {\n var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);\n openAll.setAttribute("tag",tag);\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n for(r=0; r<titles.length; r++)\n {\n createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);\n }\n }\n else\n createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);\n createTiddlyText(h,lingo.openTag.format([tag]));\n\n createTiddlyElement(createTiddlyElement(popup,"li"),"hr");\n\n var renameTagButton = createTiddlyButton(createTiddlyElement(popup,"li"),("Rename tag '"+tag+"'"),null,lewcidRenameTag);\n renameTagButton.setAttribute("tag",tag)\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n\nif (!window.isNested)\n window.isNested = function(e) {\n while (e != null) {\n var contentWrapper = document.getElementById("contentWrapper");\n if (contentWrapper == e) return true;\n e = e.parentNode;\n }\n return false;\n };\n\nconfig.shadowTiddlers.TaggerPluginDocumentation="The documentation is available [[here.|http://lewcid.googlepages.com/lewcid.html#TaggerPluginDocumentation]]";\n\nconfig.shadowTiddlers.TaggerPluginSource="The uncompressed source code is available [[here.|http://lewcid.googlepages.com/lewcid.html#TaggerPluginSource]]";\n//}}}
/***\n|Name|TagglyListPlugin|\n|Created by|SimonBaird|\n|Location|http://simonbaird.com/mptw/#TagglyListPlugin|\n|Version|1.1.2 25-Apr-06|\n|Requires|See TagglyTagging|\n\n!History\n* 1.1.2 (25-Apr-2006) embedded TagglyTaggingStyles. No longer need separated tiddler for styles.\n* 1.1.1 (6-Mar-2006) fixed bug with refreshAllVisible closing tiddlers being edited. Thanks Luke Blanshard.\n\n***/\n\n/***\n!Setup and config\n***/\n//{{{\n\nversion.extensions.TagglyListPlugin = {\n major: 1, minor: 1, revision: 2,\n date: new Date(2006,4,25),\n source: "http://simonbaird.com/mptw/#TagglyListPlugin"\n};\n\nconfig.macros.tagglyList = {};\nconfig.macros.tagglyListByTag = {};\nconfig.macros.tagglyListControl = {};\nconfig.macros.tagglyListWithSort = {};\nconfig.macros.hideSomeTags = {};\n\n// change this to your preference\nconfig.macros.tagglyListWithSort.maxCols = 6;\n\nconfig.macros.tagglyList.label = "Tagged as %0:";\n\n// the default sort options. set these to your preference\nconfig.macros.tagglyListWithSort.defaults = {\n sortBy:"title", // title|created|modified\n sortOrder: "asc", // asc|desc\n hideState: "show", // show|hide\n groupState: "nogroup", // nogroup|group\n numCols: 1\n};\n\n// these tags will be ignored by the grouped view\nconfig.macros.tagglyListByTag.excludeTheseTags = [\n "systemConfig",\n "TiddlerTemplates"\n];\n\nconfig.macros.tagglyListControl.tags = {\n title:"sortByTitle", \n modified: "sortByModified", \n created: "sortByCreated",\n asc:"sortAsc", \n desc:"sortDesc",\n hide:"hideTagged", \n show:"showTagged",\n nogroup:"noGroupByTag",\n group:"groupByTag",\n cols1:"list1Cols",\n cols2:"list2Cols",\n cols3:"list3Cols",\n cols4:"list4Cols",\n cols5:"list5Cols",\n cols6:"list6Cols",\n cols7:"list7Cols",\n cols8:"list8Cols",\n cols9:"list9Cols" \n}\n\n// note: should match config.macros.tagglyListControl.tags\nconfig.macros.hideSomeTags.tagsToHide = [\n "sortByTitle",\n "sortByCreated",\n "sortByModified",\n "sortDesc",\n "sortAsc",\n "hideTagged",\n "showTagged",\n "noGroupByTag",\n "groupByTag",\n "list1Cols",\n "list2Cols",\n "list3Cols",\n "list4Cols",\n "list5Cols",\n "list6Cols",\n "list7Cols",\n "list8Cols",\n "list9Cols"\n];\n\n\n//}}}\n/***\n\n!Utils\n***/\n//{{{\n// from Eric\nfunction isTagged(title,tag) {\n var t=store.getTiddler(title); if (!t) return false;\n return (t.tags.find(tag)!=null);\n}\n\n// from Eric\nfunction toggleTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)==null) t.tags.push(tag);\n else t.tags.splice(t.tags.find(tag),1);\n}\n\nfunction addTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n t.tags.push(tag);\n}\n\nfunction removeTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)!=null) t.tags.splice(t.tags.find(tag),1);\n}\n\n// from Udo\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n}\n//}}}\n/***\n\n!tagglyList\ndisplays a list of tagged tiddlers. \nparameters are sortField and sortOrder\n***/\n//{{{\n\n// not used at the moment...\nfunction sortedListOfOtherTags(tiddler,thisTag) {\n var list = tiddler.tags.concat(); // so we are working on a clone..\n for (var i=0;i<config.macros.hideSomeTags.tagsToHide.length;i++) {\n if (list.find(config.macros.hideSomeTags.tagsToHide[i]) != null)\n list.splice(list.find(config.macros.hideSomeTags.tagsToHide[i]),1); // remove hidden ones\n }\n for (var i=0;i<config.macros.tagglyListByTag.excludeTheseTags.length;i++) {\n if (list.find(config.macros.tagglyListByTag.excludeTheseTags[i]) != null)\n list.splice(list.find(config.macros.tagglyListByTag.excludeTheseTags[i]),1); // remove excluded ones\n }\n list.splice(list.find(thisTag),1); // remove thisTag\n return '[[' + list.sort().join("]] [[") + ']]';\n}\n\nfunction sortHelper(a,b) {\n if (a == b) return 0;\n else if (a < b) return -1;\n else return +1;\n}\n\nconfig.macros.tagglyListByTag.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n\n var sortBy = params[0] ? params[0] : "title"; \n var sortOrder = params[1] ? params[1] : "asc";\n\n var result = store.getTaggedTiddlers(tiddler.title,sortBy);\n\n if (sortOrder == "desc")\n result = result.reverse();\n\n var leftOvers = []\n for (var i=0;i<result.length;i++) {\n leftOvers.push(result[i].title);\n }\n\n var allTagsHolder = {};\n for (var i=0;i<result.length;i++) {\n for (var j=0;j<result[i].tags.length;j++) {\n\n if ( \n result[i].tags[j] != tiddler.title // not this tiddler\n && config.macros.hideSomeTags.tagsToHide.find(result[i].tags[j]) == null // not a hidden one\n && config.macros.tagglyListByTag.excludeTheseTags.find(result[i].tags[j]) == null // not excluded\n ) {\n if (!allTagsHolder[result[i].tags[j]])\n allTagsHolder[result[i].tags[j]] = "";\n allTagsHolder[result[i].tags[j]] += "**[["+result[i].title+"]]\sn";\n\n if (leftOvers.find(result[i].title) != null)\n leftOvers.splice(leftOvers.find(result[i].title),1); // remove from leftovers. at the end it will contain the leftovers...\n }\n }\n }\n\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\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 markup = "";\n\n if (sortOrder == "desc") {\n allTags.reverse();\n }\n else {\n // leftovers first...\n for (var i=0;i<leftOvers.length;i++)\n markup += "*[["+leftOvers[i]+"]]\sn";\n } \n\n for (var i=0;i<allTags.length;i++)\n markup += "*[["+allTags[i]+"]]\sn" + allTagsHolder[allTags[i]];\n\n if (sortOrder == "desc") {\n // leftovers last...\n for (var i=0;i<leftOvers.length;i++)\n markup += "*[["+leftOvers[i]+"]]\sn";\n }\n\n wikify(markup,place);\n}\n\nconfig.macros.tagglyList.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n var sortBy = params[0] ? params[0] : "title"; \n var sortOrder = params[1] ? params[1] : "asc";\n var numCols = params[2] ? params[2] : 1;\n\n var result = store.getTaggedTiddlers(tiddler.title,sortBy);\n if (sortOrder == "desc")\n result = result.reverse();\n\n var listSize = result.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize;\n var lowerColsize;\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n lowerColsize = Math.floor(colSize);\n upperColsize = Math.floor(colSize) + 1;\n }\n else {\n lowerColsize = colSize;\n upperColsize = colSize;\n }\n\n var markup = "";\n var c=0;\n\n var newTaggedTable = createTiddlyElement(place,"table");\n var newTaggedBody = createTiddlyElement(newTaggedTable,"tbody");\n var newTaggedTr = createTiddlyElement(newTaggedBody,"tr");\n\n for (var j=0;j<numCols;j++) {\n var foo = "";\n var thisSize;\n\n if (j<remainder)\n thisSize = upperColsize;\n else\n thisSize = lowerColsize;\n\n for (var i=0;i<thisSize;i++) \n foo += ( "*[[" + result[c++].title + "]]\sn"); // was using splitList.shift() but didn't work in IE;\n\n var newTd = createTiddlyElement(newTaggedTr,"td",null,"tagglyTagging");\n wikify(foo,newTd);\n\n }\n\n};\n\n/* snip for later.....\n //var groupBy = params[3] ? params[3] : "t.title.substr(0,1)";\n //var groupBy = params[3] ? params[3] : "sortedListOfOtherTags(t,tiddler.title)";\n //var groupBy = params[3] ? params[3] : "t.modified";\n var groupBy = null; // for now. groupBy here is working but disabled for now.\n\n var prevGroup = "";\n var thisGroup = "";\n\n if (groupBy) {\n result.sort(function(a,b) {\n var t = a; var aSortVal = eval(groupBy); var aSortVal2 = eval("t".sortBy);\n var t = b; var bSortVal = eval(groupBy); var bSortVal2 = eval("t".sortBy);\n var t = b; var bSortVal2 = eval(groupBy);\n return (aSortVal == bSortVal ?\n (aSortVal2 == bSortVal2 ? 0 : (aSortVal2 < bSortVal2 ? -1 : +1)) // yuck\n : (aSortVal < bSortVal ? -1 : +1));\n });\n }\n\n if (groupBy) {\n thisGroup = eval(groupBy);\n if (thisGroup != prevGroup)\n markup += "*[["+thisGroup+']]\sn';\n markup += "**[["+t.title+']]\sn';\n prevGroup = thisGroup;\n }\n\n\n\n*/\n\n\n//}}}\n\n/***\n\n!tagglyListControl\nUse to make the sort control buttons\n***/\n//{{{\n\nfunction getSortBy(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.sortBy;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["title"])) return "title";\n else if (tiddler.tags.contains(usetags["modified"])) return "modified";\n else if (tiddler.tags.contains(usetags["created"])) return "created";\n else return defaultVal;\n}\n\nfunction getSortOrder(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.sortOrder;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["asc"])) return "asc";\n else if (tiddler.tags.contains(usetags["desc"])) return "desc";\n else return defaultVal;\n}\n\nfunction getHideState(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.hideState;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["hide"])) return "hide";\n else if (tiddler.tags.contains(usetags["show"])) return "show";\n else return defaultVal;\n}\n\nfunction getGroupState(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.groupState;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["group"])) return "group";\n else if (tiddler.tags.contains(usetags["nogroup"])) return "nogroup";\n else return defaultVal;\n}\n\nfunction getNumCols(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.numCols; // an int\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n for (var i=1;i<=config.macros.tagglyListWithSort.maxCols;i++)\n if (tiddler.tags.contains(usetags["cols"+i])) return i;\n return defaultVal;\n}\n\n\nfunction getSortLabel(title,which) {\n // TODO. the strings here should be definable in config\n var by = getSortBy(title);\n var order = getSortOrder(title);\n var hide = getHideState(title);\n var group = getGroupState(title);\n if (which == "hide") return (hide == "show" ? "−" : "+"); // 0x25b8;\n else if (which == "group") return (group == "group" ? "normal" : "grouped");\n else if (which == "cols") return "cols±"; // &plusmn;\n else if (by == which) return which + (order == "asc" ? "↓" : "↑"); // &uarr; &darr;\n else return which;\n}\n\nfunction handleSortClick(title,which) {\n var currentSortBy = getSortBy(title);\n var currentSortOrder = getSortOrder(title);\n var currentHideState = getHideState(title);\n var currentGroupState = getGroupState(title);\n var currentNumCols = getNumCols(title);\n\n var tags = config.macros.tagglyListControl.tags;\n\n // if it doesn't exist, lets create it..\n if (!store.getTiddler(title))\n store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);\n\n if (which == "hide") {\n // toggle hide state\n var newHideState = (currentHideState == "hide" ? "show" : "hide");\n removeTag(title,tags[currentHideState]);\n if (newHideState != config.macros.tagglyListWithSort.defaults.hideState)\n toggleTag(title,tags[newHideState]);\n }\n else if (which == "group") {\n // toggle hide state\n var newGroupState = (currentGroupState == "group" ? "nogroup" : "group");\n removeTag(title,tags[currentGroupState]);\n if (newGroupState != config.macros.tagglyListWithSort.defaults.groupState)\n toggleTag(title,tags[newGroupState]);\n }\n else if (which == "cols") {\n // toggle num cols\n var newNumCols = currentNumCols + 1; // confusing. currentNumCols is an int\n if (newNumCols > config.macros.tagglyListWithSort.maxCols || newNumCols > store.getTaggedTiddlers(title).length)\n newNumCols = 1;\n removeTag(title,tags["cols"+currentNumCols]);\n if (("cols"+newNumCols) != config.macros.tagglyListWithSort.defaults.groupState)\n toggleTag(title,tags["cols"+newNumCols]);\n }\n else if (currentSortBy == which) {\n // toggle sort order\n var newSortOrder = (currentSortOrder == "asc" ? "desc" : "asc");\n removeTag(title,tags[currentSortOrder]);\n if (newSortOrder != config.macros.tagglyListWithSort.defaults.sortOrder)\n toggleTag(title,tags[newSortOrder]);\n }\n else {\n // change sortBy only\n removeTag(title,tags["title"]);\n removeTag(title,tags["created"]);\n removeTag(title,tags["modified"]);\n\n if (which != config.macros.tagglyListWithSort.defaults.sortBy)\n toggleTag(title,tags[which]);\n }\n\n store.setDirty(true); // save is required now.\n story.refreshTiddler(title,false,true); // force=true\n}\n\nconfig.macros.tagglyListControl.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n var onclick = function(e) {\n if (!e) var e = window.event;\n handleSortClick(tiddler.title,params[0]);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n };\n createTiddlyButton(place,getSortLabel(tiddler.title,params[0]),"Click to change sort options",onclick,params[0]=="hide"?"hidebutton":"button");\n}\n//}}}\n/***\n\n!tagglyListWithSort\nput it all together..\n***/\n//{{{\nconfig.macros.tagglyListWithSort.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n if (tiddler && store.getTaggedTiddlers(tiddler.title).length > 0)\n // todo make this readable\n wikify(\n "<<tagglyListControl hide>>"+\n (getHideState(tiddler.title) != "hide" ? \n '<html><span class="tagglyLabel">'+config.macros.tagglyList.label.format([tiddler.title])+' </span></html>'+\n "<<tagglyListControl title>><<tagglyListControl modified>><<tagglyListControl created>><<tagglyListControl group>>"+(getGroupState(tiddler.title)=="group"?"":"<<tagglyListControl cols>>")+"\sn" + \n "<<tagglyList" + (getGroupState(tiddler.title)=="group"?"ByTag ":" ") + getSortBy(tiddler.title)+" "+getSortOrder(tiddler.title)+" "+getNumCols(tiddler.title)+">>" // hacky\n // + \sn----\sn" +\n //"<<tagglyList "+getSortBy(tiddler.title)+" "+getSortOrder(tiddler.title)+">>"\n : ""),\n place,null,tiddler);\n}\n\nconfig.macros.tagglyTagging = { handler: config.macros.tagglyListWithSort.handler };\n\n\n//}}}\n/***\n\n!hideSomeTags\nSo we don't see the sort tags.\n(note, they are still there when you edit. Will that be too annoying?\n***/\n//{{{\n\n// based on tags.handler\nconfig.macros.hideSomeTags.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var theList = createTiddlyElement(place,"ul");\n if(params[0] && store.tiddlerExists[params[0]])\n tiddler = store.getTiddler(params[0]);\n var lingo = config.views.wikified.tag;\n var prompt = tiddler.tags.length == 0 ? lingo.labelNoTags : lingo.labelTags;\n createTiddlyElement(theList,"li",null,"listTitle",prompt.format([tiddler.title]));\n for(var t=0; t<tiddler.tags.length; t++)\n if (!this.tagsToHide.contains(tiddler.tags[t])) // this is the only difference from tags.handler...\n createTagButton(createTiddlyElement(theList,"li"),tiddler.tags[t],tiddler.title);\n\n}\n\n//}}}\n/***\n\n!Refresh everything when we save a tiddler. So the tagged lists never get stale. Is this too slow???\n***/\n//{{{\n\nfunction refreshAllVisible() {\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n}\n\nstory.saveTiddler_orig_mptw = story.saveTiddler;\nstory.saveTiddler = function(title,minorUpdate) {\n var result = this.saveTiddler_orig_mptw(title,minorUpdate);\n refreshAllVisible();\n return result;\n}\n\nstore.removeTiddler_orig_mptw = store.removeTiddler;\nstore.removeTiddler = function(title) {\n this.removeTiddler_orig_mptw(title);\n refreshAllVisible();\n}\n\nconfig.shadowTiddlers.TagglyTaggingStyles = "/***\snTo use, add {{{[[TagglyTaggingStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also ViewTemplate, EditTemplate and TagglyTagging.\sn***/\sn/*{{{*/\sn.tagglyTagged li.listTitle { display:none;}\sn.tagglyTagged li { display: inline; font-size:90%; }\sn.tagglyTagged ul { margin:0px; padding:0px; }\sn.tagglyTagging { padding-top:0.5em; }\sn.tagglyTagging li.listTitle { display:none;}\sn.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }\sn\sn/* .tagglyTagging .tghide { display:inline; } */\sn\sn.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn.tagglyTagging table { margin:0px; padding:0px; }\sn\sn\sn.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn.tagglyTagging .button, .tagglyTagging .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}\sn.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }\sn.selected .tagglyTagging .button { display:inline; }\sn\sn.tagglyTagging .hidebutton { color:white; } /* has to be there so it takes up space. tweak if you're not using a white tiddler bg */\sn.selected .tagglyTagging .hidebutton { color:#aaa }\sn\sn.tagglyLabel { color:#aaa; font-size:90%; }\sn\sn.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn.tagglyTagging ul ul li {margin-left:0.5em; }\sn\sn.editLabel { font-size:90%; padding-top:0.5em; }\sn/*}}}*/\sn";\n\nrefreshStyles("TagglyTaggingStyles");\n\n\n//}}}\n\n// // <html>&#x25b8;&#x25be;&minus;&plusmn;</html>
/***\n''TextAreaPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#TextAreaPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nAdds extra keyboard functions to the standard textarea control in the tiddler editor. Control-F and control-G will "Find text" and "find text aGain", respectively, allowing you to copy, find, paste, findagain, paste, etc to perform "search-and-replace" actions. In addition, this plugin will accept the TAB character as input to the textarea control, rather than as a signal to move the focus to another control. This allow you to easily use tab characters for column-aligned text indentations (very useful for writing readable plugin source code)\n!!!!!Configuration\n<<<\n<<option chkDisableEscapeKey>> don't cancel editor when ''escape'' key is pressed\n<<option chkTextAreaExtensions>> add control-f (find), control-g (find again) and allow TABs as input in textarea\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''TextAreaPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.08.01 [1.1.2]'' improved processed() utility function to handle IE5 and IE6, as well as calling preventDefault() for moz browsers. Thanks to Bradley Meck for research and code examples.\n''2006.07.09 [1.1.1]'' removed chkDisableAutoSelect\n''2006.02.14 [1.1.0]'' added option for chkDisableEscapeKey (default is standard action)\n''2006.01.22 [1.0.1]'' only add extra key processing for TEXTAREA elements (not other edit fields).\nadded option to enable/disable textarea keydown extensions (default is "standard keys" only)\n''2006.01.22 [1.0.0]'' Moved from temporary "System Tweaks" tiddler into 'real' TextAreaPlugin tiddler.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.textAreaPlugin= {major: 1, minor: 1, revision: 2, date: new Date(2006,8,1)};\n//}}}\n\n//{{{\nif (!config.options.chkTextAreaExtensions) config.options.chkTextAreaExtensions=false; // default to standard action\nif (!config.options.chkDisableEscapeKey) config.options.chkDisableEscapeKey=false; // default to standard action\n\n// Focus a specified tiddler. Attempts to focus the specified field, otherwise the first edit field it finds\nStory.prototype.focusTiddler = function(title,field)\n{\n var tiddler = document.getElementById(this.idPrefix + title);\n if(tiddler != null)\n {\n var children = tiddler.getElementsByTagName("*")\n var e = null;\n for (var t=0; t<children.length; t++)\n {\n var c = children[t];\n if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea")\n {\n if(!e)\n e = c;\n if(c.getAttribute("edit") == field)\n e = c;\n }\n }\n if(e)\n {\n e.focus();\n e.select(); // select entire contents\n if (config.options.chkTextAreaExtensions) // TWEAK: add TAB and "find" key handlers\n addKeyDownHandlers(e);\n }\n }\n\n tiddler.onkeypress = function(e) {\n if (!e) var e = window.event;\n clearMessage();\n var consume = false;\n switch(e.keyCode)\n {\n case 13: // Ctrl-Enter\n case 10: // Ctrl-Enter on IE PC\n case 77: // Ctrl-Enter is "M" on some platforms\n if(e.ctrlKey)\n {\n story.blurTiddler(this.title);\n config.macros.toolbar.invokeCommand(this,"defaultCommand",e);\n consume = true;\n }\n break;\n case 27: // Escape\n if (config.options.chkDisableEscapeKey) break; // ignore ESCAPE if option is set\n story.blurTiddler(this.title);\n config.macros.toolbar.invokeCommand(this,"cancelCommand",e);\n consume = true;\n break;\n }\n e.cancelBubble = consume;\n if(consume)\n if (e.stopPropagation) e.stopPropagation();\n return(!consume);\n };\n}\n//}}}\n\n//{{{\nfunction addKeyDownHandlers(e)\n{\n // exit if not textarea or element doesn't allow selections\n if (e.tagName.toLowerCase()!="textarea" || !e.setSelectionRange) return;\n\n // utility function: exits keydown handler and prevents browser from processing the keystroke\n var processed=function(ev) {\n ev.cancelBubble=true; // IE4+\n try{event.keyCode=0;}catch(e){}; // IE5\n if (window.event) ev.returnValue=false; // IE6\n if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror\n if (ev.stopPropagation) ev.stopPropagation(); // all\n return false;\n }\n\n // capture keydown in edit field\n e.onkeydown=function(ev) { if (!ev) var ev=window.event;\n var key=ev.keyCode;\n if (!key) {\n var char=event.which?event.which:event.charCode;\n if (char==102) key=70;\n if (char==103) key=71;\n }\n\n // process TAB\n if (!ev.shiftKey && key==9) { \n // replace current selection with a TAB character\n var start=e.selectionStart; var end=e.selectionEnd;\n e.value=e.value.substr(0,start)+String.fromCharCode(9)+e.value.substr(end);\n // update insertion point, scroll it into view\n e.setSelectionRange(start+1,start+1);\n var linecount=e.value.split('\sn').length;\n var thisline=e.value.substr(0,e.selectionStart).split('\sn').length-1;\n e.scrollTop=Math.floor((thisline-e.rows/2)*e.scrollHeight/linecount);\n return processed(ev);\n }\n\n // process CTRL-F (find matching text) or CTRL-G (find next match)\n if (ev.ctrlKey && (key==70||key==71)) {\n // if ctrl-f or no previous search, prompt for search text (default to previous text or current selection)... if no search text, exit\n if (key==70||!e.find||!e.find.length)\n { var f=prompt("find:",e.find?e.find:e.value.substring(e.selectionStart,e.selectionEnd)); e.focus(); e.find=f?f:e.find; }\n if (!e.find||!e.find.length) return processed(ev);\n // do case-insensitive match with 'wraparound'... if not found, alert and exit \n var newstart=e.value.toLowerCase().indexOf(e.find.toLowerCase(),e.selectionStart+1);\n if (newstart==-1) newstart=e.value.toLowerCase().indexOf(e.find.toLowerCase());\n if (newstart==-1) { alert("'"+e.find+"' not found"); e.focus(); return processed(ev); }\n // set new selection, scroll it into view, and report line position in status bar\n e.setSelectionRange(newstart,newstart+e.find.length);\n var linecount=e.value.split('\sn').length;\n var thisline=e.value.substr(0,e.selectionStart).split('\sn').length;\n e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);\n window.status="line: "+thisline+"/"+linecount;\n return processed(ev);\n }\n }\n}\n//}}}
[>img[The Blood Arm - Lie Lover Lie|http://upload.wikimedia.org/wikipedia/en/7/79/Lielover.jpg]]It certainly seems like that popular music darlings The Killers have been beaten at their own game here. With Rolling Stone giving the sprawling sonic sinkhole [[Sam's Town|The Killers - Sam's Town]] a metaphorical raspberry in the form of a paltry two stars. If, like many, 2004's [[Hot Fuss|The Killers - Hot Fuss]] made you simultaneously angry and drawn to sing a long (c'mon, admit it, if no one's looking/listening, you can sing a pretty good portion of Mr. Brightside, probably better than Brandon Flowers) then [[Lie Lover Lie|The Blood Arm - Lie Lover Lie]] will have you sitting bolt upright in order to take notice in precisely the same way. But the generally jolly piano-led pop of these Franz Ferdinand darlings made me feel a lot less dirty about it.\n\nSay hello to the new applicants for the prestigious and embarrassing title of [[New New Wave Alternative Pop Torch Bearer|Baskin-Robbins bands]]. The competition is fierce in an over-saturated market, but I really hope these fellows don't end up fading away unnoticed.\n\nIn probably one of the boldest declarations ever risked on an opener in the history of Alternative Music, "Stay Put!" starts with Nathaniel Fregoso's presumptuously intoning the following gem before the first of their soon-to-be-idiosyncratic piano starts: \n>@@font-size:1.5em;//"Yo, I'll lay down some fucking hitsss..."//@@\nStrangely, he's not too far off base here. Sprinkled with potential singles, the tracks on this album are well placed and deliberate, creating a very purposeful whole. The band hardly suffers from it's distinctive lack of a bass player, with the persistent piano parts more than adequately filling the role. The decadent and optimistic "Accidental Soul" soon follows and it's is practically plastered with hastily photo-copied flyers proclaiming "Top Forty." But it would sadly seem that it lost out to the equally catchy next track "Suspicious Character" for the nowadays superfluous title of lead single. Hopefully modern music will end up milking this album for every milliliter. \n\n"Suspicious Character" features another instance of the ever-popular sing-a-long trope. We start off a little softer with the lilting "Angela," but The Blood Arm never refrains from "rocking out" for long. We're giving the closest thing to a hiatus from the exaggerated extravagances of this album with the wonderfully anthemic "Going To Arizona." The mood of the album doesn't quite perform an about-face here, it's more akin to an over-the-shoulder glance, with it's acoustic guitar embellishments and blithely emotive refrain.\n\nThere's more stylish proto-substance on very likely to be dynamic-front man-friendly "Do I Have Your Attention." There's still more chart-friendly fodder in "Mass Murder" and ""Visionaries" (replete with hand claps), and the howl at the beginning of "PS I Love You But I Don't Miss You" is particularly nice. [[Lie Lover Lie|The Blood Arm - Lie Lover Lie]] closes with a nice capstone in "Dolores Delivers A Glorious Death," and although we'll never be able to accuse this band of attempting to explore too many directions here, frankly, I find that refreshing in these days.\n\nI really should instate some sort of categorical system for my [[Best Of|Best Of 2006]] list, perhaps splitting it into genres. I'll get on that soon.\n\n@@display:block;text-align:center;font-size:1.5em;line-height:120%;Five Radio-Friendly Stars ([[★★★★★]]). Throughout 2007 we'll hopefully find these guys rubbing up against the charts.\nWe'll get phenomenally tired of hearing them, but it'd be completely worth it, just watch Mr. Flowers wilt once more.@@\n
[>img[The Boyfriends - The Boyfriends|http://ec1.images-amazon.com/images/P/B000IB0DNK.01._AA240_SCLZZZZZZZ_V41369257_.jpg]]I was going to try to get the inevitable Morrissey comparisons out of the way upfront. Martin Wallace's vocals bear much more than a passing resemblance to everyone's favorite morose crooner, and Richard Adderly's guitar work featured on this self-titled debut seems to consist of riffs cribbed directly from Smiths-era Johnny Marr's personal fakebook. I just can't ignore it, it's one thing to be influenced by one of the most influential bands in music, but here I think we've broken the fourth wall.\n\nLet's go through the checklist shall we:\n*Anthemic Pop. Earnest lyrics with catchy choruses. Check.\n*Discomfort: "Adult Acne."\n*Pasty and unmistakably Anglo. Listen to "British Summer Time."\n*Multitudes of platitudes. Try "A Fearless Heart" or "Wonders Never Cease" for a few examples of this. Check.\n*Hell, if you want to get nit-picky, check out the album cover to the right. No sir, no hints of Jo Slee's duotone here. Move along...\nI could go on but I won't. I'm not reviewing The Smiths, I'm attempting to review the touted new band, The Boyfriends, the problem is, there's too much similarity to ignore. Perhaps if we try to focus on the differences:\n*This is an optimistic album. It's not all doom and gloom we hear here, the lyrical content and narratives are decidedly less dour than Morrissey. Imagine Moz getting laid regularly and on Thorazine. See: "No Tomorrow."\n*The few attempted lyrical witticisms fall flat, especially when compared to one of the masters (who nicked his wit from Wilde, natch). There are hints of sarcasm scattered here and there, but they just don't hold a candle to the original.\nSo, no real points for originality here I'm afraid, but trying to get past the pastiche and cheerfully overlooking the old "imitation is the sincerest form of flattery" adage (a technique that apparently works: after succumbing to the buzz, Moz himself invited them to open for is 2006 European tour in a delicious bit of meta-musical narcissism) is admittedly difficult to do. But overall, we're not dealing with a horrible album here. It's very nice in places. I'm just having a very hard time coping with the fact that it exists in my head. It's good, songs like "No Tomorrow" have hints of Peter Hook and Bernard Sumner, and "I Love You" begins with a wonderfully 90's britpop guitar intro. But, it's bad, I love The Smiths, and if I want to hear The Smiths, I'll listen to The Smiths thank-you-very-much.\n\n[[Candace]] brought up an interesting point as I was relistening to this album and trying to distill the tragically few ounces of originality. Perhaps Morrissey is taking a cue from Garth Brook's [[Chris Gaines|http://en.wikipedia.org/wiki/Chris_Gaines]] here, and The Boyfriends are simply his new pet-project. Oh conspiracy, ghostwritten by a happier Moz. \n\n@@display:block;text-align:center;font-size:1.5em; Three Stars ([[★★★☆☆]]), excuse me whilst I go pop in Meat Is Murder.@@\n
[>img[The Divine Comedy - Victory For The Comic Muse|http://upload.wikimedia.org/wikipedia/en/thumb/7/79/Victory_for_the_Comic_Muse.jpg/200px-Victory_for_the_Comic_Muse.jpg]]Titled after a line from Cecil Vyse in EM Forster's [[A Room With A View|http://www.amazon.com/Room-View-Classic-E-M-Forster/dp/0553213237]], [[Victory For The Comic Muse|The Divine Comedy - Victory For The Comic Muse]] was recorded in only two weeks, with very little overdubbing. Sometimes such spontaneity can spell disaster for a record, but in this case Neil Hannon and Co. have succeeded in achieving precisely the opposite, engendering the album with a refreshing sense of manic energy that is almost difficult to reconcile with the playfully pretentious and carefully crafted pop music distilled into the various songs contained within.\n\nI was sold from the opening strains of the first track. "To Die A Virgin" starts off with triumphing strings and a wonderful sample of an amusing exchange from [[The Camomile Lawn|http://www.imdb.com/title/tt0103381/]], a TV series based on British author Mary Wesley's most famous novel. \n>//"If there's a war, I'll sleep with you before you get killed,//\n>//That's what maidens do in books, and I'm a maiden."//\n>"Why do you carry on with your virginity? Virginity is nothing! You can loose it riding a bicycle."\n>//"I never knew that. I must be careful. I'm going to get a bycicle in London..."//\nWith a judicious amount of reverb on the vocals and lovely lyrics that wittily depict a teenage protagonist's struggle to lose his virginity at all costs, it's perfect pop song materieal, and a story I'm certain virtually all members of the male gender can sympathize with. The content is highly humorous as our hero desperately pleads his case.\n\nThe banjo-ridden "Mother Dear" is another endearing "coming of age" song, this time illuminating the startling moment of realization that one's parents are simply people too. Truly a wonderful maternal tribute.\n\n"Diva Lady" is an urbane and sardonic jab at entitlement, and is followed by more patently pulled Hanon. Nicked [[Nyman|http://en.wikipedia.org/wiki/Michael_Nyman]] strings accentuate the unraveling character study of "A Lady Of A Certain Age." Whilst storytelling shines throughout the entire album, it wistfully glimmers on the maudlin track "The Light Of Day" and pauses only briefly on "Threesome" a tender piano instrumental, played on three pianos. It would almost become a [[gailliard|http://dictionary.reference.com/search?q=galliard]] if sped up.\n\nNext we have a jaunty cover of The Associates' operatic new wave masterpiece "Party Fears Two." A huge fan of The Associates, it was this cover that actually persuaded me to give this album a shot after the disappointments of 2004's Absent Friends. There's a shade of "Something For The Weekend" here but overall the tribute is tasteful and refined. Hannon thankfully knows his limits and avoids the upper registers. The dramatic vocal stylings of the original are best left to the late Billy Mackenzie.\n\n"Arthur C. Clarke's Mysterious World" is a catchy and fun song, recalling the old television show of the same name that dealt primarily with unexplained phenomena. In this delightfully upbeat tune the protagonist's predicament stems from his inability to understand his sweetheart, claiming that she would make a perfect candidate for the subject matter of a similar show. This cheerfulness is short-lived though, for up next we have the brooding epic "The Plough," a deliciously dark narrative with a peripatetic and iconoclastic anti-hero. It's such a saturnine song, grim and absolutely brilliant.\n\nThe tone stays sunless for the also excellent "Count Grassi's Passage Over Piedmont." With it's very clever rhymes and overall sophistication, "Count Grassi's Passage" is a stand-out literary track. The closing song "Snowball In Negative" seems to be the stylistically weakest song, but if one considers it's company, "Snowball" is still quite strong.\n\n@@display:block;text-align:center;font-size:1.5em;That'll be five stars ([[★★★★★]]), for a cohesive and gratifying whole.@@\n
[>img[The Format - Dog Problems|http://image.allmusic.com/00/amg/cov200/drh300/h378/h37865qz9oa.jpg]]In the midst of my web-based wanderings, I stumbled across The Format's [[cheerfully gimicky website|http://www.theformat.com/index3.html]] well before I had a chance to hear their latest album. The album's name is apparently in reference to Nate Ruess's and his then-girlfriend's idea to get an additional pet canine every time they broke up. "What an astoundingly terrible idea," I initially thought, but if that steadily souring relationship was the catalyst for the conception of this wonderfully shimmering pop product, then I've come to the conclusion that it's not so terrible after all.\n\nLike most of my highly rated albums this year, I find myself with very little to actually elaborate on within the accompanying reviews, convinced instead that hopefully an open-minded listen will explain all. But if you find yourself needing more reasons to give this album a shot, let me briefly illuminate some key points:\n*This is probably one of the happiest, most exuberant break-up albums ever. It should become required listening (see: "Time Bomb" for an example of this hard to reconcile twist).\n*Give the title track a try. "Dog Problems" and it's wonderful, almost New Orlean's Dixie delivery is exemplary. Listen all the way to the end. That's a particularly nice bit there.\n*The lyrics are heartfelt and often humorous, with a heavy dose of cynicism here and there, but they never really seem to contrast with the uplifting music built around them. \n*The first single ("The Compromise") was written as a response to their big bad label (Atlantic in this case) asking The Format to write a "hit single," prior to dropping them. Hilarious. \n*We've all been sucker-punched by Pop before. This album left my gut cheerfully aching for the longest time in quite a while.\n@@display:block;text-align:center;font-size:1.5em;line-height:120%;Five Stars ([[★★★★★]]). \nProbably the glaringly obvious Achilles Heel in my [[Best Of 2006]] List.@@\n\n
[<img[The Hidden Cameras - Awoo|http://image.allmusic.com/00/amg/cov200/drh700/h700/h70010eef61.jpg]][[Candace]] has been enjoying the periodic rotation of this album. This time we're in for more of that amusing folk, but almost entirely devoid of the rampant Frogs-style sexuality that made previous releases by the Hidden Cameras a real treat. Decidedly less "gay" than previous releases, I was left a little disappointed when my expectations (of a band who self-billed as "gay church music") were left unfulfilled by a stylistic departure from that form of fun.\n\nThe album definitely took a long time to grow on me, with only the earworming opening track forming an initial impression. "Death Of A Tune" starts off with vocals that sound an awful lot like John Darnielle (The Mountain Goats, who do better this with this year's [[Get Lonely|The Mountain Goats - Get Lonely]]), but the driving guitar and general upbeat nature of the track kill the comparison just as Joel Gibb's vocals shift from the nasal to normal.\n\nThe barking repetition of "Lollipop" leaves me wanting to listen to R.E.M.'s "It's the End of the World as We Know It (and I Feel Fine)".\n\nThere's a minefield of catchy choruses on this album. This occasionally works to the albums disadvantage, as the title track yanks the line and sets the hook in an almost painful way and the album itself feels rather top-heavy toward the end. Shorter songs like "Learning The Lie" suffer the least from the howling hooks.\n\nThe lack of any real lyrics on "Heji" (a decidedly dark stomper) creates a discernible shift in the album's mood. The transition to "Wandering" from "Heaven Turns To" is quite nice, although I could take or leave either song. "Hump From Bending" seems to recall the album opener.\n\n@@display:block;text-align:center;font-size:1.5em;Three stars ([[★★★☆☆]]) and although it may make [[Candace]]'s Best, it'll probably be edged off mine.@@\n
[<img[The Minus 5 - The Minus 5 (The Gun Album)|http://image.allmusic.com/00/amg/cov200/drh100/h196/h19623ribak.jpg]]Shamefully, I've never been a big fan of The Beatles. I was much more drawn to the soulful bad-boy sounds of The Rolling Stones as a child, and therefore never really developed the pandemic "[[Sgt. Pepper's|http://en.wikipedia.org/wiki/Sgt_Peppers]] and [[Abbey Road|http://en.wikipedia.org/wiki/Abbey_Road_%28album%29]] equal [[Rafi|http://en.wikipedia.org/wiki/Raffi_%28musician%29]]" that seems to plague some people. As I've aged, I've developed a rather cold and clinical appreciation for the ~Fab-Four and their quintessential contributions to the ever-pulsing mass of popular music. But if I were mystically transported back in time forty years, I'd like to think I'd be championing counter-invasion underdogs The Walker Brothers or some other equally unappreciated phenomenon. \n\nWith all that in mind, even under-Beatle'd blokes like me can hear Scott ~McCaughey zealous fascination with the inextricable hooks that drove the British Invasion on this, the seventh album by line-up shuffling super-group The Minus 5. Make no mistake, this album has managed to stay in the back of my mind as [[Best Of|Best Of 2006]] list material since the very beginning of the year (February I believe), and even after all the tonal saturation I've subjected myself to over the course of 2006, it still managed to remain memorable.\n\nI just know it's all those dastardly baroque melodies that do it, listen to "With A Gun" for one of many unabashed examples. The firearms-theme figures quite prominently into several songs on this album, and that, when married with the album's subtly menacing cover artwork have nicknamed this otherwise eponymous album "The Gun Album." It's a fairly solid effort right out of the gate with "Rifle Called Goodbye" and it's delightfully puzzling lyrics.\n\n"Aw Shit Man" is the stomping but short stumper that directly follows "Rifle." The creative and sometimes perplexing word couplings continue with the light-hearted "Out There On The Maroon" and intrigue me even further on "My Life As A Creep." There's some very solid songwriting and masterfully constructed music throughout this album, but ~McCaughey's inventive lyrics are a strong selling point and major treat for me.\n\nI've already mentioned "With A Gun" as a good example of some of just how hook-y this album is, and even though the mere mention of The Decemberists currently sends my skin crawling, Colin Meloy does provide some decent delivery on the plaintively pretty "Cemetery Row." But I've already rambled on too long about this album, I'll leave the what-would-be-the-B-side for the reader to dissect and enjoy. NB: Don't Miss "Leftover Life."\n\n@@display:block;text-align:center;font-size:1.5em;line-height:120%;Another Five Star ([[★★★★★]]) album here, methinks the [[Best Of|Best Of 2006]] list this year may be quite long.@@ \n
[>img[The Puppini Sisters - Betcha Bottom Dollar|http://upload.wikimedia.org/wikipedia/en/thumb/e/e1/ThePuppiniSisters.jpg/220px-ThePuppiniSisters.jpg]]Produced by composer Benoit Charest, the ear behind the Oscar nominated soundtrack of [[The Triplets of Belleville|http://www.imdb.com/title/tt0286244/]], this won't really be a review of musical merit in the strictest sense. This album is just a little bit of fun. \n\nThe Puppini Sisters are not actually biologically related, and merely adopted the name to intentionally conjure up The Andrews Sisters, luminaries of the close harmony set. On their debut album [[Betcha Bottom Dollar|The Puppini Sisters - Betcha Bottom Dollar]] the vocals are kept right where they belong for this style of music: front and center.\n\nIt's the singing and material we're after here. The singing does a wonderful job of invoking the 1940s heyday of vocal groups, and most of the material was obviously chosen to match, with standards such as "Mr. Sandman," "Boogie Woogie Bugle Boy," "Bei Mir Bist du Schon," "Jeepers Creepers," and "In The Mood" making appearances. \n\nThe real interest I had in this release rested in a few of the other tracks. The Puppini Sisters also attempt to “translate” more modern songs such as The Smiths "Panic," Blondie's "Heart Of Glass," Gloria Gaynor's disco anthem "I Will Survive" and even Kate Bush's "Wuthering Heights." The interpretations are all fairly interesting, with "Panic" even inducing a chortle when I first encountered it unexpectedly. However, the angelic voices of The Puppini Sister's are not to be sullied with profanity, and "Heart Of Glass" is conspicuously bereft of one of my favorite lines (the "pain in the ass" bit, I've always enjoyed that bit).\n\nOut of genre cover songs are a big soft spot of mine, especially since Nouvelle Vague has made it finally feasible to fill an entire album with them. There's a few tracks worth of fun on this album, but I can't really bring myself to rate it alongside the other releases of the year, simply because there's very little in the way of original substance here. If you're a big fan of The Andrews Sisters, it may be worth your time, otherwise it's really all novelty.\n\n
/***\n{{fr{\n<<tiddler TiddlerSlicerDocumentation_fr>>}}}{{en{\n<<tiddler TiddlerSlicerDocumentation_en>>}}}\n/%dependencies TWkdLib %/\n!Code\n***/\n// //version information\n//{{{\nversion.extensions.TiddlerSlicer = { major: 1, minor: 2, revision: 0, date: new Date(2006,10,5),\n source: "http://yann.perrin.googlepages.com/twkd.html#TiddlerSlicer"\n};\n//}}}\n// //slicing function\n//{{{\n\nslicing = function(e){\nvar modeandtitle=this.getAttribute('Id');\nmodeandtitle=modeandtitle.split('|');\nvar mode=modeandtitle[0];\nvar title=modeandtitle[1];\nvar selection = getSelection(title);\nvar newtitle=askForTitle();\nif(!newtitle)\n {\n displayMessage(config.commands.slice.cancel);\n return(false);\n }\nif (mode!="part"&&mode!="nestedSlider")\n{\n// creation of the new tiddler\nnewTWkdLibTiddler(newtitle,selection.content,title,config.commands.slice.askForTags);\n}\n\n// replacement of selection with a reference to the newly created tiddler\nswitch(mode) {\n case "nestedSlider":\n putInPlace("+++["+newtitle+"]\sn"+selection.content+"\sn===",selection);\n break;\n case "part":\n putInPlace("<part "+newtitle+">"+selection.content+"</part>",selection);\n break;\n case "link":\n putInPlace("[["+newtitle+"]]",selection);\n break;\n case "slider":\n putInPlace('<<slider chkSlice [['+newtitle+']] "'+newtitle+'" "'+config.commands.slice.sliderTooltip+newtitle+'">>',selection);\n break;\n default:\n putInPlace("<<tiddler [["+newtitle+"]]>>",selection);\n break;\n }\n} // close slicing function definition\n//}}}\n// // command definition\n//{{{\nconfig.commands.slice = {\ntext:"8<",\ntooltip:"create new microcontent from selection",\ncancel:"slicing cancelled",\ntiddlercreated:" tiddler created",\nsliderTooltip:"content of ",\naskForTags:true,\nwikeditposition:3\n}\n\nconfig.commands.slice.handler = function(event,src,title) {\nvar availablesModes = ["tiddler","slider","link"];\nif (version.extensions.PartTiddlerPlugin)\n availablesModes.push("part");\nif (version.extensions.nestedSliders)\n availablesModes.push("nestedSlider");\nvar popup = Popup.create(src);\n if(popup)\n {\n for (var i=0; i<availablesModes.length; i++)\n {\n createTiddlyButton(createTiddlyElement(popup,"li"), availablesModes[i], availablesModes[i], slicing, null, availablesModes[i]+'|'+title, null);\n }\n Popup.show(popup,false);\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n return false;\n }\n}\n//}}}\n// // shadow links to documentation\n//{{{\nconfig.shadowTiddlers.TiddlerSlicerDocumentation_en = "Documentation for this plugin is available [[here|" + version.extensions.TiddlerSlicer.source +"Documentation_en]]";\nconfig.shadowTiddlers.TiddlerSlicerDocumentation_fr = "La documentation de ce plugin est disponible [[ici|" + version.extensions.TiddlerSlicer.source +"Documentation_fr]]";\n//}}}
\nThe kindly folks at TiddlySpot make this experiment possible by hosting this TiddlyWiki. I've been searching for a semi-servier-side solution for TiddlyWiki for a while now, and they just happened to fit the bill.\n\nYou can get your own by signing up at http://tiddlyspot.com.
TiddlyWiki is a wiki-modeled client-side application written by Jeremy Ruston that is designed to be used as a personal notebook.\n\nTiddlyWiki is a single self-contained HTML file that includes CSS and JavaScript code. When the user downloads it to their PC, TiddlyWiki can save the entered information by overwriting itself on the user's disk, at the user's request. Following TiddlyWiki conventions, users can make a new entry, called a Tiddler, in their local copy of the TiddlyWiki file and save it for future reference. Existing Tiddlers can also be modified or deleted in the same way. In contrast to the majority of other wiki systems the changes can only be saved locally.\n\nTiddlyWiki is published by Osmosoft under a BSD open source license, which makes it freely available. Developer Jeremy Ruston describes it as experimental, and in that spirit many people have used the original HTML file to create TiddlyWiki Adaptations. These fall under two general categories: those that retain the client-side write only feature, and those that add server-side file writing to make TiddlyWiki more like a true wiki. Links to both these kinds of Adaptations are put in the original TiddlyWiki file as they become known. TiddlyWiki Adaptations typically add features that were not originally envisioned by Ruston, and some of these features have been included in newer versions of TiddlyWiki.
I love IndexCards for planning out ideas, and the styling of this TiddlyWiki will probably reflect this.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |\n| 9/12/2006 19:47:12 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/12/2006 20:33:50 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/12/2006 20:54:27 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/12/2006 21:0:39 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/12/2006 21:2:20 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/12/2006 21:9:12 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 9/12/2006 21:25:33 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/12/2006 22:9:22 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 9/12/2006 22:12:4 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 9/12/2006 22:13:50 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 9/12/2006 23:55:6 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 9/12/2006 23:56:45 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 1:28:21 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 1:49:24 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 2:29:48 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 10/12/2006 2:35:14 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 10/12/2006 20:31:19 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 10/12/2006 20:34:43 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 10/12/2006 20:35:56 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 10/12/2006 20:39:35 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 10/12/2006 21:29:18 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 10/12/2006 21:30:15 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 12/12/2006 11:45:17 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 12/12/2006 12:22:1 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/2/2008 13:7:23 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |\n| 21/2/2008 13:11:19 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . | Ok |\n| 21/2/2008 13:13:37 | Ktrey | [[/|http://ktrey.tiddlyspot.com/]] | [[store.cgi|http://ktrey.tiddlyspot.com/store.cgi]] | . | index.html | . |
Type the text for 'UploadPassword'
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 3, \n date: new Date(2006,6,30),\n type: 'macro',\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n docs: 'http://tiddlywiki.bidix.info/#UploadPluginDoc'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(0, lastpos);\n } else {\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n }\n};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1) {\n return filePath.substring(lastpos + 1);\n } else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n var size = 15;\n if (params[1])\n size = params[1];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.dirname(storeUrl)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n if (storeUrl === '') {\n config.macros.upload.defaultStoreScript;\n }\n if (config.lib.file.dirname(storeUrl) === '') {\n storeUrl = config.lib.file.dirname(document.location.toString())+'/'+storeUrl;\n }\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\n if(window.Components) {\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\n var response = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) { }\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data; name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir\n + ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data; name=\s"userfile\s"; filename=\s""+toFilename+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n //request.open("POST", storeUrl, true, username, password);\n request.open("POST", storeUrl, true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if (request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent);\n }\n };\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n request.open("GET", document.location.toString(), true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]));\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.shadowTiddlers.UploadPluginDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadPluginDoc ]]\sn"; \n\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n\nconfig.macros.saveChanges.handler_orig_UploadPlugin = config.macros.saveChanges.handler;\n\nconfig.macros.saveChanges.handler = function(place)\n{\n if ((!readOnly) && (document.location.toString().substr(0,4) != "http"))\n createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);\n}\n\n//}}}\n////===
\nThe "G" in Gnu. The "K" in knowledge, knee, and ktrey.
<!---\n| Name:|~TagglyTaggingViewTemplate |\n| Version:|1.2 (16-Jan-2006)|\n| Source:|http://simonbaird.com/mptw/#TagglyTaggingViewTemplate|\n| Purpose:|See TagglyTagging for more info|\n| Requires:|You need the CSS in TagglyTaggingStyles to make it look right|\n!History\n* 16-Jan-06, version 1.2, added tagglyListWithSort\n* 12-Jan-06, version 1.1, first version\n!Notes\nRemove the miniTag if you don't like it or you don't use QuickOpenTagPlugin\n--->\n<!--{{{-->\n<div>\n <span class='title' style='float:left;' macro='view title'></span>\n <span style='float:left;' macro='dropTagging "" {{config.macros.dropTagging.dropdownchar}}'></span>\n <span style='float:right;' class='subtitle'>\n <span style="color:#000;font-weight:bold;" macro='view created date [[MMM DD, YYYY]]'></span> \n (last modified: <span macro='view modified date [[MM-DD-YY]]'></span>)\n by <span macro='view modifier link'></span>\n </span>\n <span class='toolbar' style='clear:right;margin-top:3px;float:right;'\n macro='toolbar -closeTiddler +editTiddler collapseTiddler collapseOthers deleteTiddler closeOthers fullscreen permalink references jump'>\n <span macro='tagger label:"tags"'></span>\n </span>\n <div class='tagClear'></div>\n</div>\n<hr style="color:#fff;height:0px;border:1px solid #ffcccc;margin-bottom:5px;">\n<div class='collapse'>\n<div class='tagClear viewer' macro='view text wikified'></div>\n<hr style="color:#fff;height:0px;border:1px solid #eee;margin-bottom:5px;">\n<div><span style="float:right;font-family:arial;" class='comments' macro='haloscan comments'></span></div>\n<br/>\n</div>\n<!--}}}-->\n
[<img[Viva Voce - Get Yr Blood Sucked Out|http://image.allmusic.com/00/amg/cov200/drh500/h567/h56779dwe8t.jpg]]I'm sure that everyone remembers that moment in the film adaptation of Nick Hornby's //High Fidelity// when John Cusack brags "I will now sell five copies of The Three ~EPs by The Beta Band" simply by playing a certain song. Never mind that the portion played of song in question, "Dry The Rain" is somewhere in the middle of the track. Well, [[Get Yr Blood Sucked Out|Viva Voce - Get Yr Blood Sucked Out]] opens with a song that bears more than a passing resemblance to that memorable bit of audio. "Believer"s methodical cadenced percussion, has elsewhere been compared to Black Rebel Motorcycle Club, I stand by [[Candace]]'s skillfully spotted parallels to "Dry The Rain."\n\nThe album title is repeated ad nauseum in "From the Devil Himself," a song which instantaneously earworms me with BJ Thomas' "(Hey Won't You Play) Another Somebody Done Somebody Wrong Song" it may be a stretch for some, but I can't for the life of me divorce these two songs after making that connection. Sort've like the time somebody told me that root beer tastes like toothpaste.\n\n"Drown Me Out" showcases some lovely vocals by one half of the husband-wife duo Anita Robinson, even if it does summon to mind up the girl band craze of the mid-nineties. There's a horn-happy bridge towards the end of "So Many Miles" that in passing almost seems out of place, until one remembers the title of the song, and the brain struggles to put a finger on it's familiarity. Yep, there it is, I know Sam & Dave did it best, but I feel that this particular bit was purloined from Edwin Starr's seminal soul song "25 Miles." If intentional, this is a brilliant bit of meta-music.\n\nAlthough it takes a bit to build, the chorus in "We Do Not Fuck Around" is completely worth the wait. "Faster Than A Dead Horse" also showcases the vocals of both band members, and has some very Yo La Tengo feedback guitar fuzz throughout. The piano parts and trickling guitar in "Never Be Like Yesterday" are also nice.\n\nThe album ends on a mix of morose and triumphant with "How to Nurse a Bruised Ego Back to Health," five minutes of Pink Floyd-in-places stoner rock, complete with murmured, barely intelligible, but beautiful vocals.\n\nIn Italian, the band name translates into "by word of mouth." Well, hopefully you didn't hear about 'em from me.\n\n@@display:block;text-align:center;font-size:1.5em;Four Stars ([[★★★★☆]]).@@\n
Vladimir Vladimirovich Nabokov (Russian: Владимир Владимирович Набоков; [[pronounced [vlʌˈdʲimʲɪr nʌˈbokəf]]) (April 22 [O.S. April 10] 1899, Saint Petersburg – July 2, 1977, Montreux) was a ~Russian-American author. He wrote his first literary works in Russian, but rose to international prominence as a masterly prose stylist for the novels he composed in English. He is also noted for having made significant contributions to lepidoptery and created a number of ChessProblems.\n\nHe also liked IndexCards.
Welcome to my TiddlySpot TiddlyWiki.\n\nI've half-heartedly started several of these things over the years, and as enamored as I am with the concept of MicroContent, I fear I'm simply far to long-winded to adopt or adapt to that style of composition.\n\nFirst, a brief run down/explanation: This is a Tiddler. A Tiddler is a chunk of content. This page is composed of Tiddlers.\n\nWhen one hovers the mouse over a Tiddler a menu of options appears. This is the ToolBar. \n\nFold allows you to "fold" up a Tiddler so that only the title is displayed. \nOnce folded, unfold unfolds the Tiddler. \n\nThe FullScreenPlugin (access by clicking on the "↕ " when hovering over a Tiddler) should help make some of the longer entries a bit more user-friendly. We'll have to see.\n\nTiddlers can be re-arranged by drag-and-dropping on the title (thanks to the RearrangeTiddlersPlugin).\n\n<<tiddler [[TiddlyWikiStyle]]>>\n\nAlso, I'm obsessed with [[Footnotes]]+++^50em^[1]<<moveablePanel>>//...obsessed with Footnotes.//\n----\n<<tiddler Footnotes>>\n===\n.\n\nIf all goes well, this will fitfully fill the niche of blog, to-do list, and a clearing-house for all my other foolish contributions to the frass of the world wide webs.\n\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.\nFind out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. 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.\n\n@@font-weight:bold;font-size:1.3em;color:#444; //Settings// &nbsp;&nbsp;@@Make sure you enter your password here.\n<<tiddler tiddlyspotControls>>\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 "save to web" 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 "upload" and your ~TiddlyWiki will be saved back to 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.
/***\n|''Name:''|WikiBar|\n|''Version:''|2.0.0 beta3|\n|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|\n|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|\n|''Type:''|toolbar macro command extension|\n|''Required:''|TiddlyWiki 2.0.0 beta6|\n!Description\nWikiBar is a toolbar that gives access to most of TiddlyWiki's formatting features with a few clicks. It's a handy tool for people who are not familiar with TiddlyWiki syntax.\nBesides, with WikiBar-addons, users can extend the power of WikiBar.\n!Support browser\n*Firefox 1.5\n!Revision history\n*v2.0.0 beta3 (2005/12/30)\n** remove macros (replaced by TWMacro addon)\n** add wikibar command in toolbar automatically\n** rename DOIT to HANDLER\n** rename TIP to TOOLTIP\n*v2.0.0 beta2 (2005/12/21)\n** re-design Wikibar addon framework\n*v2.0.0 beta1 (2005/12/14)\n** Note:\n*** WikiBarPlugin is renamed to WikiBar\n** New Features:\n*** support TiddlyWiki 2.0.0 template mechanism\n*** new wikibar data structure\n*** new wikibar-addon framework for developers\n**** support dynamic popup menu generator\n*** support most new macros added in TiddlyWiki 2.0.0\n*** multi-level popup menu\n*** fix wikibar tab stop\n*** remove paletteSelector\n** Known Bugs:\n*** popup-menu and color-picker can't be closed correctly\n*** some macros can't be displayed correctly in previewer\n*** text in previewer will be displayed italic\n*v1.2.0 (2005/11/21)\n**New Features:\n***User defined color palettes supported\n####Get color palettes from [[ColorZilla Palettes|http://www.iosart.com/firefox/colorzilla/palettes.html]].\n####Save the palette file(*.gpl) as a new tiddler and tag it with 'ColorPalettes', then you can use it in WikiBar.\n***WikiBar style sheet supported\n***Click on document to close current colorPicker, paletteSelector or aboutWikibar\n*v1.1.1 (2005/11/03)\n**Bugs fixed:\n***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'\n*v1.1.0 (2005/11/01)\n**Bugs fixed:\n***WikiBar overruns (reported by by GeoffS <gslocock@yahoo.co.uk>)\n**New features:\n***Insert a color code at the cursor. (Thanks to RunningUtes <RunningUtes@gmail.com>)\n***Enable gradient macro. (Thanks to RunningUtes <RunningUtes@gmail.com>)\n***Insert tiddler comment tags {{{/% ... %/}}}. (new feature supported by TiddlyWiki 1.2.37)\n***Insert DateFormatString for {{{<<today>>}}} macro. (new feature supported by TiddlyWiki 1.2.37)\n**Enhanced:\n***Allow optional parameters in syntax.\n**Bugs:\n***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'\n*v1.0.0 (2005/10/30)\n**Initial release\n!Code\n***/\n//{{{\nconfig.macros.wikibar = {major: 2, minor: 0, revision: 0, beta: 3, date: new Date(2005,12,30)};\nconfig.macros.wikibar.handler = function(place,macroName,params,wikifier,paramString,tiddler){\n if(!(tiddler instanceof Tiddler)) {return;}\n story.setDirty(tiddler.title,true);\n place.id = 'wikibar'+tiddler.title;\n place.className = 'toolbar wikibar';\n};\nfunction wikibar_install(){\n config.commands.wikibar = {\n text: 'wikibar',\n tooltip: 'wikibar on/off',\n handler: function(e,src,title) {\n if(!e){ e = window.event; }\n var theButton = resolveTarget(e);\n theButton.id = 'wikibarButton'+title;\n wikibarPopup.remove();\n wikibar_installAddons(theButton, title);\n wikibar_createWikibar(title);\n return(false);\n }\n };\n config.shadowTiddlers['EditTemplate'] = wikibar_addWikibarCommand(config.shadowTiddlers['EditTemplate']);\n var tiddler = store.getTiddler('EditTemplate');\n if(tiddler){\n tiddler.text = wikibar_addWikibarCommand(tiddler.text);\n }\n}\nfunction wikibar_installAddons(theButton, title){\n var tiddlers = store.getTaggedTiddlers('wikibarAddons');\n if(!tiddlers) { return; }\n theButton.addons=[];\n for(var i=0; i<tiddlers.length; i++){\n try{\n eval(tiddlers[i].text);\n try{\n wikibar_addonInstall(title);\n wikibar_addonInstall = null;\n theButton.addons.push({ok:true, name:tiddlers[i].title});\n }catch(ex){\n theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});\n }\n }catch(ex){\n theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});\n }\n }\n}\nfunction wikibar_addWikibarCommand(tiddlerText){\n var div = document.createElement('div');\n div.style.display = 'none';\n div.innerHTML = tiddlerText;\n for(var i=0; i<div.childNodes.length; i++){\n var o=div.childNodes[i];\n if(o.tagName==='DIV'){\n if(o.className=='toolbar'){\n var macroText = o.getAttribute('macro').trim();\n if(macroText.search('wikibar')<=0){\n macroText += ' wikibar';\n o.setAttribute('macro', macroText);\n }\n break;\n }\n }\n }\n return div.innerHTML.replace(/\s"/g, "\s'");\n}\nfunction wikibar_processSyntaxParams(theSyntax, params){\n try{\n var pcr = 'AplWikibarPcr';\n var rx=null;\n var allParams=null;\n if(params){\n if(typeof(params)=='object'){\n for(var i=0; i<params.length; i++){\n if(params[i]){\n params[i] = params[i].replace(new RegExp('%','g'), pcr).trim();\n rx = '(\s\s[%'+(i+1)+'\s\s])' + '|' + '(%'+(i+1)+')';\n theSyntax = theSyntax.replace(new RegExp(rx,'g'), params[i] );\n }\n }\n allParams = params.join(' ').trim();\n }else{\n allParams = params.replace(new RegExp('%','g'), pcr).trim();\n rx = /(\s[%1{1}\s])|(%1{1})/g;\n theSyntax = theSyntax.replace(rx, allParams);\n }\n }\n if(allParams){\n theSyntax = theSyntax.replace(new RegExp('%N{1}','g'), allParams);\n }\n rx=/\s[%(([1-9]{1,}[0-9]{0,})|(N{1}))\s]/g;\n theSyntax = theSyntax.replace(rx, '');\n rx=/%(([1-9]{1,}[0-9]{0,})|(N{1}))/g;\n if( theSyntax.match(rx) ){\n throw 'Not enough parameters! ' + theSyntax;\n }\n theSyntax=theSyntax.replace(new RegExp(pcr,'g'), '%');\n return theSyntax;\n } catch(ex){\n return null;\n }\n}\nfunction wikibar_resolveEditItem(tiddlerWrapper, itemName){\n if(tiddlerWrapper.hasChildNodes()){\n var c=tiddlerWrapper.childNodes;\n for(var i=0; i<c.length; i++){\n var txt=wikibar_resolveEditItem(c[i], itemName);\n if(!txt){\n continue;\n }else{\n return txt;\n }\n }\n }\n return ((tiddlerWrapper.getAttribute && tiddlerWrapper.getAttribute('edit')==itemName)? tiddlerWrapper : null);\n}\nfunction wikibar_resolveEditItemValue(tiddlerWrapper, itemName){\n var o = wikibar_resolveEditItem(tiddlerWrapper, itemName);\n return (o? o.value.replace(/\sr/mg,'') : null);\n}\nfunction wikibar_resolveTiddlerEditorWrapper(obj){\n if(obj.id=='tiddlerDisplay'){return null;}\n if((obj.getAttribute && obj.getAttribute('macro')=='edit text')){return obj;}\n return wikibar_resolveTiddlerEditorWrapper(obj.parentNode);\n}\nfunction wikibar_resolveTiddlerEditor(obj){\n if(obj.hasChildNodes()){\n var c = obj.childNodes;\n for(var i=0; i<c.length; i++){\n var o=wikibar_resolveTiddlerEditor(c[i]);\n if(o){ return o;}\n }\n }\n return ((obj.getAttribute && obj.getAttribute('edit')=='text')? obj : null);\n}\nfunction wikibar_resolveTargetButton(obj){\n if(obj.id && obj.id.substring(0,7)=='wikibar'){ return null; }\n if(obj.tiddlerTitle){\n return obj;\n }else{\n return wikibar_resolveTargetButton(obj.parentNode);\n }\n}\nfunction wikibar_isValidMenuItem(tool){\n if(!tool){ return false; }\n if(tool.TYPE=='MENU' || tool.TYPE=='MAIN_MENU'){\n for(var key in tool){\n if(key.substring(0,8)=='DYNAITEM'){ return true; }\n if(wikibar_isValidMenuItem(tool[key])){ return true; }\n }\n return false;\n }else{\n return (tool.HANDLER? true : false);\n }\n}\nfunction wikibar_editFormat(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n else if(ss===0 && (se===0 || se == fullText.length) ){\n endText = fullText;\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByWord(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){return;}\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var selText = '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n frontText = fullText.substring(0, ss);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se, fullText.length);\n }\n else if(ss===0 && (se===0 || se == fullText.length) ){\n endText = fullText;\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n if(!( fullText.charAt(ss-1).match(/\sW/gi) || fullText.charAt(ss).match(/\sW/gi) )){\n var m = frontText.match(/\sW/gi);\n if(m){\n ss = frontText.lastIndexOf(m[m.length-1])+1;\n }\n else{\n ss = 0;\n }\n m = endText.match(/\sW/gi);\n if(m){\n se += endText.indexOf(m[0]);\n }\n else{\n se = fullText.length;\n }\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n selText = fullText.substring(ss,se);\n }\n }\n if(selText.length>0){\n repText = repText.replace('user_text', selText);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByCursor(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n else if(ss===0 && (se===0 || se == fullText.length) ){\n endText = fullText;\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByLine(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var selText = '';\n var endText = '';\n var fullText = editor.value;\n if(se>ss && ss>=0){\n if(this.byBlock){\n frontText = fullText.substring(0, ss);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se, fullText.length);\n }\n else{\n se = ss;\n }\n }\n if(ss===0 && (se===0 || se == fullText.length) ){\n var m=fullText.match(/(\sn|\sr)/g);\n if(m){\n se = fullText.indexOf(m[0]);\n }else{\n se = fullText.length;\n }\n selText = fullText.substring(0, se);\n endText = fullText.substring(se, fullText.length);\n }\n else if(se==ss && ss>0){\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n m = frontText.match(/(\sn|\sr)/g);\n if(m){\n ss = frontText.lastIndexOf(m[m.length-1])+1;\n }\n else{\n ss = 0;\n }\n m = endText.match(/(\sn|\sr)/g);\n if(m){\n se += endText.indexOf(m[0]);\n }\n else{\n se = fullText.length;\n }\n frontText = fullText.substring(0, ss);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se, fullText.length);\n }\n if(selText.length>0){\n repText = repText.replace('user_text', selText);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n if(this.byBlock){\n if( (frontText.charAt(frontText.length-1)!='\sn') && ss>0 ){\n repText = '\sn' + repText;\n }\n if( (endText.charAt(0)!='\sn') || se==fullText.length){\n repText += '\sn';\n }\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editFormatByTableCell(param){\n var editor = param.button.editor;\n var params = param.params;\n clearMessage();\n if(!editor){ return; }\n var repText = wikibar_processSyntaxParams(this.syntax, params);\n if(repText===null){ return; }\n var st = editor.scrollTop;\n var ss = editor.selectionStart;\n var se = editor.selectionEnd;\n var frontText= '';\n var selText = '';\n var endText = '';\n var fullText = editor.value;\n if(ss===0 || ss==fullText.length){\n throw 'not valid cell!';\n }\n se=ss;\n frontText = fullText.substring(0, ss);\n endText = fullText.substring(se, fullText.length);\n i=frontText.lastIndexOf('\sn');\n j=frontText.lastIndexOf('|');\n if(i>j || j<0){\n throw 'not valid cell!';\n }\n ss = j+1;\n i=endText.indexOf('\sn');\n j=endText.indexOf('|');\n if(i<j || j<0){\n throw 'not valid cell!';\n }\n se += j;\n frontText = fullText.substring(0, ss-1);\n selText = fullText.substring(ss,se);\n endText = fullText.substring(se+1, fullText.length);\n if(this.key.substring(0,5)=='align'){\n selText = selText.trim();\n if( selText=='>' || selText=='~' || selText.substring(0,8)=='bgcolor(') {return; }\n }\n if(selText.length>0){\n repText = repText.replace('user_text', selText);\n }\n if(repText.indexOf('user_text')>=0 && this.hint){\n repText = repText.replace('user_text', this.hint);\n }\n editor.value = frontText + repText + endText;\n editor.selectionStart = ss;\n editor.selectionEnd = ss + repText.length - 2;\n editor.scrollTop = st;\n editor.focus();\n}\nfunction wikibar_editSelectAll(param){\n var editor = param.button.editor;\n editor.selectionStart = 0;\n editor.selectionEnd = editor.value.length;\n editor.scrollTop = 0;\n editor.focus();\n}\nfunction wikibar_doPreview(param){\n var theButton = param.button;\n var editor = param.button.editor;\n var wikibar = theButton.parentNode;\n if(!wikibar) { return; }\n title = theButton.tiddlerTitle;\n var editorWrapper = wikibar_resolveTiddlerEditorWrapper(editor);\n var tiddlerWrapper = editorWrapper.parentNode;\n var previewer = document.getElementById('previewer'+title);\n if(previewer){\n previewer.parentNode.removeChild(previewer);\n editorWrapper.style.display = 'block';\n visible=true;\n }else{\n previewer = document.createElement('div');\n previewer.id = 'previewer'+title;\n previewer.className = 'viewer previewer';\n previewer.style.height = (editor.offsetHeight) + 'px';\n wikify(editor.value, previewer);\n tiddlerWrapper.insertBefore(previewer, editorWrapper);\n editorWrapper.style.display = 'none';\n visible=false;\n }\n var pv=null;\n for(var i=0; i<wikibar.childNodes.length; i++){\n try{\n var btn = wikibar.childNodes[i];\n if(btn.toolItem.key == 'preview'){ pv=btn; }\n if(btn.toolItem.key != 'preview'){\n btn.style.display = visible ? '': 'none';\n }\n }catch(ex){}\n }\n if(!pv) { return; }\n if(visible){\n pv.innerHTML = '<font face=\s"verdana\s">&infin;</font>';\n pv.title = 'preview current tiddler';\n }\n else{\n pv.innerHTML = '<font face=\s"verdana\s">&larr;</font>';\n pv.title = 'back to editor';\n }\n}\nfunction wikibar_doListAddons(param){\n clearMessage();\n var title = param.button.tiddlerTitle;\n var wikibarButton = document.getElementById('wikibarButton'+title);\n var ok=0, fail=0;\n for(var i=0; i<wikibarButton.addons.length; i++){\n var addon=wikibarButton.addons[i];\n if(addon.ok){\n displayMessage('[ o ] '+addon.name);\n ok++;\n }\n else{\n displayMessage('[ x ] '+addon.name + ': ' + addon.error);\n fail++;\n }\n }\n displayMessage('---------------------------------');\n displayMessage(ok + ' ok ; ' + fail + ' failed');\n}\nfunction wikibar_getColorCode(param){\n var cbOnPickColor = function(colorCode, param){\n param.params = colorCode;\n param.button.toolItem.doMore(param);\n };\n wikibarColorTool.openColorPicker(param.button, cbOnPickColor, param);\n}\nfunction wikibar_getLinkUrl(param){\n var url= prompt('Please enter the link target', (this.param? this.param : ''));\n if (url && url.trim().length>0){\n param.params = url;\n this.doMore(param);\n }\n}\nfunction wikibar_getTableRowCol(param){\n var rc= prompt('Please enter (rows x cols) of the table', '2 x 3');\n if (!rc || (rc.trim()).length<=0){ return; }\n var arr = rc.toUpperCase().split('X');\n if(arr.length != 2) { return; }\n for(var i=0; i<arr.length; i++){\n if(isNaN(arr[i].trim())) { return; }\n }\n var rows = parseInt(arr[0].trim(), 10);\n var cols = parseInt(arr[1].trim(), 10);\n var txtTable='';\n for(var r=0; r<rows; r++){\n for(var c=0; c<=cols; c++){\n if(c===0){\n txtTable += '|';\n }else{\n txtTable += ' |';\n }\n }\n txtTable += '\sn';\n }\n if(txtTable.trim().length>0){\n param.params = txtTable.trim();\n this.doMore(param);\n }\n}\nfunction wikibar_getMacroParam(param){\n var p = prompt('Please enter the parameters of macro \s"' + this.key + '\s":' +\n '\snSyntax: ' + this.syntax +\n '\sn\snNote: '+\n '\sn%1,%2,... - parameter needed'+\n '\sn[%1] - optional parameter'+\n '\sn%N - more than one parameter(1~n)'+\n '\sn[%N] - any number of parameters(0~n)'+\n '\sn\snPS:'+\n '\sn1. Parameters should be seperated with space character'+\n '\sn2. Use \s" to wrap the parameter that includes space character, ex: \s"hello world\s"'+\n '\sn3. Input the word(null) for the optional parameter ignored',\n (this.param? this.param : '') );\n if(!p) { return; }\n p=p.readMacroParams();\n for(var i=0; i<p.length; i++){\n var s=p[i].trim();\n if(s.indexOf(' ')>0){ p[i]="'"+s+"'"; }\n if(s.toLowerCase()=='null'){ p[i]=null; }\n }\n param.params = p;\n this.doMore(param);\n}\nfunction wikibar_getMorePalette(unused){\n clearMessage();\n displayMessage('Get more color palettes(*.gpl) from ColorZilla Palettes site', 'http:\s/\s/www.iosart.com/firefox/colorzilla/palettes.html');\n displayMessage('Save it as a new tiddler with \s"ColorPalettes\s" tag');\n}\nfunction wikibar_createWikibar(title){\n var theWikibar = document.getElementById('wikibar' + title);\n if(theWikibar){\n if(theWikibar.hasChildNodes()){\n theWikibar.style.display = (theWikibar.style.display=='block'? 'none':'block');\n return;\n }\n }\n var tiddlerWrapper = document.getElementById('tiddler'+title);\n var theTextarea = wikibar_resolveTiddlerEditor(tiddlerWrapper);\n if(!theTextarea){\n clearMessage();\n displayMessage('WikiBar only works in tiddler edit mode now');\n return;\n }else{\n if(!theTextarea.id){ theTextarea.id = 'editor'+title; }\n if(!theTextarea.parentNode.id){ theTextarea.parentNode.id='editorWrapper'+title; }\n }\n if(theWikibar){\n theWikibar = document.getElementById('wikibar'+title);\n }else{\n var editorWrapper = wikibar_resolveTiddlerEditorWrapper(theTextarea);\n theWikibar = createTiddlyElement(tiddlerWrapper, 'div', 'wikibar'+title, 'toolbar');\n addClass(theWikibar, 'wikibar');\n var previewer = document.getElementById('previewer'+title);\n if(previewer){\n tiddlerWrapper.insertBefore(theWikibar, previewer);\n }else{\n tiddlerWrapper.insertBefore(theWikibar, editorWrapper);\n }\n }\n wikibar_createMenu(theWikibar,wikibarStore,title,theTextarea);\n if(config.options['chkWikibarSetEditorHeight'] && config.options['txtWikibarEditorRows']){\n theTextarea.rows = config.options['txtWikibarEditorRows'];\n }\n setStylesheet(\n '.wikibar{text-align:left;visibility:visible;margin:2px;padding:1px;}.previewer{overflow:auto;display:block;border:1px solid;}#colorPicker{position:absolute;display:none;z-index:10;margin:0px;padding:0px;}#colorPicker table{margin:0px;padding:0px;border:2px solid #000;border-spacing:0px;border-collapse:collapse;}#colorPicker td{margin:0px;padding:0px;border:1px solid;font-size:11px;text-align:center;cursor:auto;}#colorPicker .header{background-color:#fff;}#colorPicker .button{background-color:#fff;cursor:pointer;cursor:hand;}#colorPicker .button:hover{padding-top:3px;padding-bottom:3px;color:#fff;background-color:#136;}#colorPicker .cell{padding:4px;font-size:7px;cursor:crosshair;}#colorPicker .cell:hover{padding:10px;}.wikibarPopup{position:absolute;z-index:10;border:1px solid #014;color:#014;background-color:#cef;}.wikibarPopup table{margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;}.wikibarPopup .button:hover{color:#eee;background-color:#014;}.wikibarPopup .disabled{color:#888;}.wikibarPopup .disabled:hover{color:#888;background-color:#cef;}.wikibarPopup tr .seperator hr{margin:0;padding:0;background-color:#cef;width:100%;border:0;border-top:1px dashed #014;}.wikibarPopup tr .icon{font-family:verdana;font-weight:bolder;}.wikibarPopup tr .marker{font-family:verdana;font-weight:bolder;}.wikibarPopup td{font-size:0.9em;padding:2px;}.wikibarPopup input{border:0;border-bottom:1px solid #014;margin:0;padding:0;font-family:arial;font-size:100%;background-color:#fff;}',\n 'WikiBarStyleSheet');\n}\nfunction wikibar_createMenu(place,toolset,title,editor){\n if(!wikibar_isValidMenuItem(toolset)){return;}\n if(!(toolset.TYPE=='MAIN_MENU' || toolset.TYPE=='MENU')){ return; }\n for(var key in toolset){\n if(key.substring(0,9)=='SEPERATOR'){\n wikibar_createMenuSeperator(place);\n continue;\n }\n if(key.substring(0,8)=='DYNAITEM'){\n var dynaTools = toolset[key](title,editor);\n if(dynaTools.TYPE && dynaTools.TYPE=='MENU'){\n wikibar_createMenuItem(place,dynaTools,null,editor,title);\n }else{\n dynaTools.TYPE = 'MENU';\n wikibar_createMenu(place, dynaTools, title, editor);\n }\n continue;\n }\n if((toolset[key].TYPE!='MENU' && toolset[key].TYPE!='MAIN_MENU') && !toolset[key].HANDLER){continue;}\n wikibar_createMenuItem(place,toolset,key,editor,title);\n }\n}\nfunction wikibar_createMenuItem(place,toolset,key,editor,title){\n if(!key){\n var tool = toolset;\n }else{\n tool = toolset[key];\n tool.key = key;\n }\n if(!wikibar_isValidMenuItem(tool)){return;}\n var toolIsOnMainMenu = (toolset.TYPE=='MAIN_MENU');\n var toolIsMenu = (tool.TYPE=='MENU');\n var theButton;\n if(toolIsOnMainMenu){\n theButton = createTiddlyButton(\n place,\n '',\n (tool.TOOLTIP? tool.TOOLTIP : ''),\n (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem),\n 'button');\n theButton.innerHTML = (tool.CAPTION? tool.CAPTION : key);\n theButton.isOnMainMenu = true;\n addClass(theButton, (toolIsMenu? 'menu' : 'item'));\n place.appendChild( document.createTextNode('\sn') );\n if(!toolIsMenu){\n if(config.options['chkWikibarPopmenuOnMouseOver']){\n theButton.onmouseover = function(e){ wikibarPopup.remove(); };\n }\n }\n }else{\n theButton=createTiddlyElement(place, 'tr',key,'button');\n theButton.title = (tool.TOOLTIP? tool.TOOLTIP : '');\n theButton.onclick = (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem);\n var tdL = createTiddlyElement(theButton, 'td','','marker');\n var td = createTiddlyElement(theButton, 'td');\n var tdR = createTiddlyElement(theButton, 'td','','marker');\n td.innerHTML = (tool.CAPTION? tool.CAPTION : key);\n if(toolIsMenu){\n tdR.innerHTML='&nbsp;&nbsp;&rsaquo;';\n }\n if(tool.SELECTED){\n tdL.innerHTML = '&radic; ';\n addClass(theButton, 'selected');\n }\n if(tool.DISABLED){\n addClass(theButton, 'disabled');\n }\n }\n theButton.tiddlerTitle = title;\n theButton.toolItem = tool;\n theButton.editor = editor;\n theButton.tabIndex = 999;\n if(toolIsMenu){\n if(config.options['chkWikibarPopmenuOnMouseOver']){\n theButton.onmouseover = wikibar_onClickMenuItem;\n }\n }\n}\nfunction wikibar_createMenuSeperator(place){\n if(place.id.substring(0,7)=='wikibar') { return; }\n var onclickSeperator=function(e){\n if(!e){ e = window.event; }\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n return(false);\n };\n var theButton=createTiddlyElement(place,'tr','','seperator');\n var td = createTiddlyElement(theButton, 'td','','seperator');\n td.colSpan=3;\n theButton.onclick=onclickSeperator;\n td.innerHTML = '<hr>';\n}\nfunction wikibar_genWikibarAbout(){\n var toolset={};\n toolset.version = {\n CAPTION: '<center>WikiBar ' +\n config.macros.wikibar.major + '.' +\n config.macros.wikibar.minor + '.' +\n config.macros.wikibar.revision +\n (config.macros.wikibar.beta? ' beta '+config.macros.wikibar.beta : '') +\n '</center>',\n HANDLER: function(){}\n };\n toolset.SEPERATOR = {};\n toolset.author = {\n CAPTION: '<center>Arphen Lin<br>arphenlin@gmail.com</center>',\n TOOLTIP: 'send mail to the author',\n HANDLER: function(){ window.open('mailto:arphenlin@gmail.com'); }\n };\n toolset.website = {\n CAPTION: '<center>aiddlywiki.sourceforge.net</center>',\n TOOLTIP: 'go to the web site of WikiBar',\n HANDLER: function(){ window.open('http:\s/\s/aiddlywiki.sourceforge.net/'); }\n };\n return toolset;\n}\nfunction wikibar_genWikibarOptions(title, editor){\n var toolset={};\n toolset.popOnMouseOver = {\n CAPTION:'popup menu on mouse over',\n SELECTED: config.options['chkWikibarPopmenuOnMouseOver'],\n HANDLER: function(param){\n config.options['chkWikibarPopmenuOnMouseOver'] = !config.options['chkWikibarPopmenuOnMouseOver'];\n saveOptionCookie('chkWikibarPopmenuOnMouseOver');\n var title = param.button.tiddlerTitle;\n var wikibar = document.getElementById('wikibar'+title);\n if(wikibar){ wikibar.parentNode.removeChild(wikibar); }\n wikibar_createWikibar(title);\n }\n };\n toolset.setEditorSize = {\n CAPTION:'set editor height: <input id=\s"txtWikibarEditorRows\s" type=text size=1 MAXLENGTH=3 value=\s"' +\n (config.options['txtWikibarEditorRows']? config.options['txtWikibarEditorRows']:editor.rows) + '\s"> ok',\n HANDLER: function(param){\n var input = document.getElementById('txtWikibarEditorRows');\n if(input){\n var rows = parseInt(input.value, 10);\n if(!isNaN(rows)){\n var editor = param.button.editor;\n editor.rows = rows;\n }else{\n rows=config.maxEditRows;\n }\n config.options['txtWikibarEditorRows'] = rows;\n saveOptionCookie('txtWikibarEditorRows');\n config.maxEditRows = rows;\n }\n }\n };\n toolset.setEditorSizeOnLoadingWikibar = {\n CAPTION:'set editor height on loading wikibar',\n SELECTED: config.options['chkWikibarSetEditorHeight'],\n HANDLER: function(param){\n config.options['chkWikibarSetEditorHeight'] = !config.options['chkWikibarSetEditorHeight'];\n saveOptionCookie('chkWikibarSetEditorHeight');\n if(config.options['chkWikibarSetEditorHeight']){\n var rows = config.options['txtWikibarEditorRows'];\n if(!isNaN(rows)){ rows = 15; }\n var editor = param.button.editor;\n editor.rows = rows;\n config.options['txtWikibarEditorRows'] = rows;\n saveOptionCookie('txtWikibarEditorRows');\n }\n }\n };\n toolset.SEPERATOR = {};\n toolset.update = {\n CAPTION: 'check for updates',\n DISABLED: true,\n HANDLER: function(){}\n };\n return toolset;\n}\nfunction wikibar_genPaletteSelector(){\n try{\n var cpTiddlers = store.getTaggedTiddlers('ColorPalettes');\n if(!cpTiddlers) { return; }\n var palettes=[];\n palettes.push(wikibarColorTool.defaultPaletteName);\n for(var i=0; i<cpTiddlers.length; i++){\n palettes.push(cpTiddlers[i].title.trim());\n }\n var toolset={};\n for(i=0; i<palettes.length; i++){\n toolset[palettes[i]] = {\n TOOLTIP: palettes[i],\n SELECTED: (palettes[i]==wikibarColorTool.paletteName),\n HANDLER: wikibar_doSelectPalette\n };\n }\n return toolset;\n }catch(ex){ return null; }\n}\nfunction wikibar_onClickItem(e){\n if(!e){ e = window.event; }\n var theTarget = resolveTarget(e);\n if(theTarget.tagName=='INPUT'){\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n return;\n }\n var theButton = wikibar_resolveTargetButton(theTarget);\n if(!theButton){ return(false); }\n var o = theButton.toolItem;\n if(!o) { return; }\n var param = {\n event: e,\n button: theButton\n };\n if(o.HANDLER){ o.HANDLER(param); }\n if(o.DISABLED){\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n }\n return(false);\n}\nfunction wikibar_onClickMenuItem(e){\n if(!e){ e = window.event; }\n var theButton = wikibar_resolveTargetButton(resolveTarget(e));\n if(!theButton){ return(false); }\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n var title = theButton.tiddlerTitle;\n var editor = theButton.editor;\n var tool = theButton.toolItem;\n if(!tool) { return; }\n var popup = wikibarPopup.create(this);\n if(popup){\n wikibar_createMenu(popup,tool,title,editor);\n if(!popup.hasChildNodes()){\n wikibarPopup.remove();\n }else{\n wikibarPopup.show(popup, false);\n }\n }\n return(false);\n}\nvar wikibarColorTool = {\n defaultPaletteName : 'default',\n defaultColumns : 16,\n defaultPalette : [\n '#FFF','#DDD','#CCC','#BBB','#AAA','#999','#666','#333','#111','#000','#FC0','#F90','#F60','#F30','#C30','#C03',\n '#9C0','#9D0','#9E0','#E90','#D90','#C90','#FC3','#FC6','#F96','#F63','#600','#900','#C00','#F00','#F36','#F03',\n '#CF0','#CF3','#330','#660','#990','#CC0','#FF0','#C93','#C63','#300','#933','#C33','#F33','#C36','#F69','#F06',\n '#9F0','#CF6','#9C3','#663','#993','#CC3','#FF3','#960','#930','#633','#C66','#F66','#903','#C39','#F6C','#F09',\n '#6F0','#9F6','#6C3','#690','#996','#CC6','#FF6','#963','#630','#966','#F99','#F39','#C06','#906','#F3C','#F0C',\n '#3F0','#6F3','#390','#6C0','#9F3','#CC9','#FF9','#C96','#C60','#C99','#F9C','#C69','#936','#603','#C09','#303',\n '#0C0','#3C0','#360','#693','#9C6','#CF9','#FFC','#FC9','#F93','#FCC','#C9C','#969','#939','#909','#636','#606',\n '#060','#3C3','#6C6','#0F0','#3F3','#6F6','#9F9','#CFC','#9CF','#FCF','#F9F','#F6F','#F3F','#F0F','#C6C','#C3C',\n '#030','#363','#090','#393','#696','#9C9','#CFF','#39F','#69C','#CCF','#C9F','#96C','#639','#306','#90C','#C0C',\n '#0F3','#0C3','#063','#396','#6C9','#9FC','#9CC','#06C','#369','#99F','#99C','#93F','#60C','#609','#C3F','#C0F',\n '#0F6','#3F6','#093','#0C6','#3F9','#9FF','#699','#036','#039','#66F','#66C','#669','#309','#93C','#C6F','#90F',\n '#0F9','#6F9','#3C6','#096','#6FF','#6CC','#366','#069','#36C','#33F','#33C','#339','#336','#63C','#96F','#60F',\n '#0FC','#6FC','#3C9','#3FF','#3CC','#399','#033','#39C','#69F','#00F','#00C','#009','#006','#003','#63F','#30F',\n '#0C9','#3FC','#0FF','#0CC','#099','#066','#3CF','#6CF','#09C','#36F','#0CF','#09F','#06F','#03F','#03C','#30C'\n ],\n colorPicker : null,\n pickColorHandler: null,\n userData: null\n};\nwikibarColorTool.paletteName = wikibarColorTool.defaultPaletteName;\nwikibarColorTool.columns = wikibarColorTool.defaultColumns;\nwikibarColorTool.palette = wikibarColorTool.defaultPalette;\nwikibarColorTool.onPickColor = function(e){\n if (!e){ e = window.event; }\n var theCell = resolveTarget(e);\n if(!theCell){ return(false); }\n color = theCell.bgColor.toLowerCase();\n if(!color) { return; }\n wikibarColorTool.displayColorPicker(false);\n if(wikibarColorTool.pickColorHandler){\n wikibarColorTool.pickColorHandler(color, wikibarColorTool.userData);\n }\n return(false);\n};\nwikibarColorTool.onMouseOver = function(e){\n if (!e){ e = window.event; }\n var theButton = resolveTarget(e);\n if(!theButton){ return(false); }\n if(!wikibarColorTool) { return; }\n color = theButton.bgColor.toUpperCase();\n if(!color) { return; }\n td=document.getElementById('colorPickerInfo');\n if(!td) { return; }\n td.bgColor = color;\n td.innerHTML = '<span style=\s"color:#000;\s">'+color+'</span>&nbsp;&nbsp;&nbsp;' +\n '<span style=\s"color:#fff;\s">'+color+'</span>';\n e.cancelBubble = true;\n if (e.stopPropagation){ e.stopPropagation(); }\n return(false);\n};\nwikibarColorTool.openColorPicker = function(theTarget, pickColorHandler, userData){\n wikibarColorTool.skipClickDocumentEvent = true;\n wikibarColorTool.pickColorHandler = pickColorHandler;\n wikibarColorTool.userData = userData;\n wikibarColorTool.moveColorPicker(theTarget);\n};\nwikibarColorTool.convert3to6HexColor = function(c){\n c=c.trim();\n var rx=/^\s#(\sd|[a-f])(\sd|[a-f])(\sd|[a-f])$/gi;\n return (rx.test(c)? c.replace(rx, '#$1$1$2$2$3$3') : c);\n};\nwikibarColorTool.numToHexColor = function (n){\n if(typeof(n)=='number' && (n>=0 && n<=255)) {\n s = n.toString(16).toLowerCase();\n return ((s.length==1)? '0'+s : s);\n }else{\n return null;\n }\n};\nwikibarColorTool.renderColorPalette = function(){\n if(wikibarColorTool.paletteName==wikibarColorTool.defaultPaletteName){\n wikibarColorTool.palette=wikibarColorTool.defaultPalette;\n wikibarColorTool.columns=wikibarColorTool.defaultColumns;\n return;\n }\n tiddlerText = (store.getTiddlerText(wikibarColorTool.paletteName, '')).trim();\n if(tiddlerText.length<=0) { return; }\n var cpContents = tiddlerText.split('\sn');\n var colors=[];\n columns = wikibarColorTool.defaultColumns;\n var tmpArray=null;\n errCount=0;\n for(var i=0; i<cpContents.length; i++){\n cpLine=cpContents[i].trim();\n if( (!cpLine) || (cpLine.length<=0) || (cpLine.charAt(0) == '#') ){ continue; }\n if(cpLine.substring(0,8).toLowerCase()=='columns:'){\n tmpArray = cpLine.split(':');\n try{\n columns = parseInt(tmpArray[1],10);\n }catch(ex){\n columns = wikibarColorTool.defaultColumns;\n }\n }else{\n tmpArray = cpLine.replace('\st', ' ').split(/[ ]{1,}/);\n try{\n color='';\n for(var j=0; j<3; j++){\n c=parseInt(tmpArray[j].trim(), 10);\n if(isNaN(c)){\n break;\n }else{\n c=wikibarColorTool.numToHexColor(c);\n if(!c) {break;}\n color+=c;\n }\n }\n if(color.length==6){\n colors.push('#'+color);\n } else {\n throw 'error';\n }\n }catch(ex){\n }\n }\n }\n if(colors.length>0){\n wikibarColorTool.palette = colors;\n wikibarColorTool.columns = columns;\n }else{\n throw 'renderColorPalette(): No color defined in the palette.';\n }\n};\nwikibarColorTool.displayColorPicker = function(visible){\n if(wikibarColorTool.colorPicker){\n wikibarColorTool.colorPicker.style.display = (visible? 'block' : 'none');\n }\n};\nwikibarColorTool.moveColorPicker = function(theTarget){\n if(!wikibarColorTool.colorPicker){\n wikibarColorTool.createColorPicker();\n }\n var cp = wikibarColorTool.colorPicker;\n var rootLeft = findPosX(theTarget);\n var rootTop = findPosY(theTarget);\n var popupLeft = rootLeft;\n var popupTop = rootTop;\n var popupWidth = cp.offsetWidth;\n var winWidth = findWindowWidth();\n if(popupLeft + popupWidth > winWidth){\n popupLeft = winWidth - popupWidth;\n }\n cp.style.left = popupLeft + 'px';\n cp.style.top = popupTop + 'px';\n wikibarColorTool.displayColorPicker(true);\n};\nwikibarColorTool.createColorPicker = function(unused, palette){\n if(palette){ wikibarColorTool.paletteName=palette; }\n wikibarColorTool.renderColorPalette();\n wikibarColorTool.colorPicker = document.createElement('div');\n wikibarColorTool.colorPicker.id = 'colorPicker';\n document.body.appendChild(wikibarColorTool.colorPicker);\n var theTable = document.createElement('table');\n wikibarColorTool.colorPicker.appendChild(theTable);\n var theTR = document.createElement('tr');\n theTable.appendChild(theTR);\n var theTD = document.createElement('td');\n theTD.className = 'header';\n theTD.colSpan = wikibarColorTool.columns;\n theTD.innerHTML = wikibarColorTool.paletteName;\n theTR.appendChild(theTD);\n for(var i=0; i<wikibarColorTool.palette.length; i++){\n if((i%wikibarColorTool.columns)===0){\n theTR = document.createElement('tr');\n theTable.appendChild(theTR);\n }\n theTD = document.createElement('td');\n theTD.className = 'cell';\n theTD.bgColor = wikibarColorTool.convert3to6HexColor(wikibarColorTool.palette[i]);\n theTD.onclick = wikibarColorTool.onPickColor;\n theTD.onmouseover = wikibarColorTool.onMouseOver;\n theTR.appendChild(theTD);\n }\n rest = wikibarColorTool.palette.length % wikibarColorTool.columns;\n if(rest>0){\n theTD = document.createElement('td');\n theTD.colSpan = wikibarColorTool.columns-rest;\n theTD.bgColor = '#000000';\n theTR.appendChild(theTD);\n }\n theTR = document.createElement('tr');\n theTable.appendChild(theTR);\n theTD = document.createElement('td');\n theTD.colSpan = wikibarColorTool.columns;\n theTD.id = 'colorPickerInfo';\n theTR.appendChild(theTD);\n};\nwikibarColorTool.onDocumentClick = function(e){\n if (!e){ e = window.event; }\n if(wikibarColorTool.skipClickDocumentEvent) {\n wikibarColorTool.skipClickDocumentEvent = false;\n return true;\n }\n if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){\n wikibarColorTool.displayColorPicker(false);\n }\n return true;\n};\nfunction wikibar_doSelectPalette(param){\n clearMessage();\n var theButton = param.button;\n if(!theButton.toolItem.key) { return; }\n var palette = theButton.toolItem.key;\n var oldPaletteName = wikibarColorTool.paletteName;\n if(oldPaletteName != palette){\n try{\n wikibarColorTool.createColorPicker(theButton, palette);\n displayMessage('Palette \s"'+palette+'\s" ('+ wikibarColorTool.palette.length +' colors) is selected');\n }catch(ex){\n errMsg = ex;\n if(errMsg.substring(0,18)=='renderColorPalette'){\n displayMessage('Invalid palette \s"' + palette + '\s", please check it out!');\n wikibarColorTool.createColorPicker(theButton, oldPaletteName);\n }\n }\n }\n}\nvar wikibarPopup = {\n skipClickDocumentEvent: false,\n stack: []\n};\nwikibarPopup.resolveRootPopup = function(o){\n if(o.isOnMainMenu){ return null; }\n if(o.className.substring(0,12)=='wikibarPopup'){ return o;}\n return wikibarPopup.resolveRootPopup(o.parentNode);\n};\nwikibarPopup.create = function(root){\n for(var i=0; i<wikibarPopup.stack.length; i++){\n var p=wikibarPopup.stack[i];\n if(p.root==root){\n wikibarPopup.removeFrom(i+1);\n return null;\n }\n }\n var rootPopup = wikibarPopup.resolveRootPopup(root);\n if(!rootPopup){\n wikibarPopup.remove();\n }else{\n wikibarPopup.removeFromRootPopup(rootPopup);\n }\n var popup = createTiddlyElement(document.body,'div','wikibarPopup'+root.toolItem.key,'wikibarPopup');\n var pop = createTiddlyElement(popup,'table','','');\n wikibarPopup.stack.push({rootPopup: rootPopup, root: root, popup: popup});\n return pop;\n};\nwikibarPopup.show = function(unused,slowly){\n var curr = wikibarPopup.stack[wikibarPopup.stack.length-1];\n var overlayWidth = 1;\n var rootLeft, rootTop, rootWidth, rootHeight, popupLeft, popupTop, popupWidth;\n if(curr.rootPopup){\n rootLeft = findPosX(curr.rootPopup);\n rootTop = findPosY(curr.root);\n rootWidth = curr.rootPopup.offsetWidth;\n popupLeft = rootLeft + rootWidth - overlayWidth;\n popupTop = rootTop;\n }else{\n rootLeft = findPosX(curr.root);\n rootTop = findPosY(curr.root);\n rootHeight = curr.root.offsetHeight;\n popupLeft = rootLeft;\n popupTop = rootTop + rootHeight;\n }\n var winWidth = findWindowWidth();\n popupWidth = curr.popup.offsetWidth;\n if(popupLeft + popupWidth > winWidth){\n popupLeft = rootLeft - popupWidth + overlayWidth;\n }\n curr.popup.style.left = popupLeft + 'px';\n curr.popup.style.top = popupTop + 'px';\n curr.popup.style.display = 'block';\n addClass(curr.root, 'highlight');\n if(config.options.chkAnimate){\n anim.startAnimating(new Scroller(curr.popup,slowly));\n }else{\n window.scrollTo(0,ensureVisible(curr.popup));\n }\n};\nwikibarPopup.remove = function(){\n if(wikibarPopup.stack.length > 0){\n wikibarPopup.removeFrom(0);\n }\n};\nwikibarPopup.removeFrom = function(from){\n for(var t=wikibarPopup.stack.length-1; t>=from; t--){\n var p = wikibarPopup.stack[t];\n removeClass(p.root,'highlight');\n p.popup.parentNode.removeChild(p.popup);\n }\n wikibarPopup.stack = wikibarPopup.stack.slice(0,from);\n};\nwikibarPopup.removeFromRootPopup = function(from){\n for(var t=0; t<wikibarPopup.stack.length; t++){\n var p = wikibarPopup.stack[t];\n if(p.rootPopup==from){\n wikibarPopup.removeFrom(t);\n break;\n }\n }\n};\nwikibarPopup.onDocumentClick = function(e){\n if (!e){ e = window.event; }\n if(wikibarPopup.skipClickDocumentEvent){\n wikibarPopup.skipClickDocumentEvent=false;\n return true;\n }\n if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){\n wikibarPopup.remove();\n }\n return true;\n};\nvar wikibarStore = {\n TYPE: 'MAIN_MENU',\n help:{\n TYPE:'MENU',\n CAPTION: '<font face=\s"verdana\s">?</font>',\n TOOLTIP: 'about WikiBar',\n options:{\n TYPE:'MENU',\n DYNAITEM: wikibar_genWikibarOptions\n },\n about:{\n TYPE:'MENU',\n DYNAITEM: wikibar_genWikibarAbout\n }\n },\n preview:{\n TOOLTIP: 'preview this tiddler',\n CAPTION: '<font face=\s"verdana\s">&infin;</font>',\n HANDLER: wikibar_doPreview\n },\n line:{\n TOOLTIP: 'horizontal line',\n CAPTION: '<font face=\s"verdana\s">&mdash;</font>',\n syntax: '\sn----\sn',\n HANDLER: wikibar_editFormatByCursor\n },\n crlf:{\n TOOLTIP: 'new line',\n CAPTION: '<font face=\s"verdana\s">&para;</font>',\n syntax: '\sn',\n HANDLER: wikibar_editFormatByCursor\n },\n selectAll:{\n TOOLTIP: 'select all',\n CAPTION: '<font face=\s"verdana\s">&sect;</font>',\n HANDLER: wikibar_editSelectAll\n },\n deleteSelected:{\n TOOLTIP: 'delete selected',\n CAPTION: '<font face=\s"verdana\s">&times;</font>',\n syntax: '',\n HANDLER: wikibar_editFormat\n },\n textFormat:{\n TYPE: 'MENU',\n CAPTION: 'text',\n TOOLTIP: 'text formatters',\n ignore:{\n TOOLTIP: 'ignore wiki word',\n CAPTION: 'ignore wikiWord',\n syntax: '~user_text',\n hint: 'wiki_word',\n HANDLER: wikibar_editFormatByWord\n },\n bolder:{\n TOOLTIP: 'bolder text',\n CAPTION: '<strong>bolder</strong>',\n syntax: "''user_text''",\n hint: 'bold_text',\n HANDLER: wikibar_editFormatByWord\n },\n italic:{\n TOOLTIP: 'italic text',\n CAPTION: '<em>italic</em>',\n syntax: '\s/\s/user_text\s/\s/',\n hint: 'italic_text',\n HANDLER: wikibar_editFormatByWord\n },\n underline:{\n TOOLTIP: 'underline text',\n CAPTION: '<u>underline</u>',\n syntax: '__user_text__',\n hint: 'underline_text',\n HANDLER: wikibar_editFormatByWord\n },\n strikethrough:{\n TOOLTIP: 'strikethrough text',\n CAPTION: '<strike>strikethrough</strike>',\n syntax: '==user_text==',\n hint: 'strikethrough_text',\n HANDLER: wikibar_editFormatByWord\n },\n superscript:{\n TOOLTIP: 'superscript text',\n CAPTION: 'X<sup>superscript</sup>',\n syntax: '^^user_text^^',\n hint: 'superscript_text',\n HANDLER: wikibar_editFormatByWord\n },\n subscript:{\n TOOLTIP: 'subscript text',\n CAPTION: 'X<sub>subscript</sub>',\n syntax: '~~user_text~~',\n hint: 'subscript_text',\n HANDLER: wikibar_editFormatByWord\n },\n comment:{\n TOOLTIP: 'comment text',\n CAPTION: 'comment text',\n syntax: '/%user_text%/',\n hint: 'comment_text',\n HANDLER: wikibar_editFormatByWord\n },\n monospaced:{\n TOOLTIP: 'monospaced text',\n CAPTION: '<code>monospaced</code>',\n syntax: '{{{user_text}}}',\n hint: 'monospaced_text',\n HANDLER: wikibar_editFormatByWord\n }\n },\n paragraph:{\n TYPE: 'MENU',\n TOOLTIP: 'paragarph formatters',\n list:{\n TYPE: 'MENU',\n TOOLTIP: 'list tools',\n bullet:{\n TOOLTIP: 'bullet point',\n syntax: '*user_text',\n hint: 'bullet_text',\n HANDLER: wikibar_editFormatByLine\n },\n numbered:{\n TOOLTIP: 'numbered list',\n syntax: '#user_text',\n hint: 'numbered_text',\n HANDLER: wikibar_editFormatByLine\n }\n },\n heading:{\n TYPE: 'MENU',\n heading1:{\n CAPTION:'<h1>Heading 1</h1>',\n TOOLTIP: 'Heading 1',\n syntax: '!user_text',\n hint: 'heading_1',\n HANDLER: wikibar_editFormatByLine\n },\n heading2:{\n CAPTION:'<h2>Heading 2<h2>',\n TOOLTIP: 'Heading 2',\n syntax: '!!user_text',\n hint: 'heading_2',\n HANDLER: wikibar_editFormatByLine\n },\n heading3:{\n CAPTION:'<h3>Heading 3</h3>',\n TOOLTIP: 'Heading 3',\n syntax: '!!!user_text',\n hint: 'heading_3',\n HANDLER: wikibar_editFormatByLine\n },\n heading4:{\n CAPTION:'<h4>Heading 4</h4>',\n TOOLTIP: 'Heading 4',\n syntax: '!!!!user_text',\n hint: 'heading_4',\n HANDLER: wikibar_editFormatByLine\n },\n heading5:{\n CAPTION:'<h5>Heading 5</h5>',\n TOOLTIP: 'Heading 5',\n syntax: '!!!!!user_text',\n hint: 'heading_5',\n HANDLER: wikibar_editFormatByLine\n }\n },\n comment:{\n TYPE: 'MENU',\n commentByLine:{\n CAPTION:'comment by line',\n TOOLTIP: 'line comment',\n syntax: '/%user_text%/',\n hint: 'comment_text',\n HANDLER: wikibar_editFormatByLine\n },\n commentByBlock:{\n CAPTION:'comment by block',\n TOOLTIP: 'block comment',\n syntax: '/%\snuser_text\sn%/',\n hint: 'comment_text',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n monospaced:{\n TYPE: 'MENU',\n monosByLine:{\n CAPTION: 'monospaced by line',\n TOOLTIP: 'line monospaced',\n syntax: '{{{\snuser_text\sn}}}',\n hint: 'monospaced_text',\n HANDLER: wikibar_editFormatByLine\n },\n monosByBlock:{\n CAPTION: 'monospaced by block',\n TOOLTIP: 'block monospaced',\n syntax: '{{{\snuser_text\sn}}}',\n hint: 'monospaced_text',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n quote:{\n TYPE: 'MENU',\n quoteByLine:{\n CAPTION: 'quote by line',\n TOOLTIP: 'line quote',\n syntax: '>user_text',\n hint: 'quote_text',\n HANDLER: wikibar_editFormatByLine\n },\n quoteByBlcok:{\n CAPTION: 'quote by block',\n TOOLTIP: 'block quote',\n syntax: '<<<\snuser_text\sn<<<',\n hint: 'quote_text',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n plugin:{\n TYPE: 'MENU',\n code:{\n CAPTION: 'code area',\n TOOLTIP: 'block monospaced for plugin',\n syntax: '\sn\s/\s/{{{\snuser_text\sn\s/\s/}}}\sn',\n hint: 'monospaced_plugin_code',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n },\n commentByLine:{\n CAPTION: 'comment by line',\n TOOLTIP: 'line comment',\n syntax: '\s/\s/user_text',\n hint: 'plugin_comment',\n HANDLER: wikibar_editFormatByLine\n },\n commentByBlock:{\n CAPTION: 'comment by block',\n TOOLTIP: 'block comment',\n syntax: '\s/\s***\snuser_text\sn***\s/',\n hint: 'plugin_comment',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n },\n css:{\n TYPE: 'MENU',\n code:{\n CAPTION: 'code area',\n TOOLTIP: 'block monospaced for css',\n syntax: '\sn\snuser_text\sn\sn',\n hint: 'monospaced_css_code',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n },\n commentByLine:{\n CAPTION: 'comment by line',\n TOOLTIP: 'line comment',\n syntax: '',\n hint: 'css_comment',\n HANDLER: wikibar_editFormatByLine\n },\n commentByBlock:{\n CAPTION: 'comment by block',\n TOOLTIP: 'block comment',\n syntax: '',\n hint: 'css_comment',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n }\n },\n color:{\n TYPE: 'MENU',\n TOOLTIP: 'color tools',\n highlight:{\n CAPTION:'highlight text',\n TOOLTIP: 'highlight text',\n syntax: '@@user_text@@',\n hint: 'highlight_text',\n HANDLER: wikibar_editFormatByWord\n },\n color:{\n CAPTION:'text color',\n TOOLTIP: 'text color',\n hint: 'your_text',\n syntax: '@@color(%1):user_text@@',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByWord\n },\n bgcolor:{\n CAPTION:'background color',\n TOOLTIP: 'background color',\n hint: 'your_text',\n syntax: '@@bgcolor(%1):user_text@@',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByWord\n },\n colorcode:{\n CAPTION:'color code',\n TOOLTIP: 'insert color code',\n syntax: '%1',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByCursor\n },\n 'color palette':{\n TYPE:'MENU',\n DYNAITEM: wikibar_genPaletteSelector,\n SEPERATOR:{},\n morePalette:{\n CAPTION:'more palettes',\n TOOLTIP:'get more palettes',\n HANDLER: wikibar_getMorePalette\n }\n }\n },\n link:{\n TYPE: 'MENU',\n TOOLTIP: 'insert link',\n wiki:{\n CAPTION:'wiki link',\n TOOLTIP: 'wiki link',\n syntax: '[[user_text]]',\n hint: 'wiki_word',\n HANDLER: wikibar_editFormatByWord\n },\n pretty:{\n CAPTION: 'pretty link',\n TOOLTIP: 'pretty link',\n syntax: '[[user_text|%1]]',\n hint: 'pretty_word',\n param: 'PrettyLink Target',\n HANDLER: wikibar_getLinkUrl,\n doMore: wikibar_editFormatByWord\n },\n url:{\n TOOLTIP: 'url link',\n syntax: '[[user_text|%1]]',\n hint: 'your_text',\n param: 'http:\s/\s/...',\n HANDLER: wikibar_getLinkUrl,\n doMore: wikibar_editFormatByWord\n },\n image:{\n TOOLTIP: 'image link',\n syntax: '[img[user_text|%1]]',\n hint: 'alt_text',\n param: 'image/icon.jpg',\n HANDLER: wikibar_getLinkUrl,\n doMore: wikibar_editFormatByWord\n }\n },\n macro:{},\n more:{\n TYPE: 'MENU',\n TOOLTIP: 'more tools',\n table:{\n TYPE: 'MENU',\n TOOLTIP: 'table',\n table:{\n CAPTION:'create table',\n TOOLTIP: 'create a new table',\n syntax: '\sn%1\sn',\n HANDLER: wikibar_getTableRowCol,\n doMore: wikibar_editFormatByWord\n },\n header:{\n TOOLTIP: 'table header text',\n syntax: '|user_text|c',\n hint: 'table_header',\n HANDLER: wikibar_editFormatByWord\n },\n cell:{\n TOOLTIP: 'create a tabel cell',\n syntax: '|user_text|',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByWord\n },\n columnHeader:{\n CAPTION:'column header',\n TOOLTIP: 'create a column header cell',\n syntax: '|!user_text|',\n hint: 'column_header',\n HANDLER: wikibar_editFormatByWord\n },\n cell:{\n TYPE: 'MENU',\n CAPTION: 'cell options',\n bgcolor:{\n CAPTION: 'background color',\n TOOLTIP: 'cell bgcolor',\n syntax: '|bgcolor(%1):user_text|',\n hint: 'your_text',\n HANDLER: wikibar_getColorCode,\n doMore: wikibar_editFormatByTableCell\n },\n alignLeft:{\n CAPTION: 'align left',\n TOOLTIP: 'left align cell text',\n syntax: '|user_text|',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByTableCell\n },\n alignCenter:{\n CAPTION: 'align center',\n TOOLTIP: 'center align cell text',\n syntax: '| user_text |',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByTableCell\n },\n alignRight:{\n CAPTION: 'align right',\n TOOLTIP: 'right align cell text',\n syntax: '| user_text|',\n hint: 'your_text',\n HANDLER: wikibar_editFormatByTableCell\n }\n }\n },\n html:{\n TYPE: 'MENU',\n html:{\n CAPTION: '&lt;html&gt;',\n TOOLTIP: 'html tag',\n syntax: '<html>\snuser_text\sn</html>',\n hint: 'html_content',\n byBlock: true,\n HANDLER: wikibar_editFormatByLine\n }\n }\n },\n addon:{\n TYPE: 'MENU',\n TOOLTIP:'3rd party tools',\n 'about addons':{\n TOOLTIP: 'list loaded addons',\n HANDLER: wikibar_doListAddons\n },\n SEPERATOR:{}\n }\n};\naddEvent(document, 'click', wikibarColorTool.onDocumentClick);\naddEvent(document, 'click', wikibarPopup.onDocumentClick);\nwikibar_install();\n//}}}
[<img[Zero 7 - The Garden|http://image.allmusic.com/00/amg/cov200/drh300/h316/h31662g9eqg.jpg]]I first heard of Zero 7 through their majestically triumphant remix of Lambchop's Up With People. 2004's When It Falls didn't get discovered until mid-2005, and therefore missed my list that year. I was determined not to let this release slip by.\n\nReleased in the States on the day before my birthday this year, [[The Garden|Zero 7 - The Garden]] found it's way onto the playlist and has managed to consistently please me with it's inoffensive mix of electronica and acoustic instrumentation. It seems that Zero 7 used to be this wonderful down-tempo band, and [[The Garden|Zero 7 - The Garden]] seems like an attempt to slowly start the arduous process of breaking away from that much maligned label. But with the selection of guest vocalists featured on [[The Garden|Zero 7 - The Garden]] it's hard not to use the words "mellow," "soulful" and "R&B-inspired".\n\nThe instrumental "Seeing Things" is like listening to all of my favorite Kraftwerk songs at once, I hear new echoes of "The Telephone Call," "Neon Lights," and "Pocket Calculator" with every listen. While "Left Behind" has a gorgeous acoustic guitar refrain.\n\nI really can't say enough about Sia Furler's vocal work on "This Fine Social Scene," this is a song I genuinely enjoy. The bombastic orchestration of "Your Place" is a bit much, but it finishes nicely.\n\nThe almost cheerful, sing-songy verses and chorus of "Waiting To Die" conjures up a pleasantly air-conditioned Decameron with a fully stocked open bar and indoor swimming pool. There's a degree of decadence and happy hedonism in this song. I don't think foreboding and doom has ever been so fun. If this is what the end of the world will be like, sign me up. I tend to prefer it to David Tibet's apocalyptic vision of cyclic damnation and redemption on this year's [[Black Ships Ate The Sky|Current 93 - Black Ships Ate The Sky]].\n\n@@display:block;text-align:center;font-size:1.5em;The album is currently deserving of it's full five stars ([[★★★★★]]) and is a contender for my [[Best Of|Best Of 2006]] list this year.@@\n
// //''Name:'' Calendar plugin\n// //''Version:'' <<getversion listTags>> (<<getversiondate listTags "DD MMM YYYY">>)\n// //''Author:'' SteveRumsby\n\n// //''Syntax:''\n// //<< {{{listTags tag //sort// //prefix//}}} >>\n\n// //''Description:''\n// //Generate a list of tiddlers tagged with the given tag.\n// //If both //sort// and //prefix// are omitted the list is sorted in increasing order of title, with one tiddler per line.\n// //If //sort// is specified the list is sorted in increasing order of the given tiddler property. Possible properties are: title. modified, modifier.\n// //If //prefix// is specified the given string is inserted before the tiddler title. The insertion happens before the text is wikified. This can be used to generated bulleted or numbered lists.\n\n// //''Examples:''\n// //<< {{{listTags usage}}} >> - generate a plain list of all tiddlers tagged with tag //usage//, sorted by title\n// //<< {{{listTags usage modified}}} >> - the same list, with most recently modified tiddlers last\n// //<< {{{listTags usage title #}}} >> - generate a numbered list if tiddlers tagged with //usage//, sorted by title\n\n// //''Code section:''\nversion.extensions.listTags = {major: 0, minor: 1, revision: 0, date: new Date(2005, 6,16)};\n\nconfig.macros.listTags = {\ntext: "Hello"\n};\n\nconfig.macros.listTags.handler = function(place,macroName,params)\n{\n var tagged = store.getTaggedTiddlers(params[0], params[1]);\n var string = "";\n for(var r=0;r<tagged.length;r++)\n {\n if(params[2]) string = string + params[2] + " ";\n string = string + "[[" + tagged[r].title + "]]\sn";\n }\n wikify(string, place, null, null);\n}
Here's a handy poem (Composed by [[Nabokov|VladimirNabokov]] himself I believe) to help you say the name correctly:\n\n> The querulous gawk of\n> A heron at night\n> Prompts Nabokov\n> To write.
| tiddlyspot password:|<<option pasUploadPassword>>|\n| site management:|<<upload http://ktrey.tiddlyspot.com/store.cgi index.html . . ktrey>>//(requires tiddlyspot password)//<<br>>[[control panel|http://ktrey.tiddlyspot.com/controlpanel]], [[download (go offline)|http://tiddlyspot.com/download/ktrey]]|\n| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://tiddlyspot.com/faq/]], [[announcements|http://tiddlyspot.com/announce/]], [[blog|http://tiddlyspot.com/blog/]], [[ema
Five-stars. The highest rating I'm typically willing to dole out.
The folowing albums have received Four Stars.\n<<listTags ★★★★☆ title #>>
Three Stars.
The folowing albums have received Two Stars.\n<<listTags ★★☆☆☆ title #>>