These InterfaceOptions for customising TiddlyWiki are saved in your browser\n\nYour username for signing your edits. Write it as a WikiWord (eg JoeBloggs)\n\n<<option txtUserName>>\n<<option chkSaveBackups>> SaveBackups\n<<option chkAutoSave>> AutoSave\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\n<<option chkAnimate>> EnableAnimations\n\n<<option chkGenerateAnRssFeed>> GenerateAnRssFeed\n<<option chkOpenInNewWindow>> OpenLinksInNewWindow\n<<option chkSaveEmptyTemplate>> SaveEmptyTemplate\n<<option chkToggleLinks>> Clicking on links to tiddlers that are already open causes them to close\n^^(override with Control or other modifier key)^^\n<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP\n<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\n^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> ConfirmBeforeDeleting\nMaximum number of lines in a tiddler edit box: <<option txtMaxEditRows>>\nFolder name for backup files: <<option txtBackupFolder>>\n<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field\n<<option txtFileSystemCharSet>> Character set to use for saving (Firefox/Mozilla only)
<script>\n var tids=store.reverseLookup("tags","proper_names",false,"title");\n var excludeLists=false;\n var isPreferred=false;\n var isNode=false;\n var tags;\n var list;\n var templist;\n var text="";\n var count=0;\n var title="";\n\n tids.sort(function(x,y){ \n var a = String(x.title).toUpperCase(); \n var b = String(y.title).toUpperCase(); \n if (a > b) \n return 1 \n if (a < b) \n return -1 \n return 0; \n }); \n\n for (i=0;i<=tids.length-1;i++)\n {\n title=tids[i].title;\n\n excludeLists=false; \n isPreferred=false;\n isNode=false;\n tags=store.getValue(store.getTiddler(title),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n var numbertag="";\n for (l=0;l<=list.length-1;l++)\n {\n if (list[l] == "excludeLists")\n {\n excludeLists= true;\n }\n if (list[l] == "preferred")\n {\n isPreferred= true;\n }\n if (list[l] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (!excludeLists)\n {\n var notation=store.getValue(tids[i],"notation");\n if (!isNode)\n {\n if (isPreferred)\n {\n if (notation)\n {\n text="[[" + title + "]] {{{("+ notation +")}}} <br/>";\n }\n else\n {\n text="[[" + title + "]] <br/>";\n }\n }\n else\n {\n text="//[[" + title + "]]// <br/>";\n }\n\n wikify(text,place);\n\n var tidtarget=store.getTiddler(title);\n var val;\n text = "|noBorder|k\sn"; \n\n val=store.getValue(tidtarget,"scopenote");\n if (val)\n {\n text = text+"| SN|"+val+"|\sn"; \n }\n val=store.getValue(tidtarget,"use");\n if (val)\n {\n var list=val.readBracketedList();\n list.sort(thesaurus_sort); // alphanumeric sort by title \n if (list.length > 0)\n {\n var text = text+"| USE|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n }\n }\n val=store.getValue(tidtarget,"usefor");\n if (val)\n {\n var list=val.readBracketedList();\n list.sort(thesaurus_sort); // alphanumeric sort by title \n if (list.length > 0)\n {\n var text = text+"| USED FOR|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n }\n }\n var b=store.getValue(tidtarget,"broader");\n if (!b) b="";\n templist=b.readBracketedList();\n list= new Array();\n if (templist.length > 0)\n {\n for (j=0;j<=templist.length-1;j++)\n {\n isNode=false;\n var tags=store.getValue(store.getTiddler(templist[j]),"tags");\n if (!tags) tags="";\n var listtags=tags.split(" ");\n if (listtags.length > 0)\n {\n for (k=0;k<=listtags.length-1;k++)\n {\n if (listtags[k] == "nodelabel") isNode= true;\n }\n if (isNode)\n {\n var narrowerlist=store.getValue(store.getTiddler(templist[j]),"broader");\n if (!narrowerlist) narrowerlist="";\n list = list.concat(narrowerlist.readBracketedList());\n }\n else\n {\n list.push(templist[j]);\n }\n }\n }\n if (list.length > 0)\n {\n list.sort(thesaurus_sort); // alphanumeric sort by title \n var text = text+"| BT|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n }\n }\n var n=store.getValue(tidtarget,"narrower");\n if (!n) n="";\n templist=n.readBracketedList();\n list= new Array();\n if (templist.length > 0)\n {\n for (j=0;j<=templist.length-1;j++)\n {\n isNode=false;\n var tags=store.getValue(store.getTiddler(templist[j]),"tags");\n if (!tags) tags="";\n var listtags=tags.split(" ");\n if (listtags.length > 0)\n {\n for (k=0;k<=listtags.length-1;k++)\n {\n if (listtags[k] == "nodelabel") isNode= true;\n }\n if (isNode)\n {\n var narrowerlist=store.getValue(store.getTiddler(templist[j]),"narrower");\n if (!narrowerlist) narrowerlist="";\n list = list.concat(narrowerlist.readBracketedList());\n }\n else\n {\n list.push(templist[j]);\n }\n }\n }\n if (list.length > 0)\n {\n list.sort(thesaurus_sort); // alphanumeric sort by title \n var text = text+"| NT|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n }\n }\n val=store.getValue(tidtarget,"relatedto");\n if (val)\n {\n var list=val.readBracketedList();\n list.sort(thesaurus_sort); // alphanumeric sort by title \n if (list.length > 0)\n {\n var text = text+"| RT|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n }\n }\n text=text+"<br/>";\n wikify(text, place);\n }\n }\n }\n</script>
Spacecraft (lunar missions)
//{{{\nconfig.tasks.BrokenLinks = {\n text: "Broken Links",\n tooltip: "Checks for structural errors in the thesaurus",\n content: "<<tiddler [[Broken Links]]>>"\n};\nconfig.tasks.GenerateNotation= {\n text: "Generate Notation",\n tooltip: "Automatically updates all notation fields based on hierarchy position",\n content: "<<tiddler [[Generate Notation]]>>"\n};\nconfig.tasks.Changes= {\n text: "Change History",\n tooltip: "Lists the last 99 updates",\n content: "<<changes>>"\n};\nconfig.backstageTasks.push("BrokenLinks");\nconfig.backstageTasks.push("GenerateNotation");\nconfig.backstageTasks.push("Changes");\n//}}}
These terms are missing one of the relationship links. Some are also missing the preferred tag!\n\nMissing NT:\n<script>\nvar tids=store.reverseLookup("tags","preferred",true,"title");\nvar count=0;\nfor (i=0;i<=tids.length-1;i++)\n{\n var broader=store.getValue(tids[i],"broader");\n if (broader)\n {\n var narrowertitle=tids[i].title;\n var broaderlist=broader.readBracketedList();\n broaderlist.sort(thesaurus_sort); // alphanumeric sort by title\n for (j=0;j<=broaderlist.length-1;j++)\n {\n broadertitle=broaderlist[j];\n narrower=store.getValue(store.getTiddler(broadertitle),"narrower");\n if (!narrower) narrower="";\n narrowerlist=narrower.readBracketedList();\n narrowerlist.sort(thesaurus_sort); // alphanumeric sort by title\n var found = false;\n for (k=0;k<=narrowerlist.length-1;k++)\n {\n if (narrowerlist[k] == narrowertitle)\n {\n found = true;\n }\n }\n\n var preferredmissing=true; \n var tags=store.getValue(store.getTiddler(broadertitle),"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n for (l=0;l<=list.length-1;l++)\n {\n if (list[l] == "preferred")\n {\n preferredmissing = false;\n }\n }\n }\n\n if (!found)\n {\n wikify("*[["+narrowertitle+"]] should be an NT of [["+broadertitle+"]]",place);\n count++;\n }\n if (preferredmissing)\n {\n wikify("*[["+broadertitle+"]] should be marked [[preferred]]!!!",place);\n count++;\n }\n }\n }\n}\nwikify("Total issues: "+count,place);\n</script>\n----\nMissing BT:\n<script>\nvar tids=store.reverseLookup("tags","preferred",true,"title");\nvar count=0;\nfor (i=0;i<=tids.length-1;i++)\n{\n var narrower=store.getValue(tids[i],"narrower");\n if (narrower)\n {\n var broadertitle=tids[i].title;\n var narrowerlist=narrower.readBracketedList();\n narrowerlist.sort(thesaurus_sort); // alphanumeric sort by title\n for (j=0;j<=narrowerlist.length-1;j++)\n {\n narrowertitle=narrowerlist[j];\n broader=store.getValue(store.getTiddler(narrowertitle),"broader");\n if (!broader) broader="";\n broaderlist=broader.readBracketedList();\n broaderlist.sort(thesaurus_sort); // alphanumeric sort by title\n var found = false;\n for (k=0;k<=broaderlist.length-1;k++)\n {\n if (broaderlist[k] == broadertitle)\n {\n found = true;\n }\n }\n\n var preferredmissing=true; \n var tags=store.getValue(store.getTiddler(narrowertitle),"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n for (l=0;l<=list.length-1;l++)\n {\n if (list[l] == "preferred")\n {\n preferredmissing = false;\n }\n }\n }\n\n if (!found)\n {\n wikify("*[["+broadertitle+"]] should be a BT of [["+narrowertitle+"]]",place);\n count++;\n }\n if (preferredmissing)\n {\n wikify("**[["+narrowertitle+"]] should be marked [[preferred]]!!!",place);\n count++;\n }\n }\n }\n}\nwikify("Total issues: "+count,place);\n</script>\n----\nMissing RT:\n<script>\nvar tids=store.reverseLookup("tags","preferred",true,"title");\nvar count=0;\nfor (i=0;i<=tids.length-1;i++)\n{\n var relatedto1=store.getValue(tids[i],"relatedto");\n if (relatedto1)\n {\n var relatedto2title=tids[i].title;\n var relatedto1list=relatedto1.readBracketedList();\n relatedto1list.sort(thesaurus_sort); // alphanumeric sort by title\n for (j=0;j<=relatedto1list.length-1;j++)\n {\n relatedto1title=relatedto1list[j];\n relatedto2=store.getValue(store.getTiddler(relatedto1title),"relatedto");\n if (!relatedto2) relatedto2="";\n relatedto2list=relatedto2.readBracketedList();\n relatedto2list.sort(thesaurus_sort); // alphanumeric sort by title\n var found = false;\n for (k=0;k<=relatedto2list.length-1;k++)\n {\n if (relatedto2list[k] == relatedto2title)\n {\n found = true;\n }\n }\n\n var preferredmissing=true; \n var tags=store.getValue(store.getTiddler(relatedto1title),"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n for (l=0;l<=list.length-1;l++)\n {\n if (list[l] == "preferred")\n {\n preferredmissing = false;\n }\n }\n }\n\n if (!found)\n {\n wikify("*[["+relatedto2title+"]] should be a RT of [["+relatedto1title+"]]",place);\n count++;\n }\n if (preferredmissing)\n {\n wikify("**[["+relatedto1title+"]] should be marked [[preferred]]!!! (or the RT should be deleted!)",place);\n count++;\n }\n }\n }\n}\nwikify("Total issues: "+count,place);\n</script>\n----\nMissing USE:\n<script>\nvar tids=store.reverseLookup("tags","preferred",true,"title");\nvar count=0;\nfor (i=0;i<=tids.length-1;i++)\n{\n var usefor=store.getValue(tids[i],"usefor");\n if (usefor)\n {\n var usetitle=tids[i].title;\n var useforlist=usefor.readBracketedList();\n useforlist.sort(thesaurus_sort); // alphanumeric sort by title\n for (j=0;j<=useforlist.length-1;j++)\n {\n usefortitle=useforlist[j];\n use=store.getValue(store.getTiddler(usefortitle),"use");\n if (!use) use="";\n uselist=use.readBracketedList();\n uselist.sort(thesaurus_sort); // alphanumeric sort by title\n var found = false;\n for (k=0;k<=uselist.length-1;k++)\n {\n if (uselist[k] == usetitle)\n {\n found = true;\n }\n }\n\n var preferredmissing=true; \n var tags=store.getValue(store.getTiddler(usefortitle),"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n for (l=0;l<=list.length-1;l++)\n {\n if (list[l] == "preferred")\n {\n preferredmissing = false;\n }\n }\n }\n\n if (!found)\n {\n wikify("*[["+usefortitle+"]] should say USE [["+usetitle+"]]",place);\n count++;\n }\n if (!preferredmissing)\n {\n wikify("*[["+usefortitle+"]] should ''NOT'' be marked [[preferred]]!!!",place);\n count++;\n }\n }\n }\n}\nwikify("Total issues: "+count,place);\n</script>\n----\nMissing USE FOR:\n<script>\nvar tids=store.reverseLookup("tags","preferred",false,"title");\nvar count=0;\nfor (i=0;i<=tids.length-1;i++)\n{\n var use=store.getValue(tids[i],"use");\n if (use)\n {\n var usefortitle=tids[i].title;\n var uselist=use.readBracketedList();\n uselist.sort(thesaurus_sort); // alphanumeric sort by title\n for (j=0;j<=uselist.length-1;j++)\n {\n usetitle=uselist[j];\n usefor=store.getValue(store.getTiddler(usetitle),"usefor");\n if (!usefor) usefor="";\n useforlist=usefor.readBracketedList();\n useforlist.sort(thesaurus_sort); // alphanumeric sort by title\n var found = false;\n for (k=0;k<=useforlist.length-1;k++)\n {\n if (useforlist[k] == usefortitle)\n {\n found = true;\n }\n }\n\n var preferredmissing=true; \n var tags=store.getValue(store.getTiddler(usetitle),"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n for (l=0;l<=list.length-1;l++)\n {\n if (list[l] == "preferred")\n {\n preferredmissing = false;\n }\n }\n }\n\n if (!found)\n {\n wikify("*[["+usetitle+"]] should say USE FOR [["+usefortitle+"]]",place);\n count++;\n }\n if (preferredmissing)\n {\n wikify("*[["+usetitle+"]] should be marked [[preferred]]!!!",place);\n count++;\n }\n }\n }\n}\nwikify("Total issues: "+count,place);\n</script>\n----\nThese terms are ''not'' marked [[preferred]], but also do ''not'' have a USE value.\n<script>\nvar tids=store.reverseLookup("tags","excludeLists",false,"title");\nvar count = 0;\n\nfor (i=0;i<=tids.length-1;i++)\n{\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "preferred" || list[j] == "proper_names")\n {\n skip = true;\n }\n }\n var use=store.getValue(tids[i],"use");\n if (!use && !skip)\n {\n count++;\n }\n }\n}\nwikify("<br/>Total found: "+count,place);\n\nfor (i=0;i<=tids.length-1;i++)\n{\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "preferred" || list[j] == "proper_names")\n {\n skip = true;\n }\n }\n var use=store.getValue(tids[i],"use");\n if (!use && !skip)\n {\n var text="[["+tids[i].title + "]]<br/>";\n wikify(text,place);\n }\n }\n}\n</script>\n----\nThese terms are ''not'' marked [[preferred]], but have one or more relationship links.\n<script>\n var tids=store.reverseLookup("tags","excludeLists",false,"title");\n var count = 0;\n\n for (i=0;i<=tids.length-1;i++)\n {\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n var isPreferred= false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "proper_names")\n {\n skip = true;\n }\n if (list[j] == "preferred")\n {\n isPreferred = true;\n }\n }\n var notation=store.getValue(tids[i],"notation");\n var scopenote=store.getValue(tids[i],"scopenote");\n var usefor=store.getValue(tids[i],"usefor");\n var broader=store.getValue(tids[i],"broader");\n var narrower=store.getValue(tids[i],"narrower");\n var relatedto=store.getValue(tids[i],"relatedto");\n\n if (!skip && !isPreferred && (notation || scopenote || usefor || broader || narrower || relatedto))\n {\n count++;\n }\n }\n }\n wikify("<br/>Total found: "+count,place);\n\n for (i=0;i<=tids.length-1;i++)\n {\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n var isPreferred= false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "proper_names")\n {\n skip = true;\n }\n if (list[j] == "preferred")\n {\n isPreferred = true;\n }\n }\n var notation=store.getValue(tids[i],"notation");\n var scopenote=store.getValue(tids[i],"scopenote");\n var usefor=store.getValue(tids[i],"usefor");\n var broader=store.getValue(tids[i],"broader");\n var narrower=store.getValue(tids[i],"narrower");\n var relatedto=store.getValue(tids[i],"relatedto");\n\n if (!skip && !isPreferred && (notation || scopenote || usefor || broader || narrower || relatedto))\n {\n var text="[["+tids[i].title + "]]<br/>";\n wikify(text,place);\n }\n }\n }\n</script>\n----\nThese terms ''are'' marked [[preferred]], but have USE links.\n<script>\n var tids=store.reverseLookup("tags","excludeLists",false,"title");\n var count = 0;\n\n for (i=0;i<=tids.length-1;i++)\n {\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n var isPreferred = false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "proper_names")\n {\n skip = true;\n }\n if (list[j] == "preferred")\n {\n isPreferred = true;\n }\n }\n var use=store.getValue(tids[i],"use");\n\n if (!skip && isPreferred && use)\n {\n count++;\n }\n }\n }\n wikify("<br/>Total found: "+count,place);\n\n for (i=0;i<=tids.length-1;i++)\n {\n var tags=store.getValue(tids[i],"tags");\n if (!tags) tags="";\n var list=tags.split(" ");\n if (list.length > 0)\n {\n var skip = false;\n var isPreferred = false;\n for (j=0;j<=list.length-1;j++)\n {\n if (list[j] == "proper_names")\n {\n skip = true;\n }\n if (list[j] == "preferred")\n {\n isPreferred = true;\n }\n }\n var use=store.getValue(tids[i],"use");\n\n if (!skip && isPreferred && use)\n {\n var text="[["+tids[i].title + "]]<br/>";\n wikify(text,place);\n }\n }\n }\n</script>\n----\nThese preferred terms have no BT or NT!\n<script>\nvar tids=store.reverseLookup("tags","preferred",true,"title");\nvar count = 0;\nvar broader;\nvar narrower;\nvar title="";\nvar text="";\n\nfor (i=0;i<=tids.length-1;i++)\n{\n broader=store.getValue(tids[i],"broader");\n if (!broader)\n {\n title=tids[i].title;\n text="* [[" + title + "]]";\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower)\n {\n count++;\n }\n }\n}\nwikify("<br/>Total found: "+count,place);\n\nfor (i=0;i<=tids.length-1;i++)\n{\n broader=store.getValue(tids[i],"broader");\n if (!broader)\n {\n title=tids[i].title;\n text="* [[" + title + "]]";\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower)\n {\n wikify(text,place);\n }\n }\n}\n</script>\n----
<<changes>>
<script>\n var tids=store.reverseLookup("tags","preferred",true,"title");\n var count = 0;\n var text="";\n var bul="*";\n var notation="";\n var isNode=false;\n var tags;\n var list;\n\n for (i=0;i<=tids.length-1;i++)\n {\n var broader=store.getValue(tids[i],"broader");\n var narrower;\n var title="";\n if (!broader)\n {\n title=tids[i].title;\n notation=store.getValue(store.getTiddler(title),"notation");\n isNode=false;\n tags=store.getValue(store.getTiddler(title),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (isNode)\n {\n text=text+bul+" <[[" + title + "]]> {{{("+notation+")}}}\sn";\n }\n else\n {\n text=text+bul+" [[" + title + "]] {{{("+notation+")}}}\sn";\n }\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list1=narrower.readBracketedList();\n list1.sort(thesaurus_sort); // alphanumeric sort by title\n for (j=0;j<=list1.length-1;j++)\n {\n notation=store.getValue(store.getTiddler(list1[j]),"notation");\n isNode=false;\n tags=store.getValue(store.getTiddler(list1[j]),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (isNode)\n {\n text=text+bul+bul+" <[[" + list1[j] + "]]> {{{("+notation+")}}}\sn";\n }\n else\n {\n text=text+bul+bul+" [[" + list1[j] + "]] {{{("+notation+")}}}\sn";\n }\n \n title=list1[j];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list2=narrower.readBracketedList();\n list2.sort(thesaurus_sort); // alphanumeric sort by title\n for (k=0;k<=list2.length-1;k++)\n {\n notation=store.getValue(store.getTiddler(list2[k]),"notation");\n isNode=false;\n tags=store.getValue(store.getTiddler(list2[k]),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (isNode)\n {\n text=text+bul+bul+bul+" <[[" + list2[k] + "]]> {{{("+notation+")}}}\sn";\n }\n else\n {\n text=text+bul+bul+bul+" [[" + list2[k] + "]] {{{("+notation+")}}}\sn";\n }\n\n title=list2[k];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list3=narrower.readBracketedList();\n list3.sort(thesaurus_sort); // alphanumeric sort by title\n for (l=0;l<=list3.length-1;l++)\n {\n notation=store.getValue(store.getTiddler(list3[l]),"notation");\n isNode=false;\n tags=store.getValue(store.getTiddler(list3[l]),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (isNode)\n {\n text=text+bul+bul+bul+bul+" <[[" + list3[l] + "]]> {{{("+notation+")}}}\sn";\n }\n else\n {\n text=text+bul+bul+bul+bul+" [[" + list3[l] + "]] {{{("+notation+")}}}\sn";\n }\n\n title=list3[l];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list4=narrower.readBracketedList();\n list4.sort(thesaurus_sort); // alphanumeric sort by title\n for (m=0;m<=list4.length-1;m++)\n {\n notation=store.getValue(store.getTiddler(list4[m]),"notation");\n isNode=false;\n tags=store.getValue(store.getTiddler(list4[m]),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (isNode)\n {\n text=text+bul+bul+bul+bul+bul+" <[[" + list4[m] + "]]> {{{("+notation+")}}}\sn";\n }\n else\n {\n text=text+bul+bul+bul+bul+bul+" [[" + list4[m] + "]] {{{("+notation+")}}}\sn";\n }\n \n title=list4[m];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list5=narrower.readBracketedList();\n list5.sort(thesaurus_sort); // alphanumeric sort by title\n for (n=0;n<=list5.length-1;n++)\n {\n notation=store.getValue(store.getTiddler(list5[n]),"notation");\n isNode=false;\n tags=store.getValue(store.getTiddler(list5[n]),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (isNode)\n {\n text=text+bul+bul+bul+bul+bul+bul+" <[[" + list5[n] + "]]> {{{("+notation+")}}}\sn";\n }\n else\n {\n text=text+bul+bul+bul+bul+bul+bul+" [[" + list5[n] + "]] {{{("+notation+")}}}\sn";\n }\n\n title=list5[n];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list6=narrower.readBracketedList();\n list6.sort(thesaurus_sort); // alphanumeric sort by title\n for (o=0;o<=list6.length-1;o++)\n {\n notation=store.getValue(store.getTiddler(list6[o]),"notation");\n isNode=false;\n tags=store.getValue(store.getTiddler(list6[o]),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (isNode)\n {\n text=text+bul+bul+bul+bul+bul+bul+bul+" <[[" + list6[o] + "]]> {{{("+notation+")}}}\sn";\n }\n else\n {\n text=text+bul+bul+bul+bul+bul+bul+bul+" [[" + list6[o] + "]] {{{("+notation+")}}}\sn";\n }\n }\n }\n }\n }\n }\n }\n }\n }\n wikify(text,place);\n</script>\n\n\n
/***\n| Name|CloseOnCancelPlugin|\n| Description|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\nmerge(config.commands.cancelTiddler,{\n\n handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,\n\n handler: function(event,src,title) {\n this.handler_orig_closeUnsaved(event,src,title);\n if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))\n story.closeTiddler(title,true);\n return false;\n }\n\n});\n\n//}}}\n\n
[[Introduction]]
/***\n|Name|DisplayOpenTiddlersPlugin|\n|Location|http://www.orst.edu/~woodswa/tiddlywikiplugs.html|\n|Version|1.0|\n|Author|Walt Woods|\n|Requirements||\n\n!Description\nDisplays similar to the popular BreadCrumbsPlugin by AlanHecht, this plugin instead keeps a list of currently open tiddlers.\n\n!History\n08-06-2007: Initial version.\n\n!Code\n***/\n//{{{\nversion.extensions.DisplayOpenTiddlers = {major: 1, minor: 0, revision: 0};\n\nfunction addOpenTiddlerLine(title, element)\n{\n if (title != openTiddlerClosing)\n {\n if (tiddlerLine != "")\n tiddlerLine += " | ";\n tiddlerLine += "[[" + title + "]]";\n }\n}\n\nfunction refreshOpenTiddlersList()\n{\n if (!document.getElementById("openTiddlers")) {\n var ta = document.createElement("div");\n ta.id = "openTiddlers";\n ta.style.visibility= "hidden";\n var targetArea = document.getElementById("tiddlerDisplay")||document.getElementById("storyDisplay");\n targetArea.parentNode.insertBefore(ta,targetArea);\n }\n\n var tiddlers = document.getElementById("openTiddlers");\n tiddlers.style.visibility = "visible";\n removeChildren(tiddlers);\n \n tiddlerLine = "";\n story.forEachTiddler(addOpenTiddlerLine);\n wikify(tiddlerLine,tiddlers)\n}\n\nStory.prototype.displayTiddlerDisplayOpenTiddlers = Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n this.displayTiddlerDisplayOpenTiddlers(srcElement,title,template,animate,slowly);\n openTiddlerClosing = "";\n refreshOpenTiddlersList();\n}\n\nStory.prototype.closeTiddlerDisplayOpenTiddlers = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler = function(title,animate,unused)\n{\n this.closeTiddlerDisplayOpenTiddlers(title,animate,unused);\n openTiddlerClosing = title;\n refreshOpenTiddlersList();\n}\n//}}}
The layers of gases that surround the Earth.
<!--{{{-->\n<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<span macro="edit notation">Notation: </span><br/>\n<span class='editor' macro="edit scopenote">Scope Note: </span>\n<span class='editor' macro="edit use">Use: </span>\n<span class='editor' macro="edit usefor">Used For: </span>\n<span class='editor' macro="edit broader">Broader Terms: </span>\n<span class='editor' macro="edit narrower">Narrower Terms: </span>\n<span class='editor' macro="edit relatedto">Related Terms: </span>\n<div class='editor' macro='edit tags'>Tags: </div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<!--}}}-->
/***\n| Name:|ExtentTagButtonPlugin|\n| Description:|Adds a New tiddler button in the tag drop down|\n| Version:|3.2 ($Rev: 2406 $)|\n| Date:|$Date: 2007-08-08 22:50:23 +1000 (Wed, 08 Aug 2007) $|\n| Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\n\nwindow.onClickTag_mptw_orig = window.onClickTag;\nwindow.onClickTag = function(e) {\n window.onClickTag_mptw_orig.apply(this,arguments);\n var tag = this.getAttribute("tag");\n var title = this.getAttribute("tiddler");\n // Saq, you're a genius :)\n var popup = Popup.stack[Popup.stack.length-1].popup;\n createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");\n wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));\n return false;\n}\n\n//}}}\n\n
/***\n|Name|FontSizePlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#FontSizePlugin|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nResize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.\nYou can customize the maximum and minimum allowed sizes.\n(only affects tiddler content text, not any other text)\n\nAlso, you can load a TW file with a font-size specified in the url.\nEg: http://tw.lewcid.org/#font:110\n\n!Demo:\nTry using the font-size buttons in the sidebar, or in the MainMenu above.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nThen put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.\n\n!Usage\n{{{<<fontSize>>}}} results in <<fontSize>>\n{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>\n\n!Customizing:\nThe buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.\nTo change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.\n\n!Notes:\nThis plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.\n\n!History:\n*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.\n*25-07-06, version 0.9\n\n!Code\n***/\n\n//{{{\nconfig.fontSize={};\n\n//configuration settings\nconfig.fontSize.settings =\n{\n defaultSize : 100, // all sizes in %\n maxSize : 200,\n minSize : 40,\n stepSize : 10\n};\n\n//startup code\nvar fontSettings = config.fontSize.settings;\n\nif (!config.options.txtFontSize)\n {config.options.txtFontSize = fontSettings.defaultSize;\n saveOptionCookie("txtFontSize");}\nsetStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\sn","fontResizerStyles");\nsetStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\sn .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");\n\n//macro\nconfig.macros.fontSize={};\nconfig.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n\n var sp = createTiddlyElement(place,"span",null,"fontResizer");\n sp.ondblclick=this.onDblClick;\n if (params[0])\n createTiddlyText(sp,params[0]);\n createTiddlyButton(sp,"+","increase font-size",this.incFont);\n createTiddlyButton(sp,"=","reset font-size",this.resetFont);\n createTiddlyButton(sp,"–","decrease font-size",this.decFont);\n}\n\nconfig.macros.fontSize.onDblClick = function (e)\n{\n if (!e) var e = window.event;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nconfig.macros.fontSize.setFont = function ()\n{\n saveOptionCookie("txtFontSize");\n setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\sn","fontResizerStyles");\n}\n\nconfig.macros.fontSize.incFont=function()\n{\n if (config.options.txtFontSize < fontSettings.maxSize)\n config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.macros.fontSize.decFont=function()\n{\n\n if (config.options.txtFontSize > fontSettings.minSize)\n config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.macros.fontSize.resetFont=function()\n{\n\n config.options.txtFontSize=fontSettings.defaultSize;\n config.macros.fontSize.setFont();\n}\n\nconfig.paramifiers.font =\n{\n onstart: function(v)\n {\n config.options.txtFontSize = v;\n config.macros.fontSize.setFont();\n }\n};\n//}}}
<script>\nvar tids=store.reverseLookup("tags","preferred",true,"title");\nvar count = 0;\nvar text="";\nvar bul="*";\nvar l1=0;\nvar l2=0;\nvar l3=0;\nvar l4=0;\nvar l5=0;\nvar l6=0;\nvar l7=0;\nvar notation="";\nwikify("Notation generated!<br/><br/>",place);\nwikify("Total preferred terms found: "+tids.length+"<br/><br/>",place);\n\nfor (i=0;i<=tids.length-1;i++)\n{\n var broader=store.getValue(tids[i],"broader");\n var narrower;\n var title="";\n if (!broader)\n {\n l1++;\n title=tids[i].title;\n notation=l1;\n text=text+bul+" [[" + title + "]] {{{("+notation+")}}}\sn";\n store.setValue(store.getTiddler(title),"notation",notation);\n\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list1=narrower.readBracketedList();\n list1.sort(thesaurus_sort); // alphanumeric sort by title\n l2=0;\n for (j=0;j<=list1.length-1;j++)\n {\n l2++;\n notation=l1+"."+l2;\n text=text+bul+bul+" [["+list1[j] + "]] {{{("+notation+")}}}\sn";\n store.setValue(store.getTiddler(list1[j]),"notation",notation);\n\n title=list1[j];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list2=narrower.readBracketedList();\n list2.sort(thesaurus_sort); // alphanumeric sort by title\n l3=0;\n for (k=0;k<=list2.length-1;k++)\n {\n l3++;\n notation=l1+"."+l2+"."+l3;\n text=text+bul+bul+bul+" [["+list2[k] + "]] {{{("+notation+")}}}\sn";\n store.setValue(store.getTiddler(list2[k]),"notation",notation);\n\n title=list2[k];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list3=narrower.readBracketedList();\n list3.sort(thesaurus_sort); // alphanumeric sort by title\n l4=0;\n for (l=0;l<=list3.length-1;l++)\n {\n l4++;\n notation=l1+"."+l2+"."+l3+"."+l4;\n text=text+bul+bul+bul+bul+" [["+list3[l] + "]] {{{("+notation+")}}}\sn";\n store.setValue(store.getTiddler(list3[l]),"notation",notation);\n\n title=list3[l];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list4=narrower.readBracketedList();\n list4.sort(thesaurus_sort); // alphanumeric sort by title\n l5=0;\n for (m=0;m<=list4.length-1;m++)\n {\n l5++;\n notation=l1+"."+l2+"."+l3+"."+l4+"."+l5;\n text=text+bul+bul+bul+bul+bul+" [["+list4[m] + "]] {{{("+notation+")}}}\sn";\n store.setValue(store.getTiddler(list4[m]),"notation",notation);\n\n title=list4[m];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list5=narrower.readBracketedList();\n list5.sort(thesaurus_sort); // alphanumeric sort by title\n l6=0;\n for (n=0;n<=list5.length-1;n++)\n {\n l6++;\n notation=l1+"."+l2+"."+l3+"."+l4+"."+l5+"."+l6;\n text=text+bul+bul+bul+bul+bul+bul+" [["+list5[n] + "]] {{{("+notation+")}}}\sn";\n store.setValue(store.getTiddler(list5[n]),"notation",notation);\n\n title=list5[n];\n narrower=store.getValue(store.getTiddler(title),"narrower");\n if (!narrower) narrower="";\n var list6=narrower.readBracketedList();\n list6.sort(thesaurus_sort); // alphanumeric sort by title\n l7=0;\n for (o=0;o<=list6.length-1;o++)\n {\n l7++\n notation=l1+"."+l2+"."+l3+"."+l4+"."+l5+"."+l6+"."+7;\n text=text+bul+bul+bul+bul+bul+bul+bul+" [["+list6[o] + "]] {{{("+notation+")}}}\sn";\n store.setValue(store.getTiddler(list6[o]),"notation",notation);\n }\n }\n }\n }\n }\n }\n }\n}\nwikify(text,place);\n</script>\n
/***\n| Name|HideWhenPlugin|\n| Description|Allows conditional inclusion/exclusion in templates|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source|http://mptw.tiddlyspot.com/#HideWhenPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\nFor use in ViewTemplate and EditTemplate. Example usage:\n{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}\n{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}\n***/\n//{{{\n\nwindow.removeElementWhen = function(test,place) {\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\n};\n\nmerge(config.macros,{\n\n hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( eval(paramString), place);\n }},\n\n showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !eval(paramString), place);\n }},\n\n hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAny(params), place);\n }},\n\n showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAny(params), place);\n }},\n\n hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.tags.containsAll(params), place);\n }},\n\n showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !tiddler.tags.containsAll(params), place);\n }},\n\n hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);\n }},\n\n showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);\n }}\n\n});\n\n//}}}\n\n
/***\n|Name|InlineJavascriptPlugin|\n|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|Version|1.6.0|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides||\n|Description|Insert Javascript executable code directly into your tiddler content.|\n\n''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered. You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Display script source in tiddler output''\nBy including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n<<<\n!!!!!Examples\n<<<\nan "alert" message box:\n><script show>\n alert('InlineJavascriptPlugin: this is a demonstration message');\n</script>\ndynamic output:\n><script show>\n return (new Date()).toString();\n</script>\nwikified dynamic output:\n><script show>\n return "link to current user: [["+config.options.txtUserName+"]]";\n</script>\ndynamic output using 'place' to get size information for current tiddler:\n><script show>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\ncreating an 'onclick' button/link that runs a script:\n><script label="click here" title="clicking this link will show an 'alert' box" show>\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\nloading a script from a source url:\n>http://www.TiddlyTools.com/demo.js contains:\n>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}\n>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}\n><script src="demo.js" show>\n return "loading demo.js..."\n</script>\n><script label="click to execute demo() function" show>\n demo()\n</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.02.19 [1.6.0]'' added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script\n''2006.10.16 [1.5.2]'' add newline before closing '}' in 'function out_' wrapper. Fixes error caused when last line of script is a comment.\n''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly\n''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output\n''2006.01.05 [1.4.0]'' added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.\n''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski\n''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]'' initial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 6, revision: 0, date: new Date(2007,2,19)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: title=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?( show)?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = lookaheadMatch[1];\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (lookaheadMatch[5]) { // there is script code\n if (lookaheadMatch[4]) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (lookaheadMatch[2]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[5]+"\sn};_out(this);"\n link.setAttribute("title",lookaheadMatch[3]?lookaheadMatch[3]:"");\n link.setAttribute("href","javascript:;");\n link.style.cursor="pointer";\n }\n else { // run inline script code\n var code="function _out(place){"+lookaheadMatch[5]+"\sn};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);\n }\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}
/***\n|''Name:''|IntelliTaggerPlugin|\n|''Version:''|1.0.2 (2007-07-25)|\n|''Type:''|plugin|\n|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|\n|''~SourceCode:''|[[IntelliTaggerPlugin SourceCode]]|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~CoreVersion:''|2.0.8|\n|''Browser:''|Firefox 1.5.0.2 or better|\n***/\n/***\n!Version History\n* 1.0.2 (2007-07-25): \n** Feature: "Return" key may be used to accept first tag suggestion (beside "Alt-1")\n** Bugfix: Keyboard shortcuts (Alt+3 etc.) shifted\n* 1.0.1 (2007-05-18): Improvement: Speedup when using TiddlyWikis with many tags\n* 1.0.0 (2006-04-26): Initial release\n\n***/\n// /%\nif(!version.extensions.IntelliTaggerPlugin){if(!window.abego){window.abego={};}if(!abego.internal){abego.internal={};}abego.alertAndThrow=function(s){alert(s);throw s;};if(version.major<2){abego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");}version.extensions.IntelliTaggerPlugin={major:1,minor:0,revision:2,date:new Date(2007,6,25),type:"plugin",source:"http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin",documentation:"[[IntelliTaggerPlugin Documentation]]",sourcecode:"[[IntelliTaggerPlugin SourceCode]]",author:"Udo Borkowski (ub [at] abego-software [dot] de)",licence:"[[BSD open source license (abego Software)]]",tiddlywiki:"Version 2.0.8 or better",browser:"Firefox 1.5.0.2 or better"};abego.createEllipsis=function(_2){var e=createTiddlyElement(_2,"span");e.innerHTML="…";};abego.isPopupOpen=function(_4){return _4&&_4.parentNode==document.body;};abego.openAsPopup=function(_5){if(_5.parentNode!=document.body){document.body.appendChild(_5);}};abego.closePopup=function(_6){if(abego.isPopupOpen(_6)){document.body.removeChild(_6);}};abego.getWindowRect=function(){return {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};};abego.moveElement=function(_7,_8,_9){_7.style.left=_8+"px";_7.style.top=_9+"px";};abego.centerOnWindow=function(_a){if(_a.style.position!="absolute"){throw "abego.centerOnWindow: element must have absolute position";}var _b=abego.getWindowRect();abego.moveElement(_a,_b.left+(_b.width-_a.offsetWidth)/2,_b.top+(_b.height-_a.offsetHeight)/2);};abego.isDescendantOrSelf=function(_c,e){while(e){if(_c==e){return true;}e=e.parentNode;}return false;};abego.toSet=function(_e){var _f={};for(var i=0;i<_e.length;i++){_f[_e[i]]=true;}return _f;};abego.filterStrings=function(_11,_12,_13){var _14=[];for(var i=0;i<_11.length&&(_13===undefined||_14.length<_13);i++){var s=_11[i];if(s.match(_12)){_14.push(s);}}return _14;};abego.arraysAreEqual=function(a,b){if(!a){return !b;}if(!b){return false;}var n=a.length;if(n!=b.length){return false;}for(var i=0;i<n;i++){if(a[i]!=b[i]){return false;}}return true;};abego.moveBelowAndClip=function(_1b,_1c){if(!_1c){return;}var _1d=findPosX(_1c);var _1e=findPosY(_1c);var _1f=_1c.offsetHeight;var _20=_1d;var _21=_1e+_1f;var _22=findWindowWidth();if(_22<_1b.offsetWidth){_1b.style.width=(_22-100)+"px";}var _23=_1b.offsetWidth;if(_20+_23>_22){_20=_22-_23-30;}if(_20<0){_20=0;}_1b.style.left=_20+"px";_1b.style.top=_21+"px";_1b.style.display="block";};abego.compareStrings=function(a,b){return (a==b)?0:(a<b)?-1:1;};abego.sortIgnoreCase=function(arr){var _27=[];var n=arr.length;for(var i=0;i<n;i++){var s=arr[i];_27.push([s.toString().toLowerCase(),s]);}_27.sort(function(a,b){return (a[0]==b[0])?0:(a[0]<b[0])?-1:1;});for(i=0;i<n;i++){arr[i]=_27[i][1];}};abego.getTiddlerField=function(_2d,_2e,_2f){var _30=document.getElementById(_2d.idPrefix+_2e);var e=null;if(_30!=null){var _32=_30.getElementsByTagName("*");for(var t=0;t<_32.length;t++){var c=_32[t];if(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){if(!e){e=c;}if(c.getAttribute("edit")==_2f){e=c;}}}}return e;};abego.setRange=function(_35,_36,end){if(_35.setSelectionRange){_35.setSelectionRange(_36,end);var max=0+_35.scrollHeight;var len=_35.textLength;var top=max*_36/len,bot=max*end/len;_35.scrollTop=Math.min(top,(bot+top-_35.clientHeight)/2);}else{if(_35.createTextRange!=undefined){var _3b=_35.createTextRange();_3b.collapse();_3b.moveEnd("character",end);_3b.moveStart("character",_36);_3b.select();}else{_35.select();}}};abego.internal.TagManager=function(){var _3c=null;var _3d=function(){if(_3c){return;}_3c={};store.forEachTiddler(function(_3e,_3f){for(var i=0;i<_3f.tags.length;i++){var tag=_3f.tags[i];var _42=_3c[tag];if(!_42){_42=_3c[tag]={count:0,tiddlers:{}};}_42.tiddlers[_3f.title]=true;_42.count+=1;}});};var _43=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_44,_45,_46,_47,_48,_49){var _4a=this.fetchTiddler(_44);var _4b=_4a?_4a.tags:[];var _4c=(typeof _49=="string")?_49.readBracketedList():_49;_43.apply(this,arguments);if(!abego.arraysAreEqual(_4b,_4c)){abego.internal.getTagManager().reset();}};var _4d=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_4e){var _4f=this.fetchTiddler(_4e);var _50=_4f&&_4f.tags.length>0;_4d.apply(this,arguments);if(_50){abego.internal.getTagManager().reset();}};this.reset=function(){_3c=null;};this.getTiddlersWithTag=function(tag){_3d();var _52=_3c[tag];return _52?_52.tiddlers:null;};this.getAllTags=function(_53){_3d();var _54=[];for(var i in _3c){_54.push(i);}for(i=0;_53&&i<_53.length;i++){_54.pushUnique(_53[i],true);}abego.sortIgnoreCase(_54);return _54;};this.getTagInfos=function(){_3d();var _56=[];for(var _57 in _3c){_56.push([_57,_3c[_57]]);}return _56;};var _58=function(a,b){var a1=a[1];var b1=b[1];var d=b[1].count-a[1].count;return d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());};this.getSortedTagInfos=function(){_3d();var _5e=this.getTagInfos();_5e.sort(_58);return _5e;};this.getPartnerRankedTags=function(_5f){var _60={};for(var i=0;i<_5f.length;i++){var _62=this.getTiddlersWithTag(_5f[i]);for(var _63 in _62){var _64=store.getTiddler(_63);if(!(_64 instanceof Tiddler)){continue;}for(var j=0;j<_64.tags.length;j++){var tag=_64.tags[j];var c=_60[tag];_60[tag]=c?c+1:1;}}}var _68=abego.toSet(_5f);var _69=[];for(var n in _60){if(!_68[n]){_69.push(n);}}_69.sort(function(a,b){var d=_60[b]-_60[a];return d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());});return _69;};};abego.internal.getTagManager=function(){if(!abego.internal.gTagManager){abego.internal.gTagManager=new abego.internal.TagManager();}return abego.internal.gTagManager;};(function(){var _6e=2;var _6f=1;var _70=30;var _71;var _72;var _73;var _74;var _75;var _76;if(!abego.IntelliTagger){abego.IntelliTagger={};}var _77=function(){return _72;};var _78=function(tag){return _75[tag];};var _7a=function(s){var i=s.lastIndexOf(" ");return (i>=0)?s.substr(0,i):"";};var _7d=function(_7e){var s=_7e.value;var len=s.length;return (len>0&&s[len-1]!=" ");};var _81=function(_82){var s=_82.value;var len=s.length;if(len>0&&s[len-1]!=" "){_82.value+=" ";}};var _85=function(tag,_87,_88){if(_7d(_87)){_87.value=_7a(_87.value);}story.setTiddlerTag(_88.title,tag,0);_81(_87);abego.IntelliTagger.assistTagging(_87,_88);};var _89=function(n){if(_76&&_76.length>n){return _76[n];}return (_74&&_74.length>n)?_74[n]:null;};var _8b=function(n,_8d,_8e){var _8f=_89(n);if(_8f){_85(_8f,_8d,_8e);}};var _90=function(_91){var pos=_91.value.lastIndexOf(" ");var _93=(pos>=0)?_91.value.substr(++pos,_91.value.length):_91.value;return new RegExp(_93.escapeRegExp(),"i");};var _94=function(_95,_96){var _97=0;for(var i=0;i<_95.length;i++){if(_96[_95[i]]){_97++;}}return _97;};var _99=function(_9a,_9b,_9c){var _9d=1;var c=_9a[_9b];for(var i=_9b+1;i<_9a.length;i++){if(_9a[i][1].count==c){if(_9a[i][0].match(_9c)){_9d++;}}else{break;}}return _9d;};var _a0=function(_a1,_a2){var _a3=abego.internal.getTagManager().getSortedTagInfos();var _a4=[];var _a5=0;for(var i=0;i<_a3.length;i++){var c=_a3[i][1].count;if(c!=_a5){if(_a2&&(_a4.length+_99(_a3,i,_a1)>_a2)){break;}_a5=c;}if(c==1){break;}var s=_a3[i][0];if(s.match(_a1)){_a4.push(s);}}return _a4;};var _a9=function(_aa,_ab){return abego.filterStrings(abego.internal.getTagManager().getAllTags(_ab),_aa);};var _ac=function(){if(!_71){return;}var _ad=store.getTiddlerText("IntelliTaggerMainTemplate");if(!_ad){_ad="<b>Tiddler IntelliTaggerMainTemplate not found</b>";}_71.innerHTML=_ad;applyHtmlMacros(_71,null);refreshElements(_71,null);};var _ae=function(e){if(!e){var e=window.event;}var tag=this.getAttribute("tag");if(_73){_73.call(this,tag,e);}return false;};var _b2=function(_b3){createTiddlyElement(_b3,"span",null,"tagSeparator"," | ");};var _b4=function(_b5,_b6,_b7,_b8,_b9){if(!_b6){return;}var _ba=_b8?abego.toSet(_b8):{};var n=_b6.length;var c=0;for(var i=0;i<n;i++){var tag=_b6[i];if(_ba[tag]){continue;}if(c>0){_b2(_b5);}if(_b9&&c>=_b9){abego.createEllipsis(_b5);break;}c++;var _bf="";var _c0=_b5;if(_b7<10){_c0=createTiddlyElement(_b5,"span",null,"numberedSuggestion");_b7++;var key=_b7<10?""+(_b7):"0";createTiddlyElement(_c0,"span",null,"suggestionNumber",key+") ");var _c2=_b7==1?"Return or ":"";_bf=" (Shortcut: lt-%0)".format([key,_c2]);}var _c3=config.views.wikified.tag.tooltip.format([tag]);var _c4=(_78(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_bf]);var _c5="%0; Shift-Click: %1".format([_c4,_c3]);var btn=createTiddlyButton(_c0,tag,_c5,_ae,_78(tag)?"currentTag":null);btn.setAttribute("tag",tag);}};var _c7=function(){if(_71){window.scrollTo(0,ensureVisible(_71));}if(_77()){window.scrollTo(0,ensureVisible(_77()));}};var _c8=function(e){if(!e){var e=window.event;}if(!_71){return;}var _cb=resolveTarget(e);if(_cb==_77()){return;}if(abego.isDescendantOrSelf(_71,_cb)){return;}abego.IntelliTagger.close();};addEvent(document,"click",_c8);var _cc=Story.prototype.gatherSaveFields;Story.prototype.gatherSaveFields=function(e,_ce){_cc.apply(this,arguments);var _cf=_ce.tags;if(_cf){_ce.tags=_cf.trim();}};var _d0=function(_d1){story.focusTiddler(_d1,"tags");var _d2=abego.getTiddlerField(story,_d1,"tags");if(_d2){var len=_d2.value.length;abego.setRange(_d2,len,len);window.scrollTo(0,ensureVisible(_d2));}};var _d4=config.macros.edit.handler;config.macros.edit.handler=function(_d5,_d6,_d7,_d8,_d9,_da){_d4.apply(this,arguments);var _db=_d7[0];if((_da instanceof Tiddler)&&_db=="tags"){var _dc=_d5.lastChild;_dc.onfocus=function(e){abego.IntelliTagger.assistTagging(_dc,_da);setTimeout(function(){_d0(_da.title);},100);};_dc.onkeyup=function(e){if(!e){var e=window.event;}if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){_8b(e.keyCode==48?9:e.keyCode-49,_dc,_da);}else{if(e.ctrlKey&&e.keyCode==32){_8b(0,_dc,_da);}}if(!e.ctrlKey&&(e.keyCode==13||e.keyCode==10)){_8b(0,_dc,_da);}setTimeout(function(){abego.IntelliTagger.assistTagging(_dc,_da);},100);return false;};_81(_dc);}};var _e0=function(e){if(!e){var e=window.event;}var _e3=resolveTarget(e);var _e4=_e3.getAttribute("tiddler");if(_e4){story.displayTiddler(_e3,_e4,"IntelliTaggerEditTagsTemplate",false);_d0(_e4);}return false;};var _e5=config.macros.tags.handler;config.macros.tags.handler=function(_e6,_e7,_e8,_e9,_ea,_eb){_e5.apply(this,arguments);abego.IntelliTagger.createEditTagsButton(_eb,createTiddlyElement(_e6.lastChild,"li"));};var _ec=function(){if(_71&&_72&&!abego.isDescendantOrSelf(document,_72)){abego.IntelliTagger.close();}};setInterval(_ec,100);abego.IntelliTagger.displayTagSuggestions=function(_ed,_ee,_ef,_f0,_f1){_74=_ed;_75=abego.toSet(_ee);_76=_ef;_72=_f0;_73=_f1;if(!_71){_71=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");_71.style.position="absolute";}_ac();abego.openAsPopup(_71);if(_77()){var w=_77().offsetWidth;if(_71.offsetWidth<w){_71.style.width=(w-2*(_6e+_6f))+"px";}abego.moveBelowAndClip(_71,_77());}else{abego.centerOnWindow(_71);}_c7();};abego.IntelliTagger.assistTagging=function(_f3,_f4){var _f5=_90(_f3);var s=_f3.value;if(_7d(_f3)){s=_7a(s);}var _f7=s.readBracketedList();var _f8=_f7.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_f7),_f5,_70):_a0(_f5,_70);abego.IntelliTagger.displayTagSuggestions(_a9(_f5,_f7),_f7,_f8,_f3,function(tag,e){if(e.shiftKey){onClickTag.call(this,e);}else{_85(tag,_f3,_f4);}});};abego.IntelliTagger.close=function(){abego.closePopup(_71);_71=null;return false;};abego.IntelliTagger.createEditTagsButton=function(_fb,_fc,_fd,_fe,_ff,id,_101){if(!_fd){_fd="[edit]";}if(!_fe){_fe="Edit the tags";}if(!_ff){_ff="editTags";}var _102=createTiddlyButton(_fc,_fd,_fe,_e0,_ff,id,_101);_102.setAttribute("tiddler",(_fb instanceof Tiddler)?_fb.title:String(_fb));return _102;};abego.IntelliTagger.getSuggestionTagsMaxCount=function(){return 100;};config.macros.intelliTagger={label:"intelliTagger",handler:function(_103,_104,_105,_106,_107,_108){var _109=_107.parseParams("list",null,true);var _10a=_109[0]["action"];for(var i=0;_10a&&i<_10a.length;i++){var _10c=_10a[i];var _10d=config.macros.intelliTagger.subhandlers[_10c];if(!_10d){abego.alertAndThrow("Unsupported action '%0'".format([_10c]));}_10d(_103,_104,_105,_106,_107,_108);}},subhandlers:{showTags:function(_10e,_10f,_110,_111,_112,_113){_b4(_10e,_74,_76?_76.length:0,_76,abego.IntelliTagger.getSuggestionTagsMaxCount());},showFavorites:function(_114,_115,_116,_117,_118,_119){_b4(_114,_76,0);},closeButton:function(_11a,_11b,_11c,_11d,_11e,_11f){var _120=createTiddlyButton(_11a,"close","Close the suggestions",abego.IntelliTagger.close);},version:function(_121){var t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPlugin.major,version.extensions.IntelliTaggerPlugin.minor,version.extensions.IntelliTaggerPlugin.revision]);var e=createTiddlyElement(_121,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";},copyright:function(_124){var e=createTiddlyElement(_124,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">© 2006-2007 <b><font color=\s"red\s">abego</font></b> Software<font>";}}};})();config.shadowTiddlers["IntelliTaggerStyleSheet"]="/***\sn"+"!~IntelliTagger Stylesheet\sn"+"***/\sn"+"/*{{{*/\sn"+".intelliTaggerSuggestions {\sn"+"\stposition: absolute;\sn"+"\stwidth: 600px;\sn"+"\sn"+"\stpadding: 2px;\sn"+"\stlist-style: none;\sn"+"\stmargin: 0;\sn"+"\sn"+"\stbackground: #eeeeee;\sn"+"\stborder: 1px solid DarkGray;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .currentTag {\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .suggestionNumber {\sn"+"\stcolor: #808080;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .numberedSuggestion{\sn"+"\stwhite-space: nowrap;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter {\sn"+"\stmargin-top: 4px;\sn"+"\stborder-top-width: thin;\sn"+"\stborder-top-style: solid;\sn"+"\stborder-top-color: #999999;\sn"+"}\sn"+".intelliTaggerSuggestions .favorites {\sn"+"\stborder-bottom-width: thin;\sn"+"\stborder-bottom-style: solid;\sn"+"\stborder-bottom-color: #999999;\sn"+"\stpadding-bottom: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .normalTags {\sn"+"\stpadding-top: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter .button {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-left: 0.3em;\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn";config.shadowTiddlers["IntelliTaggerMainTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class=\s"favorites\s" macro=\s"intelliTagger action: showFavorites\s"></div>\sn"+"<div class=\s"normalTags\s" macro=\s"intelliTagger action: showTags\s"></div>\sn"+"<!-- The Footer (with the Navigation) ============================================ -->\sn"+"<table class=\s"intelliTaggerFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\st<span macro=\s"intelliTagger action: closeButton\s"></span>\sn"+"\st</td>\sn"+"\st<td align=\s"right\s">\sn"+"\st\st<span macro=\s"intelliTagger action: version\s"></span>, <span macro=\s"intelliTagger action: copyright \s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["IntelliTaggerEditTagsTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='title' macro='view title'></div>\sn"+"<div class='tagged' macro='tags'></div>\sn"+"<div class='viewer' macro='view text wikified'></div>\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["BSD open source license (abego Software)"]="See [[Licence|http://tiddlywiki.abego-software.de/#[[BSD open source license]]]].";config.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf]].";config.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|http://tiddlywiki.abego-software.de/archive/IntelliTaggerPlugin/Plugin-IntelliTagger-src.1.0.2.js]]\sn";(function(){var _126=restart;restart=function(){setStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"IntelliTaggerStyleSheet");_126.apply(this,arguments);};})();}\n// %/\n
/***\n|''Name:''|IntelliTagsEditCommandPlugin|\n|''Version:''|1.0.0 (2007-10-03)|\n|''Type:''|plugin|\n|''Description:''|A command for your tiddler's toolbar to directly edit the tiddler's tags using the IntelliTaggerPlugin, without switching to "edit mode".|\n|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTagsEditCommandPlugin|\n|''Requires:''|IntelliTaggerPlugin http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~CoreVersion:''|2.0.8|\n|''Browser:''|Firefox 1.5.0.2 or better|\n***/\n/***\n!Using the "IntelliTagsEditCommandPlugin"\nAdd the command {{{intelliTagsEdit}}} into the 'macro' attribute of the 'toolbar' {{{<div...>}}} in your ViewTemplate.\n\n''Example:''\n{{{\n<div class='toolbar' \n macro='toolbar -closeTiddler closeOthers +editTiddler intelliTagsEdit permalink references jump'>\n</div>\n}}}\n\nThis adds a "tags" button to the toolbar of the tiddlers (next to the ''edit'' button). Pressing the "tags" button will open the input field for the tiddler's tags and let you edit the tags with all the [[IntelliTaggerPlugin|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin]] features.\n***/\n/***\n!Source Code\n***/\n//{{{\n(function(){\n\nif (!version.extensions.IntelliTaggerPlugin)\n throw Error("IntelliTagsEditCommandPlugin requires the IntelliTaggerPlugin (http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin)");\n\nif (config.commands.intelliTagsEdit) \n return;\n\nconfig.commands.intelliTagsEdit = {\n text: "tags",\n tooltip: "edit the tags"\n};\n\nconfig.commands.intelliTagsEdit.handler = function(event,src,title) {\n var button = abego.IntelliTagger.createEditTagsButton(title, null, "tags", "edit the tags");\n button.onclick(event);\n return false;\n};\n\n})();\n//}}}\n
!!!AUDIENCE\nThe Pacific Northwest Amateur Astronomy Thesaurus is designed to serve two primary functions:\n#to facilitate the searching of documents which have been collected for amateur astronomers, and \n#to facilitate the indexing of these documents.\nThe thesaurus encompasses elements of astronomy that are observable and of interest to amateur astronomers in the Pacific Northwest region of the United States. These elements include such things as objects and phenomena that would be observed, equipment and measurements that would be used to find and observe an object, and situations that affect what can be viewed. The amateur astronomers described above and the document indexers of the Pacific Northwest Amateur Astronomy Association are the intended users of this thesaurus.\n\n!!!PURPOSE AND USE\nA thesaurus aids users in distinguishing between similar terms and choosing the best word or phrase for a particular concept. For example, there are a number of terms that can be alternately used to refer to the twinkling of stars—such as [[scintillation]], [[astronomical seeing]], [[seeing]], [[twinkling]], and [[distortions]]. The thesaurus selects the best term, or //''preferred term''//, for this concept and points the user to this term. It also allows users to find the preferred term through any of the alternate terms, or //''lead-in terms''//. In this case, astronomical seeing was chosen as the preferred term. The user who uses the word [[twinkling]] to search for documents containing this particular concept is instructed to use [[astronomical seeing]], as shown below: \n\n|noBorder|k\n|>|>|//[[twinkling]]// |\n|width:2em;| USE|[[astronomical seeing]] |\n\nA user arriving at [[astronomical seeing]] notices that there are also alternate terms for the concept, as illustrated here: \n\n|noBorder|k\n|>|>|[[astronomical seeing]] |\n|width:2em;| USED FOR|[[distortions]] |\n| | |[[scintillation]] |\n| | |[[seeing]] |\n| | |[[twinkling]] |\n\nA thesaurus is also arranged hierarchically by topic, which helps the user discover other terms that describe broader concepts (//''broader terms''//, or //''BT''//), terms that are narrower in concept (//''narrower terms''//, or //''NT''//) or terms that are conceptually related in some other way (//''related terms''//, or //''RT''//). For instance, a broader term for the [[Moon]] would be [[solar system]], while a narrower term would be [[lunar craters]]. These are, of course, reciprocal relationships. If [[Moon]] is a broader term for [[lunar craters]], then it follows that [[lunar craters]] must be a narrower term of [[Moon]]. In a thesaurus, such relationships might be shown this way:\n\n|noBorder|k\n|>|>|[[Moon]] |\n|width:2em;| BT|[[solar system]] |\n|width:2em;| BT|[[lunar craters]] |\n\nIn another example, [[calibration]] and [[telescopes]] are related terms. This is also a reciprocal relationship, as demonstrated below:\n\n|noBorder|k\n|>|>|[[calibration]] |\n|width:2em;| RT|[[telescopes]] |\n\n|noBorder|k\n|>|>|[[telescopes]] |\n|width:2em;| RT|[[calibration]] |\n\nThis thesaurus consists of <script>var preferredtids=store.reverseLookup("tags","preferred",true,"title");var nodetids=store.reverseLookup("tags","nodelabel",true,"title");wikify(" "+(preferredtids.length - nodetids.length)+" ",place);</script>preferred terms and<script>var termstids=store.reverseLookup("tags","excludeLists",false,"title");var preferredtids=store.reverseLookup("tags","preferred",true,"title");\nvar nodetids=store.reverseLookup("tags","nodelabel",true,"title");var propertids=store.reverseLookup("tags","proper_names",true,"title");wikify(" "+(termstids.length - propertids.length - preferredtids.length - nodetids.length)+" ",place);</script>lead-in terms. The preferred terms are those that were identified as the most commonly used within the field of amateur astronomy, while lead-in terms are variations or subsets of these. Terms are organized into six general categories: [[astronomical instruments]], [[measurements]], [[observable objects]], [[observable occurrences]], [[observation]], and [[time]]. These form the backbone of the hierarchy. Aside from those six terms, each preferred term will fall under a broader term (which may be one of the six categories), and may have any number of narrower, more specific terms falling under it. \n\nAlso, each preferred term may be linked to any number of other terms in different categories that it is related to and may have lead-in terms associated with it. Where it is necessary to clarify how to use a term, //''scope notes''// are used. A scope note guides the use of a particular term, and is denoted by the abbreviation //''SN''//. It explains the meaning of a term within the specific context of the thesaurus. For example, scope notes are used in this thesaurus to distinguish the meaning of the word [[oppositions]], as it is used in the context of astronomy, from other possible meanings of the term:\n\n|noBorder|k\n|>|>|[[oppositions]] |\n|width:2em;| SN|Used in positional astronomy to describe the occurrence of two planets whose ecliptic longitudes differ by 180 degrees. |\n\nBeside each of the preferred terms is a number which indicates its position within the hierarchy. Terms at the top of the hierarchy have only a single number. A second number is added for terms in the next level, a third for the next, and so on. Decimal points separate each number, representing the levels of the hierarchy. For example, the term [[meridians]] has a notation of <script>var notation=store.getValue(store.getTiddler("meridians"),"notation");wikify(notation, place);</script>, which shows that it is four levels down in the hierarchy. A notation also shows relationships between terms at the same level. In this instance, the notation for all of the terms on the same level as [[meridians]] will likewise be preceded by <script>var notation=store.getValue(store.getTiddler("meridians"),"notation");notation=notation.slice(0,notation.length-2);wikify(notation, place);</script>. \n\nThe Pacific Northwest Amateur Astronomer thesaurus features two ways of viewing terms – alphabetically or hierarchically. The [[alphabetical schedule|Alphabetical Schedule]] lists all terms, including lead-ins, along with scope notes, broader and narrower terms, in alphabetical order. This allows the user to search for a specific term, and those that are related to it. If the term is a lead-in term, it will show the user which preferred term to use. The following sample shows a section of the alphabetical schedule as it appears in the thesaurus:\n\n|noBorder|k\n|>|>|[[Sun]] <script>var notation=store.getValue(store.getTiddler("Sun"),"notation");wikify("{{{("+notation+")}}}", place);</script> |\n|width:2em;| USED FOR|[[active Sun]] |\n|width:2em;| |[[helioseismology]] |\n|width:2em;| |[[solar cycle]] |\n|width:2em;| |[[solar flares]] |\n|width:2em;| BT|[[solar system]] |\n|width:2em;| NT|[[chromosphere]] |\n|width:2em;| |[[corona]] |\n|width:2em;| |[[faculae]] |\n|width:2em;| |[[photosphere]] |\n|width:2em;| |[[sunspots]] |\n|width:2em;| RT|[[solar eclipses]] |\n\nNote that lead-in terms listed on the alphabetical schedule are italicized, to differentiate them from the preferred terms:\n\n|noBorder|k\n|>|>|//[[active Sun]]// |\n|width:2em;| USE|[[Sun]] |\n\nThe hierarchical list, or [[classified schedule|Classified Schedule]], shows the hierarchy formed by the preferred terms, leaving only the notation, narrower and broader relationships. This format allows a user to search by concept, narrowing their search until they find an appropriate term. The following is a sample of a section of the classified schedule as it appears in the thesaurus:\n\n*<[[observable objects]]> <script>var notation=store.getValue(store.getTiddler("observable objects"),"notation");wikify("{{{("+notation+")}}}", place);</script> \n**[[solar system]] <script>var notation=store.getValue(store.getTiddler("solar system"),"notation");wikify("{{{("+notation+")}}}", place);</script>\n***[[Sun]] <script>var notation=store.getValue(store.getTiddler("Sun"),"notation");wikify("{{{("+notation+")}}}", place);</script> \n****[[chromosphere]] <script>var notation=store.getValue(store.getTiddler("chromosphere"),"notation");wikify("{{{("+notation+")}}}", place);</script>\n****[[corona]] <script>var notation=store.getValue(store.getTiddler("corona"),"notation");wikify("{{{("+notation+")}}}", place);</script>\n****[[faculae]] <script>var notation=store.getValue(store.getTiddler("faculae"),"notation");wikify("{{{("+notation+")}}}", place);</script>\n****[[photosphere]] <script>var notation=store.getValue(store.getTiddler("photosphere"),"notation");wikify("{{{("+notation+")}}}", place);</script>\n****[[sunspots]] <script>var notation=store.getValue(store.getTiddler("Sun"),"sunspots");wikify("{{{("+notation+")}}}", place);</script>\n\nAlso note that a few terms, such as <[[observable objects]]>, are contained within angle brackets. These brackets indicate that a term is being used solely to maintain the structure of the hierarchy; it is not a preferred term.\n\nThere are a few additional points to remember when using this thesaurus for searching or indexing. When choosing a term for indexing or searching, use the one that is most specific, rather than one that is broader or narrower than the desired concept. For example, use [[solar eclipses]] rather than [[eclipses]], when appropriate.\n\nIt is important to note that the plural form of terms is used whenever possible. This should not make a difference when using the search function of the interface, except when the plural form of the term is Latinized, as is the case with [[corona]] and [[coronae]]. \n\n!!!FEATURES OF THE ONLINE INTERFACE\nThe Pacific Northwest Amateur Astronomy Thesaurus is available online at http://students.washington.edu/adcockm/amateurastronomythesaurus/. Across the top of the page are hyperlinks to this [[Introduction]], the [[alphabetical schedule|Alphabetical Schedule]], and [[classified schedule|Classified Schedule]]. Clicking on a term will provide more information about that term, including things such as scope notes, broader, narrower and related terms, and so on. In addition, the online interface provides definitions for some terms.\n\nSearch using the online interface is performed by entering text into the search box. This simplifies the presentation of terms in the thesaurus. Compound terms in this thesaurus are presented in direct order, as they would be in natural language. The alternative would be to present them in rotated order; that is, in an order that presents the key word first and the modifier second. \n\n|noBorder|k\n|width:2em;| Direct order:|variable stars |\n|width:2em;| Rotated order:|stars, variable |\n\nThe advantage of rotating terms is that like items can be grouped together alphabetically. However, term rotation is not necessary in this case, as the search function for the interface used with this thesaurus performs the same task. For instance, when a user types the word {{{star}}} into the search box, all terms containing the word star appear. Thus, the user has access to grouped terms this way.\n\n!!!ABBREVIATIONS\n|noBorder|k\n|width:2em;| ''BT''|broader term |\n|width:2em;| ''NT''|narrower term |\n|width:2em;| ''RT''|related term |\n|width:2em;| ''SN''|scope note |\n|width:2em;| ''USE''|use this term |\n|width:2em;| ''USED FOR''|used for this term |\n\n!!!RESOURCES\nThe list of preferred terms was drawn from a variety of popular or well known publications in the field of amateur astronomy. This includes periodicals such as //Sky & Telescope and Astronomy//, books by well known astronomers, such as //Sky: A User’s Guide// by David Levy, and sources specific to amateur astronomy’s subsets, including deep-sky and naked-eye observing. The thesaurus for the Research School of Astronomy and Astrophysics was also consulted, from the website at http://msowww.anu.edu.au/library/thesaurus. Other sources referenced in the making of this thesaurus were:\n\n* Aitchison, Jean, Alan Gilchrist, and David Bawden. __Thesaurus Construction and Use A Practical Manual__. Chicago: Fitzroy Dearborn Publishers, 2000. \n* National Information Standards Organization (U.S.). __Guidelines for the Construction, Format, and Management of Monolingual Controlled Vocabularies__. Bethesda, Md: National Information Standards Organization, 2005. \n\nThe Amateur Astronomer thesaurus was constructed in 2007 by Michael Adcock, Tim Shockley, and Sonja Sutherland, graduate students at the University of Washington’s Information School.\n\nThis online interface was adapted by Michael Adcock from [[Tiddlywiki|http://www.tiddlywiki.org/]] and uses a modified version of the [[Blackicity Theme|http://tiddlythemes.com/#Blackicity]] running on a [[MiniTiddlyServer|http://www.minitiddlyserver.com/]]. Several open source plugins were used, and a good deal of custom code was written to support thesaurus functionality.
[[Introduction]]\n[[Alphabetical Schedule]]\n[[Classified Schedule]]\n<script>\nwindow.thesaurus_sort = function(a, b)\n{\n // Since the default sorting method makes uppercase float to the top, we need a custom sort routine!\n\n var tempa = String(a).toUpperCase(); \n var tempb = String(b).toUpperCase(); \n if (tempa > tempb) \n return 1 \n if (tempa < tempb) \n return -1 \n return 0; \n} \n</script>
<<minesweeper>>
/***\n|''Name:''|Minesweeper|\n|''Version:''|0.72 (12 Oct 2005)|\n|''Source:''|Tiddly W;nks (http://www.bur.st/~blazeoz/tiddlywinks/)|\n|''Author:''|[[Daniel Baird]]|\n|''Type:''|Macro|\n!Description\nIt's minesweeper!\n\n!Syntax/Example usage\n{{{<<minesweeper>>}}} or {{{<<minesweeper [width] [height] [bombs]>>}}}\n<<minesweeper>>\n\n!Notes\n* Let me know if you want graphics, or that MSWindows Minesweeper thing where you can click with both buttons on a numbered square, and it does the thinking for you..\n\n!Revision History\n* 0.5.0 (2-Oct-05)\n** original version (Daniel)\n* 0.5.1 (3-Oct-05)\n** added the css styles via set~StyleSheet (Simon)\n* 0.5.2 (3-Oct-05)\n** added parameters to macro and fixed bug preventing detection of win (Simon)\n* 0.6 (5-Oct-05)\n** Fixed the problem with multiple games on screen at once.\n** Cleaned up the JavaScript warning generated when you clicked anywhere but on a square.\n* 0.7 (6-Oct-05)\n** Integrated sweet additions from Genesis_mage (genisis329 at gmail dot com) that:\n*** allows winning by having all non-mines clicked (without having to mark every mine)\n*** added a mark button to mark and unmark mines without the keyboard\n** Win time now shows tenths of a second.\n* 0.71 (10-Oct-05)\n** tweaked a style to make the mark button work better in IE\n* 0.72 (12-Oct-05)\n** worked out how to use a closure as a event handler, which means that the code added in 0.6 could be made a lot simpler.\n\n***/\n/*{{{*/\n\nversion.extensions.minesweeper = {major: 0, minor: 7, revision: 2};\n\nconfig.macros.minesweeper = {};\n\nconfig.macros.minesweeper.handler = function(place,macroName,params) {\n var width = params[0];\n var height = params[1];\n var bombs = params[2];\n\n if (width == undefined) width = 9;\n if (height == undefined) height = width;\n if (bombs == undefined) bombs = Math.round(width * height / 8)\n if (bombs > width * height) bombs = width * height;\n\n var aGame = new MinesweeperGame();\n\n createTiddlyElement(place,'div',aGame.id,null,'If you see this, Minesweeper is broken. Let Daniel know (DanielBaird at gmail dot com).');\n aGame.newGame(width, height, bombs);\n}\n// =======================================================================\nfunction MinesweeperGame() {\n this.idprefix = 'mines';\n this.version = '0.72 beta';\n this.id = this.idprefix + MinesweeperGame.prototype.nextid;\n MinesweeperGame.prototype.nextid++;\n return this;\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.nextid = 0;\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.newGame = function(height, width, mines) {\n this.height = height;\n this.width = width;\n this.mines = mines;\n this.total = height * width;\n this.markMode = false;\n\n this.startGame();\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.startGame = function() {\n\n this.gamestate = 'ready';\n this.clicks = 0;\n this.marks = 0;\n this.message = 'click on the board to begin';\n\n this.starttime = null;\n this.wintime = null;\n this.board = new Array();\n\n // create the squares\n for (var x = 0; x < this.height; x++) {\n var row = new Array();\n for (var y = 0; y < this.width; y++) {\n row.push( {count: 0, mine: false, clicked: false, marked: false} );\n }\n this.board.push(row);\n }\n\n // add mines\n for (var m = 0; m < this.mines; m++) {\n var mx = Math.round((this.height-1)*Math.random());\n var my = Math.round((this.width-1)*Math.random());\n if (this.board[mx][my].mine) {\n m--;\n } else {\n this.board[mx][my].mine = true;\n }\n }\n\n // work out counts\n for (var cx = 0; cx < this.height; cx++) {\n for (var cy = 0; cy < this.width; cy++) {\n var count = 0;\n for (var dx = -1; dx < 2; dx++) {\n for (var dy = -1; dy < 2; dy++) {\n var nx = cx + dx;\n var ny = cy + dy;\n if ( (!(dx==0 && dy==0))\n && (nx >= 0) && (nx < this.height)\n && (ny >= 0) && (ny < this.width)\n && this.board[nx][ny].mine) {\n count++;\n }\n }\n }\n this.board[cx][cy].count = count;\n }\n }\n this.showBoard();\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.showBoard = function() {\n var node = document.getElementById(this.id);\n var html = new Array();\n html.push('<table class="minefield" cellspacing="2">');\n html.push('<tr><td class="info" colspan="'+this.width+'">');\n html.push('Minesweeper '+this.version+'<br /><b>'+this.gamestate+'</b>');\n if (this.gamestate == 'playing') {\n this.message = (this.mines - this.marks)+' mines unmarked';\n }\n html.push('</td></tr>');\n for (var x = 0; x < this.height; x++) {\n html.push('<tr>');\n for (var y = 0; y < this.width; y++) {\n html.push( this.makeSquare(x,y) );\n }\n html.push('</tr>');\n }\n var cls = 'un';\n if (this.markMode) cls = '';\n html.push('<tr><td id="'+this.id+'_markbtn" class="'+cls+'clicked widebtn" colspan="'+this.width+'">mark / unmark mines</td></tr>');\n html.push('<tr><td class="info" colspan="'+this.width+'">'+this.message);\n html.push('<small>');\n html.push('<br /><span class="minesweeper' + cls + 'show">ctrl- shift- or alt-</span>click to reveal a square');\n html.push('<br /><span class="minesweeper' + cls + 'hide">ctrl- shift- or alt-</span>click to mark a mine');\n html.push('</small>');\n html.push('</td></tr>');\n html.push('</table>');\n node.innerHTML = html.join('');\n node.onclick = this.getClickHandler();\n}\n// -----------------------------------------------------------------------\nMinesweeperGame.prototype.makeSquare = function(x,y) {\n var sq = this.board[x][y];\n var reveal = (this.gamestate != 'playing' && this.gamestate != 'ready');\n var html = new Array();\n if (sq.clicked) {\n html.push('<td class="clicked" id="'+this.id+'_x-'+x+'_y-'+y+'">');\n if (!sq.marked && reveal && sq.mine) {\n html.push('B!');\n } else if (!sq.marked && reveal && sq.mine) {\n html.push('B!');\n } else if (sq.count > 0){\n html.push(sq.count);\n } else {\n html.push(' ');\n }\n } else {\n html.push('<td class="unclicked" id="'+this.id+'_x-'+x+'_y-'+y+'">');\n if (sq.marked && !reveal) {\n html.push('B?');\n } else if (sq.marked && sq.mine && reveal) {\n html.push('B');\n } else if (sq.marked && !sq.mine && reveal) {\n html.push('X');\n } else if (sq.mine && reveal) {\n html.push('B!');\n } else {\n html.push(' ');\n }\n }\n html.push('</td>');\n return html.join('');\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.clickSquare = function(cx,cy,modifier) {\n if (this.gamestate == 'ready') {\n this.starttime = new Date();\n this.gamestate = 'playing';\n }\n if (this.gamestate == 'playing') {\n if (!this.board[cx][cy].clicked) {\n if ( (modifier && !this.markMode) || (!modifier && this.markMode) ) {\n if (this.board[cx][cy].marked) {\n this.marks--;\n this.board[cx][cy].marked = false;\n } else {\n this.marks++;\n this.board[cx][cy].marked = true;\n }\n } else if (!this.board[cx][cy].clicked && !this.board[cx][cy].marked) {\n this.revealSquare(cx,cy);\n }\n this.markMode = false;\n }\n this.checkWin();\n this.showBoard();\n } else {\n // clicked when we're not playing..\n this.startGame();\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.revealSquare = function(x,y) {\n if (this.board[x][y].clicked == false && this.board[x][y].marked == false) {\n this.board[x][y].clicked = true;\n this.clicks++;\n if (this.board[x][y].mine) {\n this.gamestate = 'boom!';\n this.message = 'click board to play again';\n } else if (this.board[x][y].count == 0) {\n // if it's a zero, we might have to reveal some other squares..\n for (var dx = -1; dx < 2; dx++) {\n for (var dy = -1; dy < 2; dy++) {\n var nx = x + dx;\n var ny = y + dy;\n if ( (!(dx==0 && dy==0)) && (nx >= 0) && (nx < this.height) && (ny >= 0) && (ny < this.width) ) {\n this.revealSquare(nx,ny);\n }\n }\n }\n }\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.handleClick = function(e) {\n // work out which cell was clicked\n if (!e) var e = window.event;\n var str = resolveTarget(e).id;\n if (str && str != undefined) {\n if (str == this.id + '_markbtn') {\n this.markMode = !this.markMode;\n this.showBoard();\n } else {\n var cx = parseInt(str.substr( str.indexOf('x-')+2 ));\n var cy = parseInt(str.substr( str.indexOf('y-')+2 ));\n if ( !isNaN(cx) && !isNaN(cy) ) {\n this.clickSquare(cx,cy,(e.altKey || e.shiftKey || e.ctrlKey));\n }\n }\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.getClickHandler = function() {\n var thisGame = this;\n return function(e) {\n thisGame.handleClick(e);\n }\n}\n// -------------------------------------------------------------------\nMinesweeperGame.prototype.checkWin = function() {\n if (this.clicks == this.total - this.mines && this.gamestate !='boom!') {\n this.gamestate = 'win';\n this.wintime = new Date();\n this.message = 'You won in '+Math.round(((this.wintime - this.starttime)/100))/10+' seconds';\n this.message = this.message + '<br />click board to play again';\n }\n}\n// -----------------------------------------------------------------------\n\nsetStylesheet(\n ".viewer .minefield { "+\n "background: #ddd; "+\n "border: double 3px black; "+\n "border-collapse: separate; "+\n "border-spacing: 2px; "+\n "} \sn"+\n\n ".viewer .minefield td { "+\n "cursor: default; "+\n "width: 1.3em; "+\n "height: 1.1em; "+\n "text-align: center; "+\n "vertical-align: center; "+\n "background: #ddd; "+\n "border: 1px solid #ccc; "+\n "} \sn"+\n\n ".viewer .minefield td.info, .viewer .minefield td.widebtn { "+\n "width: auto; "+\n "} \sn"+\n\n ".minesweeperhide, .minesweeperunshow { "+\n "display: none; "+\n "} \sn"+\n\n ".viewer .minefield td.unclicked { "+\n "cursor: pointer; "+\n "border-color: #fff; "+\n "border-right-color: #999; "+\n "border-bottom-color: #999; "+\n "} \sn"+\n "",\n "MinesweeperGame");\n\n/*}}}*/
/***\n|Name|NestedSlidersPlugin|\n|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|\n|Version|2.3.1|\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires||\n|Overrides|Slider.prototype.stop|\n|Description|show content in nest-able 'slider' or 'floating' panels, without needing to create separate tiddlers for each panel|\n\n!!!!!Configuration\n<<<\nEnable animation for slider panels\n<<option chkFloatingSlidersAnimate>> allow sliders to animate when opening/closing\n>(note: This setting is in //addition// to the general option for enabling/disabling animation effects:\n><<option chkAnimate>> enable animations (entire document)\n>For slider animation to occur, you must also allow animation in general.\n\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\n<<<\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. You 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\nAdditional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*transient display (clicking elsewhere closes panel)\n*custom class/label/tooltip/accesskey\n*alternate label/tooltip (displayed when panel is open)\n*panelID (for later use with {{{<<DOM>>}}} macro. See [[DOMTweaksPlugin]])\n*automatic blockquote style on panel\n*deferred rendering of panel content\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip][altlabel|alttooltip]}}}#panelID:>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}<br>marks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.\n* {{{(cookiename)}}}<br>saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.\n* {{{!}}} through {{{!!!!!}}}<br>displays the slider label using a formatted headline (Hn) style instead of a button/link style\n* {{{^width^}}} (or just {{{^}}})<br>makes 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* {{{"*"}}} //(without the quotes)//<br>denotes "transient display": when a click occurs elsewhere in the document, the slider/floating panel will be automatically closed. This is useful for creating 'pulldown menus' that automatically go away after they are used.\n* """{{class{[label=key|tooltip][altlabel|alttooltip]}}}"""<br>uses label/tooltip/accesskey. """{{class{...}}}""", """=key""", """|tooltip""" and """[altlabel|alttooltip]""" are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. altlabel/alttooltip specifiy alternative label/tooltip for use when slider/floating panel is displayed.\n* {{{#panelID:}}}<br>defines a unique DOM element ID that is assigned to the panel element used to display the slider content. This ID can then be used later to reposition the panel using the {{{<<DOM move id>>}}} macro (see [[DOMTweaksPlugin]]), or to access/modify the panel element through use of {{{document.getElementById(...)}}}) javascript code in a plugin or inline script.\n* {{{">"}}} //(without the quotes)//<br>automatically adds blockquote formatting to slider content\n* {{{"..."}}} //(without the quotes)//<br>defers 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\n<<<\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, transient, 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,\n plus a floating panel with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could in turn contain a transient panel,\n perhaps 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,\n plus a floating panel with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could in turn contain a transient panel,\n perhaps 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''2007.07.26 - 2.3.1'' in document.onclick(), propagate return value from hijacked core click handler to consume OR bubble up click as needed. Fixes "IE click disease", whereby nearly every mouse click causes a page transition.\n''2007.07.20 - 2.3.0'' added syntax for setting panel ID (#panelID:). This allows individual slider panels to be repositioned within tiddler content simply by giving them a unique ID and then moving them to the desired location using the {{{<<DOM move id>>}}} macro.\n''2007.07.19 - 2.2.0'' added syntax for alttext and alttip (button label and tooltip to be displayed when panel is open)\n''2007.07.14 - 2.1.2'' corrected use of 'transient' attribute in IE to prevent (non-recursive) infinite loop\n''2007.07.12 - 2.1.0'' replaced use of "*" for 'open/close on rollover' (which didn't work too well). "*" now indicates 'transient' panels that are automatically closed if a click occurs somewhere else in the document. This permits use of nested sliders to create nested "pulldown menus" that automatically disappear after interaction with them has been completed. Also, in onClickNestedSlider(), use "theTarget.sliderCookie", instead of "this.sliderCookie" to correct cookie state tracking when automatically dismissing transient panels.\n''2007.06.10 - 2.0.5'' add check to ensure that window.adjustSliderPanel() is defined before calling it (prevents error on shutdown when mouse event handlers are still defined)\n''2007.05.31 - 2.0.4'' add handling to invoke adjustSliderPanel() for onmouseover events on slider button and panel. This allows the panel position to be re-synced when the button position shifts due to changes in unrelated content above it on the page. (thanks to Harsha for bug report)\n''2007.03.30 - 2.0.3'' added chkFloatingSlidersAnimate (default to FALSE), so that slider animation can be disabled independent of the overall document animation setting (avoids strange rendering and focus problems in floating panels)\n''2007.03.01 - 2.0.2'' for TW2.2+, hijack Morpher.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2007.03.01 - 2.0.1'' in hijack for Slider.prototype.stop, use apply() to pass params to core function\n|please see [[NestedSlidersPluginHistory]] for additional revision details|\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: 3, revision: 1, date: new Date(2007,7,26)};\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;\nif (config.options.chkFloatingSlidersAnimate==undefined) config.options.chkFloatingSlidersAnimate=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[[^\s\s]]*\s\s])?(?:\s\s}{3})?(\s\s#[^:]*\s\s:)?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\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 // var defopen=lookaheadMatch[1]\n // var cookiename=lookaheadMatch[2]\n // var header=lookaheadMatch[3]\n // var panelwidth=lookaheadMatch[4]\n // var transient=lookaheadMatch[5]\n // var class=lookaheadMatch[6]\n // var label=lookaheadMatch[7]\n // var openlabel=lookaheadMatch[8]\n // var panelID=lookaheadMatch[9]\n // var blockquote=lookaheadMatch[10]\n // var deferred=lookaheadMatch[11]\n\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey, no alternate text/tip\n var show="none"; var cookie=""; var key="";\n var closedtext=">"; var closedtip="";\n var openedtext="<"; var openedtip="";\n\n // extra "+", default to open\n if (lookaheadMatch[1]) show="block";\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 show=config.options[cookie]?"block":"none";\n }\n\n // parse label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[7]) {\n var parts=lookaheadMatch[7].trim().slice(1,-1).split("|");\n closedtext=parts.shift();\n if (closedtext.substr(closedtext.length-2,1)=="=") \n { key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }\n openedtext=closedtext;\n if (parts.length) closedtip=openedtip=parts.join("|");\n else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }\n }\n\n // parse alternate label/tooltip: [label|tooltip]\n if (lookaheadMatch[8]) {\n var parts=lookaheadMatch[8].trim().slice(1,-1).split("|");\n openedtext=parts.shift();\n if (parts.length) openedtip=parts.join("|");\n else openedtip="hide "+openedtext;\n }\n\n var title=show=='block'?openedtext:closedtext;\n var tooltip=show=='block'?openedtip:closedtip;\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 btn.innerHTML=title; // enables use of HTML entities in label\n\n // set extra button attributes\n btn.setAttribute("closedtext",closedtext);\n btn.setAttribute("closedtip",closedtip);\n btn.setAttribute("openedtext",openedtext);\n btn.setAttribute("openedtip",openedtip);\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 btn.onmouseover=function(event) // mouseover on button aligns floater position with button\n { if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel,this.sliderPanel.className); }\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panelID=lookaheadMatch[9]; if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters\n var panel=createTiddlyElement(place,"div",panelID,panelClass,null);\n panel.button = btn; // so the slider panel know which button it belongs to\n btn.sliderPanel=panel; // so the button knows which slider panel it belongs to\n panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):"";\n panel.setAttribute("transient",lookaheadMatch[5]=="*"?"true":"false");\n panel.style.display = show;\n panel.style.width=panel.defaultPanelWidth;\n panel.onmouseover=function(event) // mouseover on panel aligns floater position with button\n { if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this,this.className); }\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[11]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[10]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align floater position with button\n if (window.adjustSliderPos) window.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[10]?"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\n // toggle label\n theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");\n // toggle tooltip\n theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));\n\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 && (theSlider.className!='floatingPanel' || config.options.chkFloatingSlidersAnimate))\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 floater panel position with target button\n if (!isOpen && window.adjustSliderPos) window.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 var cookie=theTarget.sliderCookie;\n if (cookie && cookie.length) {\n config.options[cookie]=!isOpen;\n if (config.options[cookie]!=theTarget.defOpen)\n saveOptionCookie(cookie);\n else { // remove cookie if slider is in default display state\n var ex=new Date(); ex.setTime(ex.getTime()-1000);\n document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();\n }\n }\n return false;\n}\n//}}}\n\n//{{{\n// click in document background closes transient panels \ndocument.nestedSliders_savedOnClick=document.onclick;\ndocument.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);\n // call original click handler\n if (document.nestedSliders_savedOnClick)\n var retval=document.nestedSliders_savedOnClick.apply(this,arguments);\n // if click was inside transient panel (or something contained by a transient panel)... leave it alone\n var p=target;\n while (p)\n if ((p.className=="floatingPanel"||p.className=="sliderPanel")&&p.getAttribute("transient")=="true") break;\n else p=p.parentNode;\n if (p) return retval;\n // otherwise, find and close all transient panels...\n var all=document.all?document.all:document.getElementsByTagName("DIV");\n for (var i=0; i<all.length; i++) {\n // if it is not a transient panel, or the click was on the button that opened this panel, don't close it.\n if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;\n // otherwise, if the panel is currently visible, close it by clicking it's button\n if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button}) \n }\n return retval;\n};\n//}}}\n\n//{{{\n// adjust floating 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 (findPosX(btn)+panel.offsetWidth > getWindowWidth()) // adjust position to stay inside right window edge\n left-=findPosX(btn)+panel.offsetWidth-getWindowWidth()+15; // add extra 15px 'fudge factor'\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\n//{{{\n// TW2.1 and earlier:\n// hijack Slider animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n { this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }\n\n// TW2.2+\n// hijack Morpher animation handler 'stop' handler so overflow is visible after animation has completed\nif (version.major+.1*version.minor+.01*version.revision>=2.2) {\n Morpher.prototype.coreStop = Morpher.prototype.stop;\n Morpher.prototype.stop = function()\n { this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }\n}\n//}}}
[[Welcome]]
/***\n| Name:|NewHerePlugin|\n| Description:|Creates the new here and new journal macros|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\nmerge(config.macros, {\n newHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n },\n newJournalHere: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);\n }\n }\n});\n\n//}}}\n\n
A type of reflecting telescope invented by the British scientist Sir Isaac Newton.
<<newTiddler>>\n<<mtslogin>>\n<<saveChanges>>\n<<mtsdownload>>\n\n<<fontSize font-size: >>\n\n----\nAlso see AdvancedOptions[[! |MineSweeper]]\n\n<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
<!--{{{-->\n\n<div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
/***\n|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|\n|''Version:''|1.0.9 (2007-07-14)|\n|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.3|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Table of Content<html><a name="TOC"/></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>\n** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>\n* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>\n!Description<html><a name="Description"/></html>\nWith the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. \nEach part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features"). E.g. you may create links to the parts (e.g. {{{[[Quotes/BAX95]]}}} or {{{[[Hobbies|AboutMe/Hobbies]]}}}), use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.\n\n\n''Syntax:'' \n|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|\n|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//. <<br>>If you use a partName containing spaces you need to quote it (e.g. {{{"Major Overview"}}} or {{{[[Shortcut List]]}}}).|\n|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|\n|<html><i>any tiddler content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Applications<html><a name="Applications"/></html>\n!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>\nAssume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.\n\nNotice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Citation Index<html><a name="Citation"/></html>\nCreate a tiddler "Citations" that contains your "citations". \nWrap every citation with a part and a proper name. \n\n''Example''\n{{{\n<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// \nin //Proc. ICSM//, 1998.</part>\n\n<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// \nThesis, Uni Stuttgart, 2002.</part>\n\n<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// \nin //Proc. ICSM//, 1999.</part>\n}}}\n\nYou may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>\nYou may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list\n{{{\n* Item 1\n* Item 2\n* Item 3\n}}}\ninto a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.\n\nUsing the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.\n\n''Example''\n{{{\n|!Subject|!Items|\n|subject1|<<tiddler ./Cell1>>|\n|subject2|<<tiddler ./Cell2>>|\n\n<part Cell1 hidden>\n* Item 1\n* Item 2\n* Item 3\n</part>\n...\n}}}\n\nNotice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".\n\nBTW: The same approach can be used to create bullet lists with items that contain more than one line.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Creating Tabs<html><a name="Tabs"/></html>\nThe build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.\n\nWith the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.\n\n''Example''\nThe standard tabs at the sidebar are defined by the following eight tiddlers:\n* SideBarTabs\n* TabAll\n* TabMore\n* TabMoreMissing\n* TabMoreOrphans\n* TabMoreShadowed\n* TabTags\n* TabTimeline\n\nInstead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:\n{{{\n<<tabs txtMainTab \n Timeline Timeline SideBarTabs/Timeline \n All 'All tiddlers' SideBarTabs/All \n Tags 'All tags' SideBarTabs/Tags \n More 'More lists' SideBarTabs/More>>\n<part Timeline hidden><<timeline>></part>\n<part All hidden><<list all>></part>\n<part Tags hidden><<allTags>></part>\n<part More hidden><<tabs txtMoreTab \n Missing 'Missing tiddlers' SideBarTabs/Missing \n Orphans 'Orphaned tiddlers' SideBarTabs/Orphans \n Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>\n<part Missing hidden><<list missing>></part>\n<part Orphans hidden><<list orphans>></part>\n<part Shadowed hidden><<list shadowed>></part>\n}}}\n\nNotice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.\n\nE.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:\n{{{\n<<forEachTiddler \n sortBy 'tiddler.modified' descending \n write '(index < 100) ? "* [["+tiddler.title+"]]\sn":""'>>\n}}}\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!!Using Sliders<html><a name="Sliders"/></html>\nVery similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature\n\n''Example''\nIn a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.\n{{{\n...\n<<slider chkAboutDetails About/Details details "Click here to see more details">>\n<part Details hidden>\nTo give you a better overview ...\n</part>\n...\n}}}\n\nNotice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.\n\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Revision history<html><a name="Revisions"/></html>\n* v1.0.9 (2007-07-14)\n** Bugfix: Error when using the SideBarTabs example and switching between "More" and "Shadow". Thanks to cmari for reporting the issue.\n* v1.0.8 (2007-06-16)\n** Speeding up display of tiddlers containing multiple pard definitions. Thanks to Paco Rivière for reporting the issue.\n** Support "./partName" syntax inside <<tabs ...>> macro\n* v1.0.7 (2007-03-07)\n** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.\n* v1.0.6 (2006-11-07)\n** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.\n* v1.0.5 (2006-03-02)\n** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.\n* v1.0.4 (2006-02-28)\n** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.\n* v1.0.3 (2006-02-26)\n** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.\n* v1.0.2 (2006-02-05)\n** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)\n* v1.0.1 (2006-01-27)\n** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.\n** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.\n* v1.0.0 (2006-01-25)\n** initial version\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Code<html><a name="Code"/></html>\n<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n//{{{\n//============================================================================\n// PartTiddlerPlugin\n\n// Ensure that the PartTiddler Plugin is only installed once.\n//\nif (!version.extensions.PartTiddlerPlugin) {\n\n\n\nversion.extensions.PartTiddlerPlugin = {\n major: 1, minor: 0, revision: 9,\n date: new Date(2007, 6, 14), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"\n};\n\nif (!window.abego) window.abego = {};\nif (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");\n\n//============================================================================\n// Common Helpers\n\n// Looks for the next newline, starting at the index-th char of text. \n//\n// If there are only whitespaces between index and the newline \n// the index behind the newline is returned, \n// otherwise (or when no newline is found) index is returned.\n//\nvar skipEmptyEndOfLine = function(text, index) {\n var re = /(\sn|[^\ss])/g;\n re.lastIndex = index;\n var result = re.exec(text);\n return (result && text.charAt(result.index) == '\sn') \n ? result.index+1\n : index;\n}\n\n\n//============================================================================\n// Constants\n\nvar partEndOrStartTagRE = /(<\s/part>)|(<part(?:\ss+)((?:[^>])+)>)/mg;\nvar partEndTagREString = "<\s\s/part>";\nvar partEndTagString = "</part>";\n\n//============================================================================\n// Plugin Specific Helpers\n\n// Parse the parameters inside a <part ...> tag and return the result.\n//\n// @return [may be null] {partName: ..., isHidden: ...}\n//\nvar parseStartTagParams = function(paramText) {\n var params = paramText.readMacroParams();\n if (params.length == 0 || params[0].length == 0) return null;\n \n var name = params[0];\n var paramsIndex = 1;\n var hidden = false;\n if (paramsIndex < params.length) {\n hidden = params[paramsIndex] == "hidden";\n paramsIndex++;\n }\n \n return {\n partName: name, \n isHidden: hidden\n };\n}\n\n// Returns the match to the next (end or start) part tag in the text, \n// starting the search at startIndex.\n// \n// When no such tag is found null is returned, otherwise a "Match" is returned:\n// [0]: full match\n// [1]: matched "end" tag (or null when no end tag match)\n// [2]: matched "start" tag (or null when no start tag match)\n// [3]: content of start tag (or null if no start tag match)\n//\nvar findNextPartEndOrStartTagMatch = function(text, startIndex) {\n var re = new RegExp(partEndOrStartTagRE);\n re.lastIndex = startIndex;\n var match = re.exec(text);\n return match;\n}\n\n//============================================================================\n// Formatter\n\n// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.\n//\n// @return true if a complete part section (including the end tag) could be processed, false otherwise.\n//\nvar handlePartSection = function(w) {\n var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);\n if (!tagMatch) return false;\n if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;\n\n // Parse the start tag parameters\n var arguments = parseStartTagParams(tagMatch[3]);\n if (!arguments) return false;\n \n // Continue processing\n var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);\n var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);\n if (endMatch && endMatch[1]) {\n if (!arguments.isHidden) {\n w.nextMatch = startTagEndIndex;\n w.subWikify(w.output,partEndTagREString);\n }\n w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);\n \n return true;\n }\n return false;\n}\n\nconfig.formatters.push( {\n name: "part",\n match: "<part\s\ss+[^>]+>",\n \n handler: function(w) {\n if (!handlePartSection(w)) {\n w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);\n }\n }\n} )\n\n//============================================================================\n// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers \n// as tiddlers.\n\nvar currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)\n\n// Return the match to the first <part ...> tag of the text that has the\n// requrest partName.\n//\n// @return [may be null]\n//\nvar findPartStartTagByName = function(text, partName) {\n var i = 0;\n \n while (true) {\n var tagMatch = findNextPartEndOrStartTagMatch(text, i);\n if (!tagMatch) return null;\n\n if (tagMatch[2]) {\n // Is start tag\n \n // Check the name\n var arguments = parseStartTagParams(tagMatch[3]);\n if (arguments && arguments.partName == partName) {\n return tagMatch;\n }\n }\n i = tagMatch.index+tagMatch[0].length;\n }\n}\n\n// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler \n// object, using fullName as the Tiddler's title. \n//\n// All remaining properties of the new Tiddler (tags etc.) are inherited from \n// the parentTiddler.\n// \n// @return [may be null]\n//\nvar getPart = function(parentTiddler, partName, fullName) {\n var text = parentTiddler.text;\n var startTag = findPartStartTagByName(text, partName);\n if (!startTag) return null;\n \n var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);\n var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);\n\n if (indexOfEndTag >= 0) {\n var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);\n var partTiddler = new Tiddler();\n partTiddler.set(\n fullName,\n partTiddlerText,\n parentTiddler.modifier,\n parentTiddler.modified,\n parentTiddler.tags,\n parentTiddler.created);\n partTiddler.abegoIsPartTiddler = true;\n return partTiddler;\n }\n \n return null;\n}\n\n// Hijack the store.fetchTiddler to recognize the "part" addresses.\n//\nvar hijackFetchTiddler = function() {\n var oldFetchTiddler = store.fetchTiddler ;\n store.fetchTiddler = function(title) {\n var result = oldFetchTiddler.apply(this, arguments);\n if (!result && title) {\n var i = title.lastIndexOf('/');\n if (i > 0) {\n var parentName = title.substring(0, i);\n var partName = title.substring(i+1);\n var parent = (parentName == ".") \n ? store.resolveTiddler(currentParent)\n : oldFetchTiddler.apply(this, [parentName]);\n if (parent) {\n return getPart(parent, partName, parent.title+"/"+partName);\n }\n }\n }\n return result; \n };\n};\n\n// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. \n// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.\n// Otherwise hijack now.\nif (!store) {\n var oldRestartFunc = restart;\n window.restart = function() {\n hijackFetchTiddler();\n oldRestartFunc.apply(this,arguments);\n };\n} else\n hijackFetchTiddler();\n\n\n\n\n// The user must not edit a readOnly/partTiddler\n//\n\nconfig.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;\n\nTiddler.prototype.isReadOnly = function() {\n // Tiddler.isReadOnly was introduced with TW 2.0.6.\n // For older version we explicitly check the global readOnly flag\n if (config.commands.editTiddler.oldIsReadOnlyFunction) {\n if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;\n } else {\n if (readOnly) return true;\n }\n\n return this.abegoIsPartTiddler;\n}\n\nconfig.commands.editTiddler.handler = function(event,src,title)\n{\n var t = store.getTiddler(title);\n // Edit the tiddler if it either is not a tiddler (but a shadowTiddler)\n // or the tiddler is not readOnly\n if(!t || !t.abegoIsPartTiddler)\n {\n clearMessage();\n story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);\n story.focusTiddler(title,"text");\n return false;\n }\n}\n\n// To allow the "./partName" syntax in macros we need to hijack \n// the invokeMacro to define the "currentParent" while it is running.\n// \nvar oldInvokeMacro = window.invokeMacro;\nfunction myInvokeMacro(place,macro,params,wikifier,tiddler) {\n var oldCurrentParent = currentParent;\n if (tiddler) currentParent = tiddler;\n try {\n oldInvokeMacro.apply(this, arguments);\n } finally {\n currentParent = oldCurrentParent;\n }\n}\nwindow.invokeMacro = myInvokeMacro;\n\n// To correctly support the "./partName" syntax while refreshing we need to hijack \n// the config.refreshers.tiddlers to define the "currentParent" while it is running.\n// \n(function() {\n var oldTiddlerRefresher= config.refreshers.tiddler;\n config.refreshers.tiddler = function(e,changeList) {\n var oldCurrentParent = currentParent;\n try {\n currentParent = e.getAttribute("tiddler");\n return oldTiddlerRefresher.apply(this,arguments);\n } finally {\n currentParent = oldCurrentParent;\n }\n };\n})();\n\n// Support "./partName" syntax inside <<tabs ...>> macro\n(function() {\n var extendRelativeNames = function(e, title) {\n var nodes = e.getElementsByTagName("a");\n for(var i=0; i<nodes.length; i++) {\n var node = nodes[i];\n var s = node.getAttribute("content");\n if (s && s.indexOf("./") == 0)\n node.setAttribute("content",title+s.substr(1));\n }\n };\n var oldHandler = config.macros.tabs.handler;\n config.macros.tabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var result = oldHandler.apply(this,arguments);\n if (tiddler)\n extendRelativeNames(place, tiddler.title);\n return result;\n };\n})();\n\n// Scroll the anchor anchorName in the viewer of the given tiddler visible.\n// When no tiddler is defined use the tiddler of the target given event is used.\nwindow.scrollAnchorVisible = function(anchorName, tiddler, evt) {\n var tiddlerElem = null;\n if (tiddler) {\n tiddlerElem = document.getElementById(story.idPrefix + tiddler);\n }\n if (!tiddlerElem && evt) {\n var target = resolveTarget(evt);\n tiddlerElem = story.findContainingTiddler(target);\n }\n if (!tiddlerElem) return;\n\n var children = tiddlerElem.getElementsByTagName("a");\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n var name = child.getAttribute("name");\n if (name == anchorName) {\n var y = findPosY(child);\n window.scrollTo(0,y);\n return;\n }\n }\n}\n\n} // of "install only once"\n//}}}\n\n/***\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n\n<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>\n***/\n
/***\n| Name|QuickOpenTagPlugin|\n| Description|Changes tag links to make it easier to open tags as tiddlers|\n| Version|3.0.1 ($Rev: 2342 $)|\n| Date|$Date: 2007-07-05 10:57:49 +1000 (Thu, 05 Jul 2007) $|\n| Source|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n***/\n//{{{\nconfig.quickOpenTag = {\n\n dropdownChar: (document.all ? "\su25bc" : "\su25be"), // the little one doesn't work in IE?\n\n createTagButton: function(place,tag,excludeTiddler) {\n // little hack so we can to <<tag PrettyTagName|RealTagName>>\n var splitTag = tag.split("|");\n var pretty = tag;\n if (splitTag.length == 2) {\n tag = splitTag[1];\n pretty = splitTag[0];\n }\n \n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyText(createTiddlyLink(sp,tag,false),pretty);\n \n var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if (excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n },\n\n miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,\n config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n },\n\n allTagsHandler: function(place,macroName,params) {\n var tags = store.getTags(params[0]);\n var filter = params[1]; // new feature\n var ul = createTiddlyElement(place,"ul");\n if(tags.length == 0)\n createTiddlyElement(ul,"li",null,"listTitle",this.noTags);\n for(var t=0; t<tags.length; t++) {\n var title = tags[t][0];\n if (!filter || (title.match(new RegExp('^'+filter)))) {\n var info = getTiddlyLinkInfo(title);\n var theListItem =createTiddlyElement(ul,"li");\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n var theDropDownBtn = createTiddlyButton(theListItem," " +\n config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by QuickOpenTagPlugin */",\n".tagglyTagged .quickopentag, .tagged .quickopentag ",\n" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",\n".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",\n".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",\n"/* extra specificity to make it work right */",\n"#displayArea .viewer .quickopentag a.button, ",\n"#displayArea .viewer .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink, ",\n"#mainMenu .quickopentag a.tiddyLink ",\n" { border:0px solid black; }",\n"#displayArea .viewer .quickopentag a.button, ",\n"#mainMenu .quickopentag a.button ",\n" { margin-left:0px; padding-left:2px; }",\n"#displayArea .viewer .quickopentag a.tiddlyLink, ",\n"#mainMenu .quickopentag a.tiddlyLink ",\n" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",\n"a.miniTag {font-size:150%;} ",\n"#mainMenu .quickopentag a.button ",\n" /* looks better in right justified main menus */",\n" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", \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 ""].join("\sn"),\n\n init: function() {\n // we fully replace these builtins. can't hijack them easily\n window.createTagButton = this.createTagButton;\n config.macros.allTags.handler = this.allTagsHandler;\n config.macros.miniTag = { handler: this.miniTagHandler };\n config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;\n store.addNotification("QuickOpenTagStyles",refreshStyles);\n }\n}\n\nconfig.quickOpenTag.init();\n\n//}}}\n
/***\n| Name:|RenameTagsPlugin|\n| Description:|Allows you to easily rename or delete tags across multiple tiddlers|\n| Version:|3.0 ($Rev: 1845 $)|\n| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|\n| Author:|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\nRename a tag and you will be prompted to rename it in all its tagged tiddlers.\n***/\n//{{{\nconfig.renameTags = {\n\n prompts: {\n rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",\n remove: "Remove the tag '%0' from %1 tidder%2?"\n },\n\n removeTag: function(tag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,tag);\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n renameTag: function(oldTag,newTag,tiddlers) {\n store.suspendNotifications();\n for (var i=0;i<tiddlers.length;i++) {\n store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old\n store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new\n }\n store.resumeNotifications();\n store.notifyAll();\n },\n\n storeMethods: {\n\n saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,\n\n saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields) {\n if (title != newTitle) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0) {\n // then we are renaming a tag\n if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.renameTag(title,newTitle,tagged);\n\n if (!this.tiddlerExists(title) && newBody == "")\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields);\n },\n\n removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,\n\n removeTiddler: function(title) {\n var tagged = this.getTaggedTiddlers(title);\n if (tagged.length > 0)\n if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))\n config.renameTags.removeTag(title,tagged);\n return this.removeTiddler_orig_renameTags(title);\n }\n\n },\n\n init: function() {\n merge(TiddlyWiki.prototype,this.storeMethods);\n }\n}\n\nconfig.renameTags.init();\n\n//}}}\n\n
/***\n| Name|SaveCloseTiddlerPlugin|\n| Description|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|\n| Version|3.0 ($Rev: 2134 $)|\n| Date|$Date: 2007-04-30 16:11:12 +1000 (Mon, 30 Apr 2007) $|\n| Source|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\nTo use these you must add them to the tool bar in your EditTemplate\n***/\n//{{{\nmerge(config.commands,{\n\n saveCloseTiddler: {\n text: 'done/close',\n tooltip: 'Save changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.saveTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n },\n\n cancelCloseTiddler: {\n text: 'cancel/close',\n tooltip: 'Undo changes to this tiddler and close it',\n handler: function(e,src,title) {\n config.commands.cancelTiddler.handler(e,src,title);\n config.commands.closeTiddler.handler(e,src,title);\n return false;\n }\n }\n\n});\n\n//}}}\n\n
<<tagCloud systemConfig excludeSearch excludeLists excludeMissing>>
<<search>><<closeAll>><<permaview>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
by Michael Adcock, Tim Shockley, and Sonja Sutherland\n
The Pacific Northwest Amateur Astronomy Thesaurus
/*{{{*/\n/*Blackicity Theme for TiddlyWiki*/\n/*Design and CSS by Saq Imtiaz*/\n/*Version 1.0*/\n/*}}}*/\n/*{{{*/\n\nbody{ font-family: "Neue Helvetica", Helvetica, "Lucida Grande", Verdana, sans-serif;\n background-color: #fff;\n color: #333;}\n\n#topMenu {position:relative; background:#282826; padding:10px; color:#fff;font-family:'Lucida Grande', Verdana, Sans-Serif;}\n#topMenu br {display:none;}\n\n#topMenu a{ color: #999;\n padding: 0px 8px 0px 8px;\n border-right: 1px solid #444;}\n#topMenu a:hover {color:#fff; background:transparent;}\n\n#displayArea {margin-left:1em; margin-bottom:2em; margin-top:0.5em;}\n\n\na, a:hover{\ncolor:#333;\ntext-decoration: none; background:transparent; \n}\n\n.viewer a, .viewer a:hover {border-bottom:1px dotted #333; font-weight:bold;}\n\n\n.viewer .button, .editorFooter .button{\ncolor: #333;\nborder: 1px solid #333;\n}\n\n.viewer .button:hover,\n.editorFooter .button:hover, .viewer .button:active, .viewer .highlight,.editorFooter .button:active, .editorFooter .highlight{\ncolor: #fff;\nbackground: #333;\nborder-color: #333;\n}\n\n.tiddler .viewer {line-height:1.45em;}\n.title {color:#222; border-bottom:1px solid#222; font-family:'Lucida Grande', Verdana, Sans-Serif; font-size:1.5em;}\n.subtitle, .subtitle a { color: #999999; font-size: 0.95em;margin:0.2em;}\n.shadow .title{color:#999;}\n\n.toolbar {font-size:90%;}\n.selected .toolbar a {color:#999999;}\n.selected .toolbar a:hover {color:#333; background:transparent;border:1px solid #fff;}\n\n.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active{color:#333; background:transparent;border:1px solid #fff;}\n\n .noBorder,.noBorder td,.noBorder th,.noBorder tr{border:0 !important}\n\n/***\n!Sidebar\n***/\n#sidebar { margin-bottom:2em !important; margin-bottom:1em; right:0; font-size: 1.1em;\n}\n\n/***\n!SidebarOptions\n***/\n#sidebarOptions { padding-top:2em;background:#f3f3f3;padding-left:0.5em;}\n\n#sidebarOptions a {\n color:#333;\n background:#f3f3f3;\n border:1px solid #f3f3f3;\n text-decoration: none;\n}\n\n#sidebarOptions a:hover, #sidebarOptions a:active {\n color:#222;\n background-color:#fff;border:1px solid #fff;\n }\n\n#sidebarOptions input {border:1px solid #ccc; }\n\n#sidebarOptions .sliderPanel {\n background: #FFF; font-size: 1em;\n}\n\n#sidebarOptions .sliderPanel input {border:1px solid #999;}\n#sidebarOptions .sliderPanel .txtOptionInput {border:1px solid #999;width:9em;}\n\n#sidebarOptions .sliderPanel a {font-weight:normal; color:#555;background-color: #f3f3f3; border-bottom:1px dotted #333;}\n\n\n#sidebarOptions .sliderPanel a:hover {\ncolor:#111;\nbackground-color: #f3f3f3;\nborder:none;\nborder-bottom:1px dotted #111;\n}\n/***\n!SidebarTabs\n***/\n .listTitle {color:#222;}\n#sidebarTabs {background:#f3f3f3;}\n\n#sidebarTabs .tabContents {background:#cfcfcf;}\n\n#sidebarTabs .tabUnselected:hover {color:#999;}\n\n#sidebarTabs .tabSelected{background:#cfcfcf;}\n\n#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#666;}\n#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#222;background:transparent; text-decoration:none;border:none;}\n\n#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#222;background:transparent;}\n\n#sidebarTabs .txtMoreTab .tabSelected,\n#sidebarTabs .txtMoreTab .tab:hover,\n#sidebarTabs .txtMoreTab .tabContents{\n color: #111;\n background: #f3f3f3; border:1px solid #f3f3f3;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n color: #555;\n background: #AFAFAF;\n}\n\n\n\n/***\n!Tabs\n***/\n.tabSelected{color:#fefefe; background:#999; padding-bottom:1px;}\n .tabSelected, .tabSelected:hover {\n color: #111;\n background: #fefefe;\n border: solid 1px #cfcfcf;\n}\n\n .tabUnselected {\n color: #999;\n background: #eee;\n border: solid 1px #cfcfcf;\n padding-bottom:1px;\n}\n.tabUnselected:hover {text-decoration:none; border:1px solid #cfcfcf;}\n.tabContents {background:#fefefe;}\n\n\n\n\n\n.tagging, .tagged {\nborder: 1px solid #eee;\nbackground-color: #F7F7F7;\n}\n\n.selected .tagging, .selected .tagged {\nbackground-color: #f3f3f3;\nborder: 1px solid #ccc;\n}\n\n.tagging .listTitle, .tagged .listTitle {\ncolor: #bbb;\n}\n\n.selected .tagging .listTitle, .selected .tagged .listTitle {\ncolor: #333;\n}\n\n.tagging .button, .tagged .button {\ncolor:#ccc;\n}\n.selected .tagging .button, .selected .tagged .button {\ncolor:#aaa;\n}\n\n.highlight, .marked {background:transparent; color:#111; border:none; text-decoration:underline;}\n\n.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {\nborder: none; background:transparent; text-decoration:underline; color:#333;\n}\n\n\n\n.popup {\nbackground: #cfcfcf;\nborder: 1px solid #333;\n}\n\n.popup li.disabled {\ncolor: #000;\n}\n\n.popup li a, .popup li a:visited {\ncolor: #555;\nborder: none;\n}\n\n.popup li a:hover {\nbackground: #f3f3f3;\ncolor: #555;\nborder: none;\n}\n\n\n\n#messageArea {\n\nborder: 4px dotted #282826;\nbackground: #F3F3F3;\ncolor: #333;\nfont-size:90%;\n}\n\n#messageArea a:hover { background:#f5f5f5; border:none;}\n\n\n#messageArea .button{\ncolor: #333;\nborder: 1px solid #282826;\n}\n\n#messageArea .button:hover {\ncolor: #fff;\nbackground: #282826;\nborder-color: #282826;\n}\n\n\n\n\n\n\n.tiddler {padding-bottom:10px;}\n\n.viewer blockquote {\nborder-left: 5px solid #282826;\n}\n\n.viewer table, .viewer td {\nborder: 1px solid #282826;\n}\n\n.viewer th, thead td {\nbackground: #282826;\nborder: 1px solid #282826;\ncolor: #fff;\n}\n.viewer pre {\nborder: 1px solid #ccc;\nbackground: #f5f5f5;\n}\n\n.viewer code {\ncolor: #111; background:#f5f5f5;\n}\n\n.viewer hr {\nborder-top: dashed 1px #222; margin:0 1em;\n}\n\n.editor input {\nborder: 1px solid #ccc; margin-top:5px;\n}\n\n.editor textarea {\nborder: 1px solid #ccc;\n}\n\nh1,h2,h3,h4,h5 { color: #282826; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif; }\nh1 {font-size:18px;}\nh2 {font-size:16px;}\nh3 {font-size: 14px;}\n\n/*}}}*/
/*{{{*/\n@media print {\n#mainMenu, #sidebar, #messageArea, #breadCrumbs, #openTiddlers, #topMenu, #hoverMenu,\n#backstage, #backstageButton, .tagged,\n#backstageArea, .toolbar, .siteSubtitle, .siteTitle, .header, .subtitle\n{display: none ! important;}\n#displayArea {margin: 1em 1em 0em 1em;}\n/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the\nnoscript content */\nnoscript {display:none;}\n} \n\n/*}}}*/
/***\n|Name|StyleSheetShortcuts|\n|Source|http://www.TiddlyTools.com/#StyleSheetShortcuts|\n|Version||\n|Author|Eric Shulman - ELS Design Studios|\n|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|~CoreVersion|2.1|\n|Type|CSS|\n|Requires||\n|Overrides||\n|Description|CSS classes for common formatting, alignment, boxes, tables, etc.|\n\nThese 'style tweaks' can be easily included in other stylesheet tiddler so they can share a baseline look-and-feel that can then be customized to create a wide variety of 'flavors'.\n***/\n/*{{{*/\n\n/* text alignments */\n.left\n { display:block;text-align:left; }\n.center\n { display:block;text-align:center; }\n.right \n { display:block;text-align:right; }\n.justify\n { display:block;text-align:justify; }\n.indent\n { display:block;margin:0;padding:0;border:0;margin-left:2em; }\n.floatleft\n { float:left; }\n.floatright\n { float:right; }\n.clear\n { clear:both; }\n.wrap\n { white-space:normal; }\n.nowrap\n { white-space:nowrap; }\n.hidden\n { display:none; }\n.span\n { display:span; }\n.block\n { display:block; }\n.relative\n { position:relative; }\n.absolute\n { position:absolute; }\n\n/* font sizes */\n.big\n { font-size:14pt;line-height:120% }\n.medium\n { font-size:12pt;line-height:120% }\n.normal\n { font-size:9pt;line-height:120% }\n.small\n { font-size:8pt;line-height:120% }\n.fine\n { font-size:7pt;line-height:120% }\n.tiny\n { font-size:6pt;line-height:120% }\n.larger\n { font-size:120%; }\n.smaller\n { font-size:80%; }\n\n/* font styles */\n.bold\n { font-weight:bold; }\n.italic\n { font-style:italic; }\n.underline\n { text-decoration:underline; }\n\n/* multi-column tiddler content (not supported in Internet Explorer) */\n.twocolumns { display:block;\n -moz-column-count:2; -moz-column-gap:1em; -moz-column-width:50%; /* FireFox */\n -webkit-column-count:2; -webkit-column-gap:1em; -webkit-column-width:50%; /* Safari */\n column-count:2; column-gap:1em; column-width:50%; /* Opera */\n}\n.threecolumns { display:block;\n -moz-column-count:3; -moz-column-gap:1em; -moz-column-width:33%; /* FireFox */\n -webkit-column-count:3; -webkit-column-gap:1em; -webkit-column-width:33%; /* Safari */\n column-count:3; column-gap:1em; column-width:33%; /* Opera */\n}\n.fourcolumns { display:block;\n -moz-column-count:4; -moz-column-gap:1em; -moz-column-width:25%; /* FireFox */\n -webkit-column-count:4; -webkit-column-gap:1em; -webkit-column-width:25%; /* Safari */\n column-count:4; column-gap:1em; column-width:25%; /* Opera */\n}\n\n/* show/hide browser-specific content for InternetExplorer vs. non-IE ("moz") browsers */\n*[class="ieOnly"]\n { display:none; } /* hide in moz (uses CSS selector) */\n* html .mozOnly, *:first-child+html .mozOnly\n { display: none; } /* hide in IE (uses IE6/IE7 CSS hacks) */\n\n/* borderless tables */\n.borderless, .borderless table, .borderless td, .borderless tr, .borderless th, .borderless tbody\n { border:0 !important; margin:0 !important; padding:0 !important; }\n\n/* thumbnail images (fixed-sized scaled images) */\n.thumbnail img { height:5em !important; }\n\n/* stretchable images (auto-size to fit tiddler) */\n.stretch img { width:95%; }\n\n/* grouped content */\n.outline\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; }\n.menubox\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:#fff; color:#000; }\n.menubox .button, .menubox .tiddlyLinkExisting, .menubox .tiddlyLinkNonExisting\n { color:#009 !important; }\n.groupbox\n { display:block; padding:1em; -moz-border-radius:1em; border:1px solid; background:#ffe; color:#000; }\n.groupbox a, .groupbox .button, .groupbox .tiddlyLinkExisting, .groupbox .tiddlyLinkNonExisting\n { color:#009 !important; }\n.groupbox code\n { color:#333 !important; }\n.borderleft\n { margin:0;padding:0;border:0;margin-left:1em; border-left:1px dotted; padding-left:.5em; }\n.borderright\n { margin:0;padding:0;border:0;margin-right:1em; border-right:1px dotted; padding-right:.5em; }\n.borderbottom\n { margin:0;padding:1px 0;border:0;border-bottom:1px dotted; margin-bottom:1px; padding-bottom:1px; }\n.bordertop\n { margin:0;padding:0;border:0;border-top:1px dotted; margin-top:1px; padding-top:1px; }\n\n/* compact form */\n.smallform\n { white-space:nowrap; }\n.smallform input, .smallform textarea, .smallform button, .smallform checkbox, .smallform radio, .smallform select\n { font-size:8pt; }\n\n/* stretchable edit field (auto-size to fit tiddler) */\n.stretch input { width:95%; }\n\n/* colors */\n.green { color:#6f6 !important }\n.red { color:#f66 !important }\n.blue { color:#99f !important }\n\n/* rollover highlighting */\n.mouseover \n {color:[[ColorPalette::TertiaryLight]];}\n.mouseover a\n {color:[[ColorPalette::TertiaryLight]];}\n.selected .mouseover\n {color:[[ColorPalette::Foreground]];}\n.selected .mouseover .button, .selected .mouseover a\n {color:[[ColorPalette::PrimaryDark]];}\n\n/*}}}*/
/***\n| Name|TagglyTaggingPlugin|\n| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|\n| Version|3.1 ($Rev: 2351 $)|\n| Date|$Date: 2007-07-12 10:18:02 +1000 (Thu, 12 Jul 2007) $|\n| Source|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n!Notes\nSee http://mptw.tiddlyspot.com/#TagglyTagging\n***/\n//{{{\nconfig.taggly = {\n\n // for translations\n lingo: {\n labels: {\n asc: "\su2191", // down arrow\n desc: "\su2193", // up arrow\n title: "title",\n modified: "modified",\n created: "created",\n show: "+",\n hide: "-",\n normal: "normal",\n group: "group",\n commas: "commas",\n sitemap: "sitemap",\n numCols: "cols\su00b1", // plus minus sign\n label: "Tagged as '%0':",\n excerpts: "excerpts",\n contents: "contents",\n sliders: "sliders",\n noexcerpts: "title only"\n },\n\n tooltips: {\n title: "Click to sort by title",\n modified: "Click to sort by modified date",\n created: "Click to sort by created date",\n show: "Click to show tagging list",\n hide: "Click to hide tagging list",\n normal: "Click to show a normal ungrouped list",\n group: "Click to show list grouped by tag",\n sitemap: "Click to show a sitemap style list",\n commas: "Click to show a comma separated list",\n numCols: "Click to change number of columns",\n excerpts: "Click to show excerpts",\n contents: "Click to show entire tiddler contents",\n sliders: "Click to show tiddler contents in sliders",\n noexcerpts: "Click to show entire title only"\n }\n },\n\n config: {\n showTaggingCounts: true,\n listOpts: {\n // the first one will be the default\n sortBy: ["title","modified","created"],\n sortOrder: ["asc","desc"],\n hideState: ["show","hide"],\n listMode: ["normal","group","sitemap","commas"],\n numCols: ["1","2","3","4","5","6"],\n excerpts: ["noexcerpts","excerpts","contents","sliders"]\n },\n valuePrefix: "taggly.",\n excludeTags: ["excludeLists","excludeTagging"],\n excerptSize: 50,\n excerptMarker: "/%"+"%/"\n },\n\n getTagglyOpt: function(title,opt) {\n var val = store.getValue(title,this.config.valuePrefix+opt);\n return val ? val : this.config.listOpts[opt][0];\n },\n\n setTagglyOpt: function(title,opt,value) {\n if (!store.tiddlerExists(title))\n // create it silently\n store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);\n // if value is default then remove it to save space\n return store.setValue(title,\n this.config.valuePrefix+opt,\n value == this.config.listOpts[opt][0] ? null : value);\n },\n\n getNextValue: function(title,opt) {\n var current = this.getTagglyOpt(title,opt);\n var pos = this.config.listOpts[opt].indexOf(current);\n // a little usability enhancement. actually it doesn't work right for grouped or sitemap\n var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);\n var newPos = (pos + 1) % limit;\n return this.config.listOpts[opt][newPos];\n },\n\n toggleTagglyOpt: function(title,opt) {\n var newVal = this.getNextValue(title,opt);\n this.setTagglyOpt(title,opt,newVal);\n }, \n\n createListControl: function(place,title,type) {\n var lingo = config.taggly.lingo;\n var label;\n var tooltip;\n var onclick;\n\n if ((type == "title" || type == "modified" || type == "created")) {\n // "special" controls. a little tricky. derived from sortOrder and sortBy\n label = lingo.labels[type];\n tooltip = lingo.tooltips[type];\n\n if (this.getTagglyOpt(title,"sortBy") == type) {\n label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,"sortOrder");\n return false;\n }\n }\n else {\n onclick = function() {\n config.taggly.setTagglyOpt(title,"sortBy",type);\n config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);\n return false;\n }\n }\n }\n else {\n // "regular" controls, nice and simple\n label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];\n tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];\n onclick = function() {\n config.taggly.toggleTagglyOpt(title,type);\n return false;\n }\n }\n\n // hide button because commas don't have columns\n if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))\n createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");\n },\n\n makeColumns: function(orig,numCols) {\n var listSize = orig.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize = colSize;\n var lowerColsize = colSize;\n\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n upperColsize = Math.floor(colSize) + 1;\n lowerColsize = Math.floor(colSize);\n }\n\n var output = [];\n var c = 0;\n for (var j=0;j<numCols;j++) {\n var singleCol = [];\n var thisSize = j < remainder ? upperColsize : lowerColsize;\n for (var i=0;i<thisSize;i++) \n singleCol.push(orig[c++]);\n output.push(singleCol);\n }\n\n return output;\n },\n\n drawTable: function(place,columns,theClass) {\n var newTable = createTiddlyElement(place,"table",null,theClass);\n var newTbody = createTiddlyElement(newTable,"tbody");\n var newTr = createTiddlyElement(newTbody,"tr");\n for (var j=0;j<columns.length;j++) {\n var colOutput = "";\n for (var i=0;i<columns[j].length;i++) \n colOutput += columns[j][i];\n var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class\n wikify(colOutput,newTd);\n }\n return newTable;\n },\n\n createTagglyList: function(place,title) {\n switch(this.getTagglyOpt(title,"listMode")) {\n case "group": return this.createTagglyListGrouped(place,title); break;\n case "normal": return this.createTagglyListNormal(place,title,false); break;\n case "commas": return this.createTagglyListNormal(place,title,true); break;\n case "sitemap":return this.createTagglyListSiteMap(place,title); break;\n }\n },\n\n getTaggingCount: function(title) {\n // thanks to Doug Edmunds\n if (this.config.showTaggingCounts) {\n var tagCount = store.getTaggedTiddlers(title).length;\n if (tagCount > 0)\n return " ("+tagCount+")";\n }\n return "";\n },\n\n getExcerpt: function(inTiddlerTitle,title,indent) {\n if (!indent)\n indent = 1;\n if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "excerpts") {\n var t = store.getTiddler(title);\n if (t) {\n var text = t.text.replace(/\sn/," ");\n var marker = text.indexOf(this.config.excerptMarker);\n if (marker != -1) {\n return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";\n }\n else if (text.length < this.config.excerptSize) {\n return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";\n }\n else {\n return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";\n }\n }\n }\n else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "contents") {\n var t = store.getTiddler(title);\n if (t) {\n return "\sn{{contents indent"+indent+"{\sn" + t.text + "\sn}}}";\n }\n }\n else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "sliders") {\n var t = store.getTiddler(title);\n if (t) {\n return "<slider slide>\sn{{contents{\sn" + t.text + "\sn}}}\sn</slider>";\n }\n }\n return "";\n },\n\n notHidden: function(t,inTiddler) {\n if (typeof t == "string") \n t = store.getTiddler(t);\n return (!t || !t.tags.containsAny(this.config.excludeTags) ||\n (inTiddler && this.config.excludeTags.contains(inTiddler)));\n },\n\n // this is for normal and commas mode\n createTagglyListNormal: function(place,title,useCommas) {\n\n var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));\n\n if (this.getTagglyOpt(title,"sortOrder") == "desc")\n list = list.reverse();\n\n var output = [];\n var first = true;\n for (var i=0;i<list.length;i++) {\n if (this.notHidden(list[i],title)) {\n var countString = this.getTaggingCount(list[i].title);\n var excerpt = this.getExcerpt(title,list[i].title);\n if (useCommas)\n output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);\n else\n output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\sn");\n\n first = false;\n }\n }\n\n return this.drawTable(place,\n this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),\n useCommas ? "commas" : "normal");\n },\n\n // this is for the "grouped" mode\n createTagglyListGrouped: function(place,title) {\n var sortBy = this.getTagglyOpt(title,"sortBy");\n var sortOrder = this.getTagglyOpt(title,"sortOrder");\n\n var list = store.getTaggedTiddlers(title,sortBy);\n\n if (sortOrder == "desc")\n list = list.reverse();\n\n var leftOvers = []\n for (var i=0;i<list.length;i++)\n leftOvers.push(list[i].title);\n\n var allTagsHolder = {};\n for (var i=0;i<list.length;i++) {\n for (var j=0;j<list[i].tags.length;j++) {\n\n if (list[i].tags[j] != title) { // not this tiddler\n\n if (this.notHidden(list[i].tags[j],title)) {\n\n if (!allTagsHolder[list[i].tags[j]])\n allTagsHolder[list[i].tags[j]] = "";\n\n if (this.notHidden(list[i],title)) {\n allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"\n + this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\sn";\n\n leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers\n\n }\n }\n }\n }\n }\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n var sortHelper = function(a,b) {\n if (a == b) return 0;\n if (a < b) return -1;\n return 1;\n };\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var leftOverOutput = "";\n for (var i=0;i<leftOvers.length;i++)\n if (this.notHidden(leftOvers[i],title))\n leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\sn";\n\n var output = [];\n\n if (sortOrder == "desc")\n allTags.reverse();\n else if (leftOverOutput != "")\n // leftovers first...\n output.push(leftOverOutput);\n\n for (var i=0;i<allTags.length;i++)\n if (allTagsHolder[allTags[i]] != "")\n output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\sn" + allTagsHolder[allTags[i]]);\n\n if (sortOrder == "desc" && leftOverOutput != "")\n // leftovers last...\n output.push(leftOverOutput);\n\n return this.drawTable(place,\n this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),\n "grouped");\n\n },\n\n // used to build site map\n treeTraverse: function(title,depth,sortBy,sortOrder) {\n\n var list = store.getTaggedTiddlers(title,sortBy);\n if (sortOrder == "desc")\n list.reverse();\n\n var indent = "";\n for (var j=0;j<depth;j++)\n indent += "*"\n\n var childOutput = "";\n for (var i=0;i<list.length;i++)\n if (list[i].title != title)\n if (this.notHidden(list[i].title,this.config.inTiddler))\n childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);\n\n if (depth == 0)\n return childOutput;\n else\n return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\sn" + childOutput;\n },\n\n // this if for the site map mode\n createTagglyListSiteMap: function(place,title) {\n this.config.inTiddler = title; // nasty. should pass it in to traverse probably\n var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));\n return this.drawTable(place,\n this.makeColumns(output.split(/(?=^\s*\s[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic\n "sitemap"\n );\n },\n\n macros: {\n tagglyTagging: {\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n var refreshContainer = createTiddlyElement(place,"div");\n // do some refresh magic to make it keep the list fresh - thanks Saq\n refreshContainer.setAttribute("refresh","macro");\n refreshContainer.setAttribute("macroName",macroName);\n refreshContainer.setAttribute("title",tiddler.title);\n this.refresh(refreshContainer);\n },\n\n refresh: function(place) {\n var title = place.getAttribute("title");\n removeChildren(place);\n if (store.getTaggedTiddlers(title).length > 0) {\n var lingo = config.taggly.lingo;\n config.taggly.createListControl(place,title,"hideState");\n if (config.taggly.getTagglyOpt(title,"hideState") == "show") {\n createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));\n config.taggly.createListControl(place,title,"title");\n config.taggly.createListControl(place,title,"modified");\n config.taggly.createListControl(place,title,"created");\n config.taggly.createListControl(place,title,"listMode");\n config.taggly.createListControl(place,title,"excerpts");\n config.taggly.createListControl(place,title,"numCols");\n config.taggly.createTagglyList(place,title);\n }\n }\n }\n }\n },\n\n // todo fix these up a bit\n styles: [\n"/*{{{*/",\n"/* created by TagglyTaggingPlugin */",\n".tagglyTagging { padding-top:0.5em; }",\n".tagglyTagging li.listTitle { display:none; }",\n".tagglyTagging ul {",\n" margin-top:0px; padding-top:0.5em; padding-left:2em;",\n" margin-bottom:0px; padding-bottom:0px;",\n"}",\n".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",\n".tagglyTagging table { margin:0px; padding:0px; }",\n".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",\n".tagglyTagging .button, .tagglyTagging .hidebutton {",\n" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",\n" border:0px; padding-left:0.3em;padding-right:0.3em;",\n"}",\n".tagglyTagging .button:hover, .hidebutton:hover, ",\n".tagglyTagging .button:active, .hidebutton:active {",\n" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",\n"}",\n".selected .tagglyTagging .button { visibility:visible; }",\n".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",\n".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",\n".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",\n".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",\n".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",\n".tagglyTagging ul ul li {margin-left:0.5em; }",\n".editLabel { font-size:90%; padding-top:0.5em; }",\n".tagglyTagging .commas { padding-left:1.8em; }",\n"/* not technically tagglytagging but will put them here anyway */",\n".tagglyTagged li.listTitle { display:none; }",\n".tagglyTagged li { display: inline; font-size:90%; }",\n".tagglyTagged ul { margin:0px; padding:0px; }",\n".excerpt { color:[[ColorPalette::TertiaryDark]]; }",\n"div.tagglyTagging table,",\n"div.tagglyTagging table tr,",\n"td.tagglyTagging",\n" {border-style:none!important; }",\n".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",\n" margin-bottom:0.5em; }",\n".tagglyTagging .indent1 { margin-left:3em; }",\n".tagglyTagging .indent2 { margin-left:4em; }",\n".tagglyTagging .indent3 { margin-left:5em; }",\n".tagglyTagging .indent4 { margin-left:6em; }",\n".tagglyTagging .indent5 { margin-left:7em; }",\n".tagglyTagging .indent6 { margin-left:8em; }",\n".tagglyTagging .indent7 { margin-left:9em; }",\n".tagglyTagging .indent8 { margin-left:10em; }",\n".tagglyTagging .indent9 { margin-left:11em; }",\n".tagglyTagging .indent10 { margin-left:12em; }",\n"/*}}}*/",\n ""].join("\sn"),\n\n init: function() {\n merge(config.macros,this.macros);\n config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;\n store.addNotification("TagglyTaggingStyles",refreshStyles);\n }\n};\n\nconfig.taggly.init();\n\n//}}}\n\n/***\nInlineSlidersPlugin\nBy Saq Imtiaz\nhttp://tw.lewcid.org/sandbox/#InlineSlidersPlugin\n\n// syntax adjusted to not clash with NestedSlidersPlugin\n\n***/\n//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n // match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n match: "\s\s<slider",\n // lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) (.*?)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n lookaheadRegExp: /(?:<slider) (.*?)(?:>)\sn((?:.|\sn)*?)\sn(?:<\s/slider>)/mg,\n handler: function(w) {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {\n var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\su00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = "none";\n wikify(lookaheadMatch[2],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e) {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n});\n\n//}}}\n\n
/***\n|Name|TiddlerDisplayTopPlugin|\n|Location|http://www.orst.edu/~woodswa/tiddlywikiplugs.html|\n|Version|1.0|\n|Author:|Walt Woods|\n|Requirements:|Should NOT be used in tandem with SinglePageModePlugin.|\n\n!Description\nKeeps the tiddlers display looking fresh by opening new tiddlers at the top of the page. This keeps toolbars and menus accessible at all times, while allowing for multiple tiddlers to be open.\n\n!History\n08-06-2007: Initial version. \n\n!Code\n***/\n//{{{\nversion.extensions.TiddlerDisplayTopPlugin = {major: 1, minor: 0, revision: 0};\n\nStory.prototype.displayTiddlerTiddlerDisplayTop = Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n if (story.hasChanges(title))\n {\n this.displayTiddlerTiddlerDisplayTop(srcElement,title,template,animate,slowly);\n }\n else\n {\n story.closeTiddler(title);\n this.displayTiddlerTiddlerDisplayTop(null,title,template,animate,slowly)\n var tiddlerElem = document.getElementById(this.idPrefix + title);\n if (animate)\n anim.startAnimating(new Zoomer(title,srcElement,tiddlerElem),new Scroller("top"));\n }\n}\n//}}}
<<tiddlerTweaker>>
/***\n| Name|ToggleTagPlugin|\n| Description|Makes a checkbox which toggles a tag in a tiddler|\n| Version|3.0 ($Rev: 1845 $)|\n| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|\n| Source|http://tiddlyspot.com/mptw/#ToggleTagMacro|\n| Author|Simon Baird <simon.baird@gmail.com>|\n| License|http://mptw.tiddlyspot.com/#TheBSDLicense|\n!Usage\n{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}\n* TagName - the tag to be toggled, default value "checked"\n* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler\n* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'\n(If a parameter is '.' then the default will be used)\n\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|\n|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|\nNotes:\n* If TiddlerName doesn't exist it will be silently created\n* Set label to '-' to specify no label\n* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing\n\n***/\n//{{{\n\nmerge(config.macros,{\n\n toggleTag: {\n\n doRefreshAll: true,\n createIfRequired: true,\n shortLabel: "[[%0]]",\n longLabel: "[[%0]] [[%1]]",\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);\n var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;\n label = (label == '-' ? '' : label);\n var theTiddler = title == tiddler.title ? tiddler : store.getTiddler(title);\n var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {\n if (!store.tiddlerExists(title)) {\n if (config.macros.toggleTag.createIfRequired) {\n var content = store.getTiddlerText(title); // just in case it's a shadow\n store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);\n }\n else \n return false;\n }\n store.setTiddlerTag(title,this.checked,tag);\n return true;\n });\n }\n }\n});\n\n//}}}\n\n
These terms are [[preferred]], but do ''not'' have a BT value.\n<script>\nvar tids=store.reverseLookup("tags","preferred",true,"title");\nvar count = 0;\n\nfor (i=0;i<=tids.length-1;i++)\n{\n var broader=store.getValue(tids[i],"broader");\n if (!broader)\n {\n count++;\n }\n}\nwikify("<br/>Total found: "+count+"<br/><br/>",place);\n\nfor (i=0;i<=tids.length-1;i++)\n{\n var broader=store.getValue(tids[i],"broader");\n if (!broader)\n {\n var text="[["+tids[i].title + "]]<br/>";\n wikify(text,place);\n }\n}\n\n</script>
<!--{{{-->\n<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler permalink jump deleteTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>\n<div class='tagging' macro='tagging'></div>\n<!--<div class='tagged' macro='tags'></div> -->\n<div class='viewer' macro='view text wikified'></div><br/>\n<span macro="notation"></span>\n<span macro="listr"></span>\n<div class='tagClear'></div>\n<!--}}}-->
The assignment [[instructions|Thesaurus-project.pdf]] are here.\n\nHere's a [[cheatsheet|http://www.nothickmanuals.info/lib/exe/fetch.php/cheatsheets:tiddlywiki_cheatsheet.pdf?id=cheatsheets&cache=cache]] PDF on exciting ~TiddlyWiki commands and things.\n\nAnd this is a [[link|537 Terms Sorted.xls]] to the original Excel file the Tiddlywiki was created from...\n\nWork in progress code:\n[[notationMacro]] [[listrMacro]]\n[[EditTemplate]] [[ViewTemplate]] [[StyleSheetPrint]] [[SideBarOptions]] [[OptionsPanel]] [[AdvancedOptions]] [[SideBarTabs]] [[DefaultTiddlers]] [[StyleSheet]] [[MainMenu]]\n[[Broken Links]] [[changesMacro]] [[BackstageTabPlugin]]\n[[Alphabetical Schedule]] [[Classified Schedule]] [[Generate Notation]]\n
Adaptive optics is a technology to improve the performance of optical systems by reducing the effects of rapidly changing optical distortion. It is commonly used on astronomical telescopes to remove the effects of atmospheric distortion, or astronomical seeing. The simplest form of adaptive optics is tip-tilt correction.
A human-created satellite that orbits a planet or other body larger than itself.
A solid objecting orbiting the Sun that is smaller than a planet.
Refers to the blurring and twinkling of astronomical objects such as stars caused by turbulence in the Earth's atmosphere.
A unit of length approximately equal to the distance from the Earth to the Sun.
A ring that appears to be around an object caused by the reflection of light off water droplet sin the atmosphere.
Charged solar particles that follow the magnetic lines of the Earth, appearing as colorful bands and waves.
A technique for viewing faint objects which involves not looking directly at the object, but looking a little off to the side, while continuing to concentrate on the object.
Angular measure around the horizon or parallel to it in the sky.
A galaxy type that consists of spiral arms separated from the galactic disk by bars.
The north and south celestial poles are the two imaginary points in the sky where the Earth's axis of rotation, infinitely extended, intersects the imaginary rotating sphere of stars called the celestial sphere.
version.extensions.changesMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,24)};\n//Author: Michael Adcock\nconfig.macros.changes = {}\nconfig.macros.changes.handler = function(place,macroName,params)\n{\n var alltids=store.reverseLookup("tags","proper_names",false,"title");\n var excludeLists=false;\n var tags;\n var list;\n var text="";\n var count=0;\n\n for (i=0;i<=alltids.length-1;i++)\n {\n title=alltids[i].title;\n excludeLists=false;\n tags=store.getValue(store.getTiddler(title),"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (l=0;l<=list.length-1;l++)\n {\n if (list[l] == "excludeLists")\n {\n excludeLists= true;\n }\n }\n }\n if (!excludeLists)\n {\n count++;\n }\n }\n wikify("Total terms found: "+count+"<br/>",place);\n\n var preferredtids=store.reverseLookup("tags","preferred",true,"title");\n wikify("<br/>Total preferred terms found: "+preferredtids.length+"<br/>",place);\n wikify("<br/>Total lead-in terms found: "+(count-preferredtids.length)+"<br/><br/>",place);\n\n var tids=store.getTiddlers("modified");\n var countlimit=99;\n var cols=3;\n var j=0;\n\n text="|!Date|!Author|!Tiddler Modified| |!Date|!Author|!Tiddler Modified| |!Date|!Author|!Tiddler Modified|\sn";\n\n for (i=tids.length-1;i>=0;i-- )\n {\n if (countlimit>0)\n {\n text = text + "|" + tids[i].modified.formatString('MM-DD-YY 0hh:0mm');\n text = text + "|" + tids[i].modifier;\n text = text + "|[[" + tids[i].title + "]]|";\n countlimit--;\n j++;\n if (j < cols)\n {\n text=text+" ";\n }\n else\n {\n text=text+"\sn"\n j=0;\n }\n }\n }\n wikify(text,place);\n}
Third layer of the Sun's structured, between the photosphere and the corona.
A star that never rises or sets from the perspective of a given latitude on Earth.
Collection of water droplets and ice crystals held in Earth's atmosphere.
The envelope of ice and dust that forms around a comet when the comet passes near the Sun.
A stream formed off of a comet, created by the forces of the Sun pushing cometary ice and dust away from itself.
One of the two coordinates of the equatorial coordinate system, the other being either right ascension or hour angle.
Type the text for 'direct viewing'
Occurs when one celestial object moves into the shadow of another.
The angle between the Sun and a planet, as viewed from Earth.
Type the text for 'excludeMissing'
An angular area viewed by the instrument, in square degrees.
Type the text for 'film'
A small auxiliary telescope mounted atop the main astronomical telescope and pointed in the same direction.
For a thin lens in air, the focal length is the distance from the center of the lens to the principal foci (or focal points) of the lens.
The focal length of an objective divided by its diameter.
One of the coordinates used in the equatorial coordinate system for describing the position of a point on the celestial sphere.
version.extensions.listrMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,13)};\n//Author: Michael Adcock\nconfig.macros.listr = {}\nconfig.macros.listr.handler = function(place,macroName,params)\n{\n var here=story.findContainingTiddler(place); if (!here) return;\n\n var start=here.getAttribute("tiddler");\n var list;\n var templist;\n var text = "|noBorder|k\sn"; \n var isNode=false;\n var tags=store.getValue(start,"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n\n if (!isNode)\n {\n var sn=store.getValue(start,"scopenote");\n if (sn)\n {\n text = text+"| SN|"+sn+"|\sn"; \n text = text+"| | |\sn"; \n }\n\n var u=store.getValue(start,"use");\n if (!u) u="";\n list=u.readBracketedList();\n list.sort(thesaurus_sort); // alphanumeric sort by title \n if (list.length > 0)\n {\n var text = text+"| USE|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n text = text+"| | |\sn"; \n }\n\n var uf=store.getValue(start,"usefor");\n if (!uf) uf="";\n list=uf.readBracketedList();\n list.sort(thesaurus_sort); // alphanumeric sort by title \n if (list.length > 0)\n {\n var text = text+"| USED FOR|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n text = text+"| | |\sn"; \n }\n\n var b=store.getValue(start,"broader");\n if (!b) b="";\n templist=b.readBracketedList();\n list= new Array();\n if (templist.length > 0)\n {\n for (i=0;i<=templist.length-1;i++)\n {\n isNode=false;\n var tags=store.getValue(store.getTiddler(templist[i]),"tags");\n if (!tags) tags="";\n var listtags=tags.split(" ");\n if (listtags.length > 0)\n {\n for (j=0;j<=listtags.length-1;j++)\n {\n if (listtags[j] == "nodelabel") isNode= true;\n }\n if (isNode)\n {\n var broaderlist=store.getValue(store.getTiddler(templist[i]),"broader");\n if (!broaderlist) broaderlist="";\n list = list.concat(broaderlist.readBracketedList());\n }\n else\n {\n list.push(templist[i]);\n }\n }\n }\n if (list.length > 0)\n {\n list.sort(thesaurus_sort); // alphanumeric sort by title \n var text = text+"| BT|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n text = text+"| | |\sn"; \n }\n }\n\n var n=store.getValue(start,"narrower");\n if (!n) n="";\n templist=n.readBracketedList();\n list= new Array();\n if (templist.length > 0)\n {\n for (i=0;i<=templist.length-1;i++)\n {\n isNode=false;\n var tags=store.getValue(store.getTiddler(templist[i]),"tags");\n if (!tags) tags="";\n var listtags=tags.split(" ");\n if (listtags.length > 0)\n {\n for (j=0;j<=listtags.length-1;j++)\n {\n if (listtags[j] == "nodelabel") isNode= true;\n }\n if (isNode)\n {\n var narrowerlist=store.getValue(store.getTiddler(templist[i]),"narrower");\n if (!narrowerlist) narrowerlist="";\n list = list.concat(narrowerlist.readBracketedList());\n }\n else\n {\n list.push(templist[i]);\n }\n }\n }\n if (list.length > 0)\n {\n list.sort(thesaurus_sort); // alphanumeric sort by title \n var text = text+"| NT|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n text = text+"| | |\sn"; \n }\n }\n \n var r=store.getValue(start,"relatedto");\n if (!r) r="";\n list=r.readBracketedList();\n list.sort(thesaurus_sort); // alphanumeric sort by title \n if (list.length > 0)\n {\n var text = text+"| RT|[["+list.join("]] |\sn| |[[")+"]] |\sn";\n text = text+"| | |\sn"; \n }\n\n wikify(text,place);\n }\n}\n
The amount of energy a body radiates per unit of time.
version.extensions.notationMacro = {major: 0, minor: 1, revision: 0, date: new Date(2007,11,14)};\n//Author: Michael Adcock\nconfig.macros.notation = {}\nconfig.macros.notation.handler = function(place,macroName,params)\n{\n var here=story.findContainingTiddler(place); if (!here) return;\n var start=here.getAttribute("tiddler");\n var notation=store.getValue(start,"notation");\n var oldtitle=store.getValue(start,"title");\n var isNode=false;\n var text="";\n tags=store.getValue(start,"tags");\n if (!tags) tags="";\n list=tags.split(" ");\n if (list.length > 0)\n {\n for (q=0;q<=list.length-1;q++)\n {\n if (list[q] == "nodelabel")\n {\n isNode= true;\n }\n }\n }\n if (notation)\n {\n var nodes=here.getElementsByTagName("*");\n for (var i=0; i<nodes.length; i++)\n if (hasClass(nodes[i],"title"))\n { \n if (isNode)\n {\n text="<" + oldtitle + "> {{{("+notation+")}}}";\n }\n else\n {\n text=oldtitle + " {{{("+notation+")}}}";;\n }\n removeChildren(nodes[i]); wikify(text,nodes[i]); break;\n }\n }\n}
The umbra (Latin: "shadow") is the darkest part of a shadow. This contrasts with the penumbra, where the light source is only partially blocked and there is only a partial shadow.
Groups of particles and dust that form a ring around a planet.
Quadrature occurs when two celestial bodies appear 90° apart from one another as viewed from a third celestial body.
The apparent origin point of meteors in a meteor shower.
One of the two coordinates of a point on the celestial sphere when using the equatorial coordinate system.
An object that orbits a planet or other body larger than itself.
The period of the Moon's orbit as defined with respect to the celestial sphere; it is the time it takes the Moon to return to a given position among the stars.
The average period of the Moon's revolution with respect to the sun.
Type the text for 'systemConfig'
A celestial body is at the transit when it is highest in the sky. At that moment, the body goes through the celestial meridian, which runs from the northern celestial pole via the zenith to the southern celestial pole.
A term used to rate the clarity of the sky. A night is said to be transparent if there is an absence of clouds, haze, fog, and mist.
The umbra (Latin: "shadow") is the darkest part of a shadow. This contrasts with the penumbra, where the light source is only partially blocked and there is only a partial shadow.\n
Type the text for 'umbral eclipses'
The direction pointing directly above a particular location.