Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
/%\n!info\n|Name|PaletteMaker|\n|Source|http://www.TiddlyTools.com/#PaletteMaker|\n|Version|1.2.2|\n|Author|Eric Shulman|\n|License|http://www.TiddlyTools.com/#LegalStatements|\n|Type|transclusion|\n|Description|edit/create ColorPalette using interactive grid/list|\nUsage\n<<<\n{{{\n<<tiddler PaletteMaker with: PaletteName GridName noList noGrid allowOther>>\n}}}\n*''~PaletteName'' (default=ColorPalette)<br>specifies a tiddler containing {{{name:value}}} slices that assign names to color values\n*''~GridName'' (default=[[216-color 'web safe' grid|http://en.wikipedia.org/wiki/Web_colors#Web-safe_colors]])<br>specifies a tiddler (or section) that defines a table, where each table cell contains one of:\n**a 3-digit #RGB or 6-digit #RRGGBB color value\n**an [[X11 Color Name|http://en.wikipedia.org/wiki/X11_color_names]]\n**another valid CSS attribute value (see ''allowOther'', below)\n*''noList'' //or// ''noGrid''<br>omits the palette listbox or color grid to provide a more compact layout\n*''allowOther''<br>permit non-color CSS attribute values to be entered/selected, e.g., {{{url('images/somefile.jpg')}}}\n<<<\nNotes:\n<<<\n*{{block{\nYou can use "-" as placeholders for the default values of ''~PaletteName'' and/or ''~GridName'':\n{{{\n<<tiddler PaletteMaker with: - - nogrid>>\n}}}\n}}}\n*{{block{\nThe grid/list are rendered with 'float:left' styles so content that follows will be rendered next to them. To show your content below the grid/list display, embed an //empty// 'tagClear' CSS wrapper after the PaletteMaker:\n{{{\n<<tiddler PaletteMaker ...>>{{tagClear{\n}}} \n}}}\nYou can also customize the default styles contained in [[PaletteMakerStyles]]:\n<<tiddler PaletteMaker##showcode with: styles>>\n}}}\n*The default color grid definition is:<br><<tiddler PaletteMaker##showcode with: colorgrid>>\n<<<\nExamples\n<<<\nEdit ColorPalette (allow non-color values to be entered):\n{{{<<tiddler PaletteMaker with: - - allowOther>>}}}\n<<tiddler PaletteMaker##show with: - - allowOther>>{{tagClear{\n}}}\nCreate/edit NewPalette using a 16-color 'rainbow' and/or shades of gray (no list):\n{{{<<tiddler PaletteMaker with: NewPalette PaletteMaker##grayscale noList>>}}}\n<<tiddler PaletteMaker##show with: NewPalette PaletteMaker##grayscale noList>>\n{{{<<tiddler PaletteMaker with: NewPalette PaletteMaker##rainbow noList>>}}}\n<<tiddler PaletteMaker##show with: NewPalette PaletteMaker##rainbow noList>>\n<<<\n!showcode\n<<tiddler PaletteMaker##out with: {{store.getTiddlerText('PaletteMaker##$1')}}>>\n!out\n{{{\n$1\n}}}\n!end\n\n!colorgrid\n|white || | | | | | |FC0|F90|F60|F30| | | | | | ||FFF|\n|black ||9C0| | | | |C90|FC3|FC6|F96|F63|C30| | | | |C03||EEE|\n|red ||CF0|CF3|330|660|990|CC0|FF0|C93|C63|300|600|900|C00|F00|F36|F03||DDD|\n|orange ||9F0|CF6|9C3|663|993|CC3|FF3|960|930|633|933|C33|F33|C36|F69|F06||CCC|\n|yellow ||6F0|9F6|6C3|690|996|CC6|FF6|963|630|966|C66|F66|903|C39|F6C|F09||BBB|\n|green ||3F0|6F3|390|6C0|9F3|CC9|FF9|C96|C60|C99|F99|F39|C06|906|F3C|F0C||AAA|\n|blue ||0C0|3C0|360|693|9C6|CF9|FFC|FC9|F93|FCC|F9C|C69|936|603|C09|303||999|\n|darkmagenta ||3C3|6C6|0F0|3F3|6F6|9F9|CFC| | | |C9C|969|939|909|636|606||888|\n|violet ||060|363|090|393|696|9C9| | | |FCF|F9F|F6F|F3F|F0F|C6C|C3C||777|\n|darkred ||030|0C3|063|396|6C9|9FC|CFF|39F|9CF|CCF|C9F|96C|639|306|90C|C0C||666|\n|darkorange ||0F3|3F6|093|0C6|3F9|9FF|9CC|06C|69C|99F|99C|93F|60C|609|C3F|C0F||555|\n|gold ||0F6|6F9|3C6|096|6FF|6CC|699|036|369|66F|66C|669|309|93C|C6F|90F||444|\n|darkgreen ||0F9|6FC|3C9|3FF|3CC|399|366|069|039|33F|33C|339|336|63C|96F|60F||333|\n|darkblue ||0FC|3FC|0FF|0CC|099|066|033|39C|36C|00F|00C|009|006|003|63F|30F||222|\n|indigo ||0C9| | | | |09C|3CF|6CF|69F|36F|03C| | | | |30C||111|\n|darkviolet || | | | | | |0CF|09F|06F|03F| | | | | | ||000|\n!grayscale\n|FFF|EEE|DDD|CCC|BBB|AAA|999|888|777|666|555|444|333|222|111|000|\n!rainbow\n|black|white|red|orange|yellow|green|blue|darkmagenta|violet|darkred|darkorange|gold|darkgreen|darkblue|indigo|darkviolet|\n!end\n\n!styles\n/*{{{*/\n.colorgrid table\n { float:left; margin:0 !important; border:0 !important; }\n.colorgrid table, .colorgrid tr, .colorgrid th, .colorgrid tbody\n { color:black; border:0 !important; }\n.colorgrid td\n { height:16px; width:16px; text-align:center; padding:0; line-height:100%; }\n.colorgrid select\n { float:left; margin-left:16px; font-size:80%; height:255px; }\n/*}}}*/\n!end\n\n!code\n<<tiddler {{\nconfig.shadowTiddlers.PaletteMakerStyles=store.getTiddlerText('PaletteMaker##styles');\nsetStylesheet(store.getTiddlerText('PaletteMakerStyles'),'paletteMakerStyles');\nwindow.paletteMaker = {\n getColor: function(t){ if (!t||!t.length) return null;\n var s=document.createElement('span').style;\n try { s.color='#'+t; if (s.color.length) return '#'+t; }\n catch(e) { try{ s.color=t; } catch(e){ return null; } return t; } // IE \n s.color=t; return s.color.length?t:null; // FF\n },\n getTextColor: function(t){ \n t=this.getColor(t);\n if (!t||!t.length||!t.startsWith('#')) return 'black'; // BAD COLOR or X11 COLOR NAME\n var rgb=t.substr(1).split(''); var long=t.length>=6;\n function h2d(h){return '0123456789ABCDEF'.indexOf(h?h.toUpperCase():'');};\n var r=h2d(rgb[0]); var g=h2d(rgb[long?2:1]); var b=h2d(rgb[long?4:2]);\n if (r<0||g<0||b<0||r+g+b>=15) return 'black'; // BAD RGB or BRIGHT COLOR\n return 'white'; // DARK COLOR\n },\n getPalette: function(palette) {\n var pal={};\n var slices=store.calcAllSlices(palette);\n for (var s in slices) {\n var color=slices[s].toUpperCase().replace(/#/,'');\n if (!pal[color]) pal[color]=new Array();\n pal[color].push(s);\n }\n return pal;\n },\n drawGrid: function(place,grid,palette,opts) {\n var pm=window.paletteMaker; // abbrev\n removeChildren(place);\n if (!opts.contains('NOGRID')) wikify(store.getTiddlerText(grid,''),place);\n if (!opts.contains('NOLIST')) var s=pm.drawList(place,\n { palette:palette,min:0,max:0,edit:true,callback:pm.callback,place:place,opts:opts });\n var pal=pm.getPalette(palette);\n var cells=place.getElementsByTagName('td');\n for (var i=0; i<cells.length; i++) { var td=cells[i];\n td.style.border=0;\n var txt=getPlainText(td).trim(); if (!txt.length) continue;\n var c=pm.getColor(txt); if (!c && !opts.contains('ALLOWOTHER')) continue;\n if (c) { td.style.backgroundColor=c; td.innerHTML=''; td.style.fontSize='70%'; }\n td.title=c||txt;\n td.style.cursor=c?'crosshair':'pointer';\n td.params={ palette:palette, min:0, max:15, edit:true, callback:pm.callback,\n place:place, grid:grid, opts:opts, pick:c||txt };\n if (pal[txt.toUpperCase()]) {\n td.params.names=pal[txt.toUpperCase()];\n td.title+='='+td.params.names.join(', ');\n if (c) { td.style.color=pm.getTextColor(c); td.innerHTML='√'; }\n }\n td.onclick=function(ev) { ev=ev||window.event;\n var p=Popup.create(this); if(!p)return false;\n p.className+=' sticky smallform';\n var s=window.paletteMaker.drawList(p,this.params);\n s.style.fontSize='80%'; Popup.show(); s.focus();\n ev.cancelBubble=true; if(ev.stopPropagation)ev.stopPropagation();\n return false;\n };\n }\n },\n drawList: function(here,p) {\n var pm=window.paletteMaker; // abbrev\n var s=createTiddlyElement(here,'select');\n s.params=p;\n s.options[s.length]=new Option(p.palette+':','_view');\n s.options[s.length-1].title='open '+p.palette;\n if (p.edit && p.pick!==undefined) {\n var c=pm.getColor(p.pick);\n s.options[s.length]=new Option('+Add this color...','_add');\n if (c) s.options[s.length-1].style.backgroundColor=c;\n if (c) s.options[s.length-1].style.color=pm.getTextColor(c);\n s.options[s.length-1].title=p.pick;\n }\n var colors=store.calcAllSlices(p.palette);\n for (var x in colors) {\n var c=pm.getColor(colors[x]);\n var prefix=p.names&&p.names.contains(x)?'=':'\sxA0\sxA0';\n s.options[s.length]=new Option(prefix+x,colors[x]);\n if (c) s.options[s.length-1].style.backgroundColor=c;\n if (c) s.options[s.length-1].style.color=pm.getTextColor(c)\n s.options[s.length-1].title=(!c?'other: "':'')+colors[x]+(!c?'"':'');\n }\n s.size=p.min&&s.length<p.min?p.min:p.max&&s.length>p.max?p.max:s.length;\n s.onclick=function(ev){ ev=ev||window.event;\n var name=this.options[this.selectedIndex].text.replace(/[\sxA0=]+/,'').trim();\n if (this.params.callback) this.params.callback(this,name,this.value,this.params);\n return false;\n };\n s.onkeyup=function(ev){ ev=ev||window.event;\n if (ev.keyCode==13) { this.onclick(); Popup.remove(); }\n if (ev.keyCode==27) Popup.remove();\n return false;\n };\n return s;\n },\n callback: function(here,name,val,p){\n var pm=window.paletteMaker; // abbrev\n if (!val.length) return;\n var pick=p.pick!==undefined?p.pick:val;\n if (val=='_view') {\n story.displayTiddler(story.findContainingTiddler(this.place),p.palette);\n Popup.remove();\n return false;\n } else if (val=='_add') {\n var msg='Enter a new name for "'+pick+'"';\n name=prompt(msg,'');\n var slices=store.calcAllSlices(p.palette);\n while (name && slices[name])\n name=prompt('"'+name+'" is already in use\sn'+msg,name);\n } else if (p.edit) {\n var allow=p.opts.contains('ALLOWOTHER');\n var msg='Change "'+name+'" from "'+val+'" to:';\n pick=prompt(msg,pick);\n while (pick && !pm.getColor(pick)) {\n var err='"'+pick+'" is not a recognized color\sn\sxa0';\n if (!allow) err+='Please try again\sn\sn';\n else err+='Press OK to use this value anyway\sn\sn';\n var pre=pick; pick=prompt(err+msg,pick);\n if (pre==pick && allow) break;\n }\n } else {\n // TBD: callback without editing\n Popup.remove(); return false;\n }\n here.selectedIndex=0;\n if (!name||!pick) return false;\n pm.set(p.palette,name.replace(/ /g,''),pick);\n pm.drawGrid(p.place,p.grid,p.palette,p.opts);\n Popup.remove();\n return false;\n },\n set: function(palette,name,newval) {\n var tid=store.getTiddler(palette);\n if (!tid) { var tid=new Tiddler(); tid.text=store.getTiddlerText(palette,''); }\n var oldval=store.getTiddlerSlice(palette,name)||'';\n var pattern="((?:^|\s\sn)(?:[\s\s'\s\s/]{0,2})~?(?:"\n +name.escapeRegExp()\n +")\s\s1\s\s:[\s\st\s\sx20]*)(?:"\n +oldval.escapeRegExp()\n +")([\s\st\s\sx20]*(?:\s\sn|$))";\n var t=tid.text; var match=t.match(new RegExp(pattern));\n if (match) {\n var pos=t.indexOf(match[0]);\n var newText=t.substr(0,pos)+\n match[1]+newval+match[2]+\n t.substr(pos+match[0].length);\n } else { // place new slice at top of list or start of tiddler\n var match=t.match(store.slicesRE);\n var pos=t.indexOf(match?match[0]:'');\n var newText=t.substr(0,pos)\n +name+': '+newval+(t.length?'\sn':'')\n +t.substr(pos);\n }\n var who=config.options.txtUserName; var when=new Date();\n if (config.options.chkForceMinorUpdate)\n { var who=tid.modifier; var when=tid.modified; }\n displayMessage('setting "'+palette+'::'+name+'" to "'+newval+'"');\n store.saveTiddler(palette,palette,newText,who,when,tid.tags,tid.fields);\n story.refreshTiddler(palette,null,true);\n }\n};\n'';}}>>\n!end\n\n!show\n<<tiddler {{\n var opts=[]\n var palette=('$1'!='$'+'1' && '$1'!='-')?'$1':'ColorPalette';\n var grid =('$2'!='$'+'2' && '$2'!='-')?'$2':'PaletteMaker##colorgrid';\n opts.push('$3'.toUpperCase());\n opts.push('$4'.toUpperCase());\n opts.push('$5'.toUpperCase());\n if (!place.lastChild||!hasClass(place.lastChild,'colorgrid')) {\n var wrapper=createTiddlyElement(place,'span',null,'colorgrid');\n window.paletteMaker.drawGrid(wrapper,grid,palette,opts);\n }\n'';}}>>\n!end\n\n%/<<tiddler PaletteMaker##code>>/%\n%/<<tiddler {{var src='PaletteMaker'; src+(tiddler&&tiddler.title==src?'##info':'##show');}}\n with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]]>>
[[Fedora Notes from Indiana|https://wiki.dlib.indiana.edu/confluence/display/INF/Fedora]]. \n\n[[List of front ends for Fedora|http://fedora-commons.org/confluence/display/DEV/Fedora+Tools]]\n\n[[Wisconsin Presentation|http://prezi.com/66109/]]
/***\n|''Name''|SimpleSearchPlugin|\n|''Description''|displays search results as a simple list of matching tiddlers|\n|''Authors''|FND|\n|''Version''|0.4.0|\n|''Status''|stable|\n|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin|\n|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js|\n|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''Keywords''|search|\n!Revision History\n!!v0.2.0 (2008-08-18)\n* initial release\n!!v0.3.0 (2008-08-19)\n* added Open All button (renders Classic Search option obsolete)\n* sorting by relevance (title matches before content matches)\n!!v0.4.0 (2008-08-26)\n* added tag matching\n!To Do\n* tag matching optional\n* animations for container creation and removal\n* when clicking on search results, do not scroll to the respective tiddler (optional)\n* use template for search results\n!Code\n***/\n//{{{\nif(!version.extensions.SimpleSearchPlugin) { //# ensure that the plugin is only installed once\nversion.extensions.SimpleSearchPlugin = { installed: true };\n\nif(!plugins) { var plugins = {}; }\nplugins.SimpleSearchPlugin = {\n heading: "Search Results",\n containerId: "searchResults",\n btnCloseLabel: "close",\n btnCloseTooltip: "dismiss search results",\n btnCloseId: "search_close",\n btnOpenLabel: "Open all",\n btnOpenTooltip: "open all search results",\n btnOpenId: "search_open",\n \n displayResults: function(matches, query) {\n story.refreshAllTiddlers(true); // update highlighting within story tiddlers\n var el = document.getElementById(this.containerId);\n query = '"""' + query + '"""'; // prevent WikiLinks\n if(el) {\n removeChildren(el);\n } else { //# fallback: use displayArea as parent\n var container = document.getElementById("displayArea");\n el = document.createElement("div");\n el.setAttribute("id", this.containerId);\n el = container.insertBefore(el, container.firstChild);\n }\n var msg = "!" + this.heading + "\sn";\n if(matches.length > 0) {\n msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\sn";\n this.results = [];\n for(var i = 0 ; i < matches.length; i++) {\n this.results.push(matches[i].title);\n msg += "* [[" + matches[i].title + "]]\sn";\n }\n } else {\n msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?\n }\n createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, plugins.SimpleSearchPlugin.closeResults, "button", this.btnCloseId);\n wikify(msg, el);\n if(matches.length > 0) { // XXX: redundant!?\n createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, plugins.SimpleSearchPlugin.openAll, "button", this.btnOpenId);\n }\n },\n\n closeResults: function() {\n var el = document.getElementById(plugins.SimpleSearchPlugin.containerId);\n removeNode(el);\n plugins.SimpleSearchPlugin.results = null;\n highlightHack = null;\n },\n\n openAll: function(ev) {\n story.displayTiddlers(null, plugins.SimpleSearchPlugin.results);\n return false;\n }\n};\n\nconfig.shadowTiddlers.StyleSheetSimpleSearch = "/*{{{*/\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " {\sn" +\n "\stoverflow: auto;\sn" +\n "\stpadding: 5px 1em 10px;\sn" +\n "\stbackground-color: [[ColorPalette::TertiaryPale]];\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " h1 {\sn" +\n "\stmargin-top: 0;\sn" +\n "\stborder: none;\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " ul {\sn" +\n "\stmargin: 0.5em;\sn" +\n "\stpadding-left: 1.5em;\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " .button {\sn" +\n "\stdisplay: block;\sn" +\n "\stborder-color: [[ColorPalette::TertiaryDark]];\sn" +\n "\stpadding: 5px;\sn" +\n "\stbackground-color: [[ColorPalette::TertiaryLight]];\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.containerId + " .button:hover {\sn" +\n "\stborder-color: [[ColorPalette::SecondaryMid]];\sn" +\n "\stbackground-color: [[ColorPalette::SecondaryLight]];\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.btnCloseId + " {\sn" +\n "\stfloat: right;\sn" +\n "\stmargin: -5px -1em 5px 5px;\sn" +\n "}\sn\sn" +\n "#" + plugins.SimpleSearchPlugin.btnOpenId + " {\sn" +\n "\stfloat: left;\sn" +\n "\stmargin-top: 5px;\sn" +\n "}\sn" +\n "/*}}}*/";\nstore.addNotification("StyleSheetSimpleSearch", refreshStyles);\n\n// override Story.search()\nStory.prototype.search = function(text, useCaseSensitive, useRegExp) {\n highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(), useCaseSensitive ? "mg" : "img");\n var matches = store.search(highlightHack, null, "excludeSearch");\n var q = useRegExp ? "/" : "'";\n plugins.SimpleSearchPlugin.displayResults(matches, q + text + q);\n};\n\n// override TiddlyWiki.search() to sort by relevance\nTiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {\n var candidates = this.reverseLookup("tags", excludeTag, !!match);\n var primary = [];\n var secondary = [];\n var tertiary = [];\n for(var t = 0; t < candidates.length; t++) {\n if(candidates[t].title.search(searchRegExp) != -1) {\n primary.push(candidates[t]);\n } else if(candidates[t].tags.join(" ").search(searchRegExp) != -1) {\n secondary.push(candidates[t]);\n } else if(candidates[t].text.search(searchRegExp) != -1) {\n tertiary.push(candidates[t]);\n }\n }\n var results = primary.concat(secondary).concat(tertiary);\n if(sortField) {\n results.sort(function(a, b) {\n return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);\n });\n }\n return results;\n};\n\n} //# end of "install only once"\n//}}}
[[Documentation|http://www.etsupp.com/z3950/]]\n\nFor ProQuest Classic:\n\n * Host Name proquest-z3950.umi.com\n * Port 210\n * Database PQ_current\n * User ID/Password any valid ProQuest ID and password\n\nFor Historical Newspapers:\n\n * Host Name hnz39.umi.com\n * Port 210\n * Database PQHNP\n * User ID/Password any valid ProQuest ID and password\n\nNote: Our Z39.50 server does not support IP authentication at this time\n\n 0J7F3BKGMJ
[[Maco Reference|http://www.tiddlywiki.org/wiki/Category:Macros]]
from http://www.cisl.ucar.edu/info/FORMS/KNP1-6.html\n\n!!!Knowledge Networking (Abstract)\n\nThe Knowledge Networking (KN) initiative focuses on the integration of knowledge from different sources and domains across space and time. Modern computing and communications systems provide the infrastructure to send bits anywhere, anytime in mass quantities-radical connectivity. But connectivity alone cannot assure \n1 useful communication across disciplines, languages, cultures; \n2 appropriate processing and integration of knowledge from different sources, domains, and non-text media; \n3 efficacious activity and arrangements for teams, organizations, classrooms, or communities, working together over distance and time; or \n4 deepening understanding of the ethical, legal, and social implications of new developments in connectivity. \n\nIn short, *we have connectivity, but not interactivity and integration* . KN research aims to move beyond connectivity to achieve new levels of interactivity, increasing the semantic bandwidth, knowledge bandwidth, activity bandwidth, and cultural bandwidth among people, organizations, and communities.\n\n!!!Knowledge Networking\n\nTo "know" about something is a much stronger claim than to learn about it or to gather information on it. "Knowledge" implies consensual verification, as well as the ability to predict and shape outcomes. Advances in computing and communications now hold the promise of fundamentally accelerating the creation and distribution of information. However, the construction of knowledge requires more than collecting and transmitting large amounts of data. *Building knowledge requires the scientific community coming to grips with new forms of gathering data, new tools to manipulate and store information new ways of transforming that information, and new ways of working together over distance and time*. The challenge for NSF is to facilitate the evolution from today's emphasis on information and distributed data to emerging systems for knowledge and distributed intelligence. The payoff for the scientific community is that interdisciplinary communities that can be joined in sharing data, accumulating information and building knowledge together will treat complex problems, traditionally addressed within disciplinary boundaries. This shift from simple information access to knowledge networking holds great promise for to transforming society and science.\n\nNSF represents large science, engineering, and education communities that understand and can contribute to building these knowledge networks. Technological advances, spurred by the NSF, now enable scientific practitioners, who may be widely dispersed, to become a science network, sharing and integrating data, analyzing information and synthesizing knowledge. NSF wants to expand and scale up these activities in the sciences and engineering, enabling society to apply similar strategies throughout its information infrastructures.\n\nThe NSF Knowledge Networking initiative creates a program of closely interconnected activities to facilitate advances enabled by simultaneous revolutions in technology, content, and epistemology. The intellectual insights and the new process of science enabled by knowledge networking are central to NSF's mission.\n\n!!!Challenges\n\nOne challenge is to support activities that will create new ways of collecting, transforming, representing, sharing, and using information. The support must be applied effectively across a wide range of activities to enable the solution of the Knowledge Networking challenge and to provide to scientists, engineers, and society useful and easily implemented solutions to complex problems.\n\nA complementary challenge is to comprehend the human dimensions associated with knowledge networking communities. Multidisciplinary knowledge networking efforts will fail unless we understand and provide for the learning environments that enable skill sets, conceptual models, and values to be rapidly shared across disparate fields.\n\n!!!Goals\n\nDesigning tools for gathering and analyzing data. New types of tools are required to collect, share, and manipulate increasingly complex data sets and structures. Utilizing these tools involves innovations in computing, advances in telecommunications, and the development of more sophisticated algorithms and hardware/software systems.\n\nBuilding the next generation of representations. Data, information and knowledge require increasingly complex representations. New kinds of media are required to enable the communications of new types of messages and meanings. For example, transforming symbolic information into sensory form (e.g., visualization) necessitates translating scientific and mathematical notations into tangible modalities.\n\nExtending the human infrastructure that underlies knowledge networking. Generating new ideas increasingly involves participants in knowledge networks communicating with one another in real time and obtaining data from disaggregated sources. Expanding the knowledge networking community to new participants requires:\n\nMastering a common language and a generally accepted set of theories and conceptual models (to provide a framework for communication)\nInculcating communally defined processes of collecting and analyzing data (to enable sharing and validating information)\nDeveloping proficiency in design, reasoning, and argumentation (to facilitate the evolution of ideas)\nAccepting a common set of values that include respect for others' perspectives and for intellectual property (to encourage wide participation)\nStrategies\n\nIn keeping with NSF's strategic plan, the knowledge networking initiative proposes three research strategies.\n\nMaximizing cross-disciplinary research to make use of different needs and demands of distinct research communities;\nAddressing the common problems shared by different research communities;\nLeveraging existing research activities and building upon them, rather than starting from scratch.\nNSF also envisions several strategies to launch and manage knowledge networking:\nCreating ongoing working groups to integrate disciplinary issues;\nIntegrate community input through workshops;\nPromote interdisciplinary research;\nInvolve all of the Directorates at NSF.\nNSF as a Catalyst\n\nNSF can serve as a catalyst for creating knowledge networks. Part of this role involves supporting the development of enabling technologies (infrastructure), such as new algorithms and software systems; data structures; metadata; standards for interoperability, communications links, and computational platforms. These enhancements extend from innovative processes that bring researchers together in distributed collaboratories, to tools for analyzing and interpreting data in new ways, to sophisticated learning environments that help participants discover and integrate new knowledge.\n\nThe other portion of this catalytic role involves conceptualizing knowledge networking as collective action among scientific communities ranging across many fields and disciplines. By sharing disparate data and diverse perspectives, a community develops a common, evolving understanding of a complex topic. As the community's conception of the issues expands and deepens, its membership grows to include participants with new perspectives and backgrounds. Given its long experience with how this process of acculturation and distributed intelligence occurs in the scientific enterprise, NSF is positioned to aid in the development of the technological infrastructures, collaborative activities, and human communities needed for knowledge networking across in society as a whole.\n\nThe Knowledge Networking Initiative Integrates Layers of Achievement\n\nThe Knowledge Networking Initiative aims to create the underlying science and the tools, infrastructure, and distributed intellectual processes to achieve the layered aims shown in Figure 1.\n\nThe overarching goal is improving our understanding of and ability to manage larger and more complex natural, social, and material phenomena. Knowledge networking can enhance the operations of many human enterprises, with science and education the most obviously relevant to NSF's mission. The crucial added benefits that knowledge networking brings to the scientific enterprise are the abilities to:\n\nCouple models, knowledge, data, instruments, and intellectual activity across space, time, and disciplinary boundaries,\nWork with new types of content and knowledge bases of radically increased scope and scale,\nEnhance the overall cognitive ecology of science and engineering.\nAchieving these aims of coupling, scope, and intellectual community depends critically upon new levels of functionality in information infrastructures. We need a better understanding of how to push or pull relevant information wherever, whenever and to whomever it is useful; how to create true semantic interoperability in heterogeneous knowledge environments; and how to make knowledge maximally accessible with new modalities of interaction such as real-time multimedia, visualization, and simulation.\n\nAchieving such new functionality and making them widespread and universally accessible also requires re-conceptualizing the human processes involved in creating and disseminating knowledge. The groups involved include data gathering enterprises such as field research teams, observatories, and cyclotron facilities; information transmission functions such as messaging, publishing, and library systems; and integrating/stabilizing infrastructures such as standards and user groups. Each type of human interaction in the overall scientific process must alter if knowledge networking is to reach its full potential.\nFigure 2 and Figure 3 capture more of the dimensions of Knowledge Networks, and communicate their dynamic nature. \nExamples of Social Objectives and Relevance Outcomes that could be enabled by the Knowledge Nets Initiative.\n\nThe following examples are potential outcomes of Knowledge Networks. They illustrate the use of science and technologies to meet larger societal goals. These examples involve science and the use of scientific information that are possible only with the use of Knowledge Networks. In addition the examples require advancements in one or more of the subsystems (such as social use of the new knowledge, science modeling, datamelding, and real-time networks) from each of the top three layers of the Framework discussed above.\n\nCoping with Natural Disasters\n\nIn 1995, twelve forest fire fighters died tragically when they were trapped on the side of a mountain in Colorado, unaware that sudden changes in meteorological conditions had caused a change in the path of the fire. Although some data were available indicating a shift in the fire, this information could not be delivered to the scene of the fire in a timely and clearly understood manner. The enterprise, infrastructure and tools which constitute the framework of the Knowledge Nets (KN) initiative will enable an integrated framework which does not exist today for dealing with natural disasters, ultimately leading to minimizing loss. Specifically, the KN initiative could support the development of coupled fire and atmospheric models. These models require as input detailed knowledge of topography, ground cover and synoptic weather conditions. These data exist in various data bases spread over the country and are expressed in different formats. The result from a simulation must be overlaid with the detailed knowledge of the location of human and physical resources. In cases where fire is near more populated areas, as in the Oakland, California fires, additional information about the demographics and civil infrastructure must be incorporated. Even if this synthesis of rapidly changing information could be assembled today, delivery to strategic locations in an understandable form would still be necessary to ensure benefit. The infrastructure and tools components on the KN initiative are "glue" that will enable the effective management of natural disaster situations.\n\nAviation Safety:\n\nDelivery of current information to the cockpit and proper pilot training are essential elements in improving air safety and reducing operating costs. Significant progress has been made in pilot training and alerting pilots to potential life threatening situations. Examples of improved safety and reduced operating costs that could result from the research supported by KN are: 1) At many airports in the US, information on low-level wind shear coupled with Doppler radar allows air traffic controllers to alert pilots to unusual meteorological conditions. Improvements to the current capabilities could save additional lives and money for the airline industry. The current information that is assembled by air traffic controllers is of limited predictive value and must be reduced to a few numbers to allow the pilot to comprehend the information in the cockpit during takeoffs and landings. Synthesizing the results of models of the atmosphere and air traffic into the cockpit and control towers would allow the pilot and controller to better prepare for approaches or takeoffs through in-flight simulation of conditions. In addition to offering improved safety, this information will save significant fuel costs because planes would not have to be routed to different approaches at the last minute due to changed conditions on the ground. 2) The FAA is considering the feasibility of free flight by commercial airlines. This concept would allow aircraft to take the most direct route between cities rather than following established routes that pass predetermined checkpoints. Essential for free-flight are current information on weather conditions, location of other aircraft and conditions at airports along the route. Gathering this information and synthesizing and delivering it in a useful form is beyond our current capability. The airline industry estimates the annual savings, which may be recognized by implementing free flight, is tens of millions of dollars. 3) In-flight icing conditions are difficult to detect and even more difficult to predict. Several recent airline disasters have been attributed to icing. Improvements in the detection, prediction and delivery systems available to the airline industry are necessary to overcome this silent threat. The enterprise, infrastructure and tools that will be developed as part of the KN initiative will accelerate the ongoing research into in-flight icing.\n\nMonitoring and Restoring Landscape Change: the Florida Everglades\n\nLarge scale human impacts on landscapes have complex biological, social and economic consequences. The dramatic impact human activities have had on ecosystem function in the Everglades has elicited an enormous amount of research, land and water management and conservation activities. The health and recovery of the Everglades and adjoining areas is now being considered by stakeholders in many sectors: several federal agencies (DOI is dispersing $200 million for restoration), scores of state agencies and local jurisdictions, hundreds of research activities, academic centers from public and private universities, the sugar industry, two tribal nations, along with conservation and public grass-roots organizations. The dynamics of the interactions between all of these parties creates knowledge chaos conditions which leads to duplication of effort, gridlock, turf conflicts, organizational and political uncertainty, needless competition and distrust between stakeholders.\n\nInformation inputs for rational Everglades planning and recovery come from highly-distributed and diverse sources such as from long-term biological surveys, hydrochemical monitoring, watershed flow models, land use change analyses, remote sensing, economic analyses and human demographic studies, among inputs from other research, sociological and economic areas.\n\nThe accumulation, representation and communication of such rich and heterogeneous of data sets that span: decades of time, numerous research disciplines and diverse stakeholders in multiple sectors of the economy, creates enormous challenges and equally enormous potential payoffs for effective knowledge networking. Research and infrastructure development on data integration, data mining, geo-spatial visualization, human interactions, network communications, data sharing, the coordination of long term monitoring, all within the context of a well-defined, nationally important, environmental effort would have immediate value to society and represents an immediate payoff test-bed for new knowledge networking approaches. \nExamples of How Knowledge Networking can Facilitate Research and Education\n\nNetCDF: A Tool That Facilities Collaboration\n\nThough a typewritten table of numbers once sufficed to characterize most quantitative studies, scientific efforts now often yield quantities of data that can be structured, interpreted, and utilized for further study only by computer. Thus, methods for inter-computer data exchange represent critical infrastructure for scientific collaboration. Though there are common means for transferring human-readable material and for selecting and retrieving information from data-base management systems, there is little agreement on methods to convey some of the most common data structures, such as vectors and multidimensional arrays, used in certain disciplines.\n\nTo help address this problem, Unidata developed the Network Common Data Form (NetCDF). The method is not for end-user; rather, it is a programmer's tool kit for storing and retrieving data in files that are portable (i.e. transferable between dissimilar computers) and self describing (i.e. that contain enough information to obviate the need for ancillary documents on dimensionally, variable names, units of measure, etc.). The NetCDF development represents, on a very limited scale, a harbinger of impact KN will have on science, viz. the creation of enabling technologies that will result in the generation of fundamental new knowledge.\n\nThe NetCDF's existence and free availability appears to have had a positive effect on collaboration as well as on the development of scientific software. Hundreds of commercial and non-commercial organizations all around the world and representing a wide variety of disciplines have adopted NetCDF for scientific analysis or visualization.\n\n!!!Tools for Capturing, Validating, and Sharing Mathematical Knowledge\n\nMathematicians are attempting to build computer systems that effectively represent mathematical knowledge, and that enable the construction of databases of mathematical results and mechanically checked proofs in forms that are readable and usable by people. Users of such systems could shift among different but clear and unambiguous representational syntaxes that capture the same underlying mathematical knowledge in forms that are tailored for use in different contexts. Users of such systems could know that every mathematical result represented has a proof that has been checked by computer and is available for inspection. Mathematicians who have discovered new results may wish to add them to the collection, helping to publicize these results, certify their validity, and increase the overall capability. Such tools may also help to systematize mathematical knowledge and to integrate theoretical knowledge with computation. Such systems could be a clear example of the power of Knowledge Networking for dealing with organized knowledge rather than isolated facts, and the broad utility of mathematical knowledge makes it a compelling candidate. Wide availability of such capability and knowledge through integration with the Internet could lead to new generations of researchers, teachers, and students using such tools routinely in any context where mathematics is used. \nResearch Opportunities in Knowledge Networking:\n\nKnowledge Networking presents a number of research challenges and opportunities. These can be organized under a set of topics or threads, which we have termed *Interactivity, Representation, Cognition, Agents, Corpora*.\n\n!!!Interactivity\n\nInteractivity research studies the creation and maintenance of dynamic, content-rich relationships among people, instruments & tools, data, and artificial agents, using multiple modalities. Technologies that enable such interactivity encompass input/output devices, communication networks, and their interface characteristics, adapted with the aim of making the best match to what is known about the needs and requirements of individual people, groups, teams, and organizations for effective interaction.\nThe critical multidisciplinary aspects of Interactivity research result from the need to uncover common foundations for understanding widely differing types of participants (e.g. people or agents with particular skills; specialized instruments) coupled through unique domain-specific activities (e.g. doing geoscience or doing disaster relief) integrating problem- and domain-specific information (e.g., specialized datasets or knowledge bases), via a variety of media and channels (text, video, etc.), under a range of specific constraints (e.g. quality-of-service; sensory limitation such as no vision or hearing, etc.). Another multidisciplinary driver is the need to understand how to apply the fruits of Interactivity research effectively in many different domains.\nNew interdisciplinary Knowledge Networking research under the Interactivity thread includes:\n* Access and "universal access"\n* Body language and facial expression capture/generation\n* Dialogue and discourse structures and constraints\n* Ecological & virtual-environmental interactions\n* Image processing and gesture recognition\n* Intermodal mappings for people with disabilities\n* Haptics, smell, taste and balance technologies\n* Multimodal interactivity\n* Network and communications infrastructures for interactivity\n* Remote access/control and teleoperation\n* Signal processing and understanding\n* Speech recognition and natural language understanding\n* Real-time and time-modified interactivity\n* Valuation and incentives for interactivity\n\n!!!Representation\n\nResearch on representation studies the processes through which participants (people, groups, agents, etc.) model and encode knowledge about entities, processes, or phenomena in particular representational media, and, conversely, reconstruct meanings and semantics for representations in their contexts of use.\n\nThe critical multidisciplinary aspects of Representation research result from the need to uncover common foundations for understanding how widely differing types of participants (e.g. people or agents with particular domain- or culture-specific viewpoints; specialized data-gathering instruments), represent problem- and domain-specific entities or processes (e.g., protein molecules; organizational workflows), of differing representational level (e.g., sensory; cognitive), scale and complexity, for use in unique domain-specific activities (e.g. doing bioscience or doing collaborative design) via a variety of representational media and modalities (text, software, graphical data, simulations, in visual, audio, haptic modalities, etc.), under a range of specific constraints (e.g. size limitations, specificity constraints). Another multidisciplinary driver is the need to understand how to apply the fruits of Representation research effectively in many different domains.\nNew interdisciplinary Knowledge Networking research under the Representation thread includes:\nRepresentation of new entities or attributes, such as:\n\n*Complex data types\n* Complex systems and their structure\n* Domain- and discipline-specific objects, actions, and processes\n* Gestures and facial expressions\n* Human sensory information: touch, smell, taste, and balance\n* Illumination and rendering\n* Know-how and commonsense knowledge\n* Large-scale systems and phenomena\n* Mathematics and logic\n* Ontologies\n* Open physical, computational and biological systems\n* Organizational processes and workflows\n* Real world objects, processes and environments\n* Scientific principles, methods, and theories\n* Uncertainty\n* Complex operations on representations, such as:\n * Automatic generation of representations\n * Domain-independent abstraction (e.g., of texts and images)\n * Compression\n * Integration, fusion and interoperability;\n * Interpretation of representations in context\n * Multimedia indexing, abstraction\n * Translation of representations\n*New representational techniques and media such as:\n * Distributed representations\n * Distributed interpretations\n * Non-digital representational media such as culture, the physical world, molecules and Biological objects (e.g., DNA)\n * Multiperspective representations\n * Simulations and computer models\n * Tools for joint or collaborative knowledge construction and representation\n* New uses for representations\n * Cognition\n * Cognition research investigates interlinked processes of perception, reasoning, memory, learning, and action by participants in physical and socio-cultural situations. \n * The critical multidisciplinary aspects of Cognition research result from the need to uncover common foundations for integrated understanding of all phases of cognition, as carried out by a wide variety of cognitive entities (e.g., people, artificial agents, groups, organizations), cognizing (perceiving, reasoning/learning about, acting with) domain-specific phenomena of differing character, scale and complexity (e.g. perception of surface textures; organizational memory), in a wide variety of physical and social contexts (e.g. a laboratory, a crisis management scenario) under a range of specific constraints (e.g. complexity, realizability, or real-time constraints). \n * Another multidisciplinary driver is the need to understand how to apply the fruits of Cognition research effectively in many different domains.\n* New interdisciplinary Knowledge Networking research under the Representation thread includes:\n* New cognizing entities:\n * Cognition by individuals, groups, teams and organizations\n * Empirical studies of Knowledge networks as arenas for scientific experimentation, data gathering, analysis\n * Human comprehension in networked environments\n * Organizational and community memory systems\n* New objects of cognition such as:\n * Behavior and event processing of non-rigid objects\n * Complex, distributed, and open systems\nGroups, teams, organizations, institutions\nSpecific domain entities\nTasks of high complexity\nNew cognitive issues and methods:\nDistributed cognition\nDynamic adaptation\nError processing and propagation;\nExploiting parallel architectures for computation;\nFocus of attention\nHigh-level reasoning;\nKnowledge-based information processing;\nLearning effects of human exposure to virtual and real environments.\nNon-conceptual cognition;\nPerceptual, motor, and sensory-motor models;\nPerception-based problem solving\nRealizability of cognitive models\nSituated cognition\nSymbolic and geometric processing;\nTransfer of learning; skill training and acquisition\nCognitive aspects of trust and believability\n\n!!!Agents\n\nAgents research studies the active and sometimes physically embodied algorithms, software, communications, and tools that can assist people in Knowledge Networking activities. Examples of agents include knowledge agents that seek and manipulate specific data or information collections ("Knowbots") from interconnected commuter networks, and cooperative physical agents such as robots, intelligent devices, special instruments, and other non-human natural agents or environments.\nThe critical multidisciplinary aspects of Agents research result from the need to uncover common foundations for understanding how to support and augment a variety of people, teams, groups, and organizations, each with particular domain- or culture-specific needs, in performing unique domain-specific activities (e.g. doing bioscience, doing collaborative design, or emergency management), using a varied array of resources (scientific data sets, distributed simulations, specialized instruments), under a range of specific constraints (e.g. time, methodological, or performance quality constraints). Another multidisciplinary driver is the need to understand how to apply the fruits of Agents research effectively in many different domains. \nNew interdisciplinary Knowledge Networking research under the Agents thread includes:\nAutonomy\nBuilding (and dismantling) information-rich virtual communities and organizations\nDomain-specific contextual knowledge and commonsense knowledge for agents\nCoordination of activities and knowledge in heterogeneous systems and environments\nDegrees and types of augmentation and support for participants such as people, teams, or organizations.\nDesigns and criteria for sensory-motor systems\nDistributed control\nDomain-specific contextual knowledge and commonsense knowledge for agents\nDynamic adaptation and evolution of agents\nEngineering methodologies\nInteroperability of agents\nIncentive structures\nKnowledge at new scales: large collections of tiny, heterogeneous distributed agents; distributed knowledge networks for control of MEMS\nLoad and complexity management\nMathematical algorithms, machine architectures, and networking technologies for knowledge agents in information spaces\nMulti-agent systems\nModularity, parallelism and complexity\nPathologies and immune systems in large-scale human-computing aggregates, e.g. malicious agents, viruses, junk, "knowledge storms"\nPossible or optimal domain, range and scope of the agents' functionality\nPrinciples of decomposition and organization of tasks and resources (division of labor)\nRobustness, fault-tolerance, and reliability\nSpecific domain-dependent agents for assisting in information analysis, decision making, and remote control of instruments and access to information resources\nTrust, confidence, and believability\nUser, team, and organizational requirements and their evolution.\n\n!!!Corpora\n\nInvestigations of corpora (plural of "corpus") research the entire lifecycle (creation, structuring, storage, maintenance, use and disposal) of general and community-specific collections of data, information, and knowledge, ranging across ad hoc data collections, complex scientific databases, large and distributed digital libraries and even such unconventional entities as digital forms of artifacts in museums. Research in Corpora is a critical enabler of Knowledge Networking: people's ability to access, retrieve and comprehend information from complex databases and sources depends on how that information is created, structured, stored, presented, and managed.\nNew interdisciplinary Knowledge Networking research under the Corpora thread has two objectives: To accelerate cross-disciplinary database research, and to develop new kinds of cross-disciplinary data-sharing mechanisms, infrastructures, and relationships that can facilitate new interdisciplinary experimental research. Relevant research topics include: \n* Active and real-time databases and data sources\n* Classification and taxonomizing processes\n* Collection and indexing of retrospective and real-time data sources\n* Community, organizational, and social filtering of information and knowledge\n* Data and knowledge mining\n* Dealing with evolution of structure, function, content, and user requirements\n* Digital libraries and repositories across disciplines and application domains\n* Disciplinary databases; multi-lingual, cross-cultural, societal collections\n* Dissemination and distribution\n* Domain-specific taxonomies and ontologies\n* Dynamic synthesis of new structure, views, and metadata\n* Economics and valuation of information and content\n* Evolution of structure, function and content\n* Experimental evaluation\n* High-confidence and reliability\n* Intellectual property rights and ownership\n* Intelligent transaction processing\n* Meta-data research\n* Multi-modal information management\n* Object and multimedia environments\n* Organizations as active knowledgebases\n* Public access policies\n* Reliability, security, quality of data and data services\n* Searching, filtering, fusion, indexing and retrieval tools\n* Security and authorization\n* Structure, functionality and organization of corpora\n* Technologies of intellectual property, e.g., "terms and conditions"\n* Vertically and horizontally linked data sources\n\n
/***\n|Name:|HideWhenPlugin|\n|Description:|Allows conditional inclusion/exclusion in templates|\n|Version:|3.1 ($Rev: 3919 $)|\n|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|\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.hideWhenLastTest = false;\n\nwindow.removeElementWhen = function(test,place) {\n window.hideWhenLastTest = test;\n if (test) {\n removeChildren(place);\n place.parentNode.removeChild(place);\n }\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 hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.title == params[0], place);\n }},\n\n showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( tiddler.title != params[0], place);\n }},\n\n 'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n removeElementWhen( !window.hideWhenLastTest, place);\n }}\n\n});\n\n//}}}\n
[[Uses Drupal (but could be done with Zope)|http://scholar.harvard.edu/bsimmons/home]] What we should be doing for the Provost
{{{\n|CssClass|k\n|!heading column 1|!heading column 2|\n|row 1, column 1|row 1, column 2|\n|row 2, column 1|row 2, column 2|\n|>|COLSPAN|\n|ROWSPAN| ... |\n|~| ... |\n|CssProperty:value;...| ... |\n|caption|c\n}}}\n''Annotation:''\n* The {{{>}}} marker creates a "colspan", causing the current cell to merge with the one to the right.\n* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.\n<<<\n|CssClass|k\n|!heading column 1|!heading column 2|\n|row 1, column 1|row 1, column 2|\n|row 2, column 1|row 2, column 2|\n|>|COLSPAN|\n|ROWSPAN| ... |\n|~| ... |\n|CssProperty:value;...| ... |\n|caption|c\n<<<
Decades of trial, error, and egghead analysis have yielded a consensus conclusion: Buy when you need to automate commodity business processes; build when you're dealing with the core processes that differentiate your company.
[[Notes from Fytton Roland 1998|http://www.bodley.ox.ac.uk/icsu/rowlandppr.htm]]\n\nbooks are for the teaching library, journals for the research library\n\n!!! Library Roles\nThe traditional roles of the librarian in the era of print can be defined as follows.\n\n* Collection development and acquisition: to select and purchase material - printed journals, abstracts and indexes, monographs, etc.\n* Cataloguing and classification: to organise and provide access to information - physically and via lists and catalogues.\n* Circulation: to reserve materials for and lend materials to users, and recover materials from them.\n* Reference work: to advise library users and to provide and facilitate quick and easy access to information.\n* Preservation, conservation and archiving: to archive, preserve and conserve information in perpetuit.
/***\n|''Name:''|DataTiddlerPlugin|\n|''Version:''|1.0.6 (2006-08-26)|\n|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nEnhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).\n\nSuch tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. \n\n''//Example: "Table with all December Expenses"//''\n{{{\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\n}}}\n//(This assumes that expenses are stored in tiddlers tagged with "expense".)//\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\nFor other examples see DataTiddlerExamples.\n\n\n\n\n''Access and Modify Tiddler Data''\n\nYou can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. \n\nThese values can be accessed and modified through the following Tiddler methods:\n|!Method|!Example|!Description|\n|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n\nAlternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.\n|!Method|!Description|\n|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n//(For details on the various functions see the detailed comments in the source code.)//\n\n\n''Data Representation in a Tiddler''\n\nThe data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. \n\n//''Data Section Example:''//\n{{{\n<data>{"isVIP":true,"user":"John Brown","age":34}</data>\n}}}\n\nThe data section is not displayed when viewing the tiddler (see also "The showData Macro").\n\nBeside the data section a tiddler may have all kind of other content.\n\nTypically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.\n\n\n''Saving Changes''\n\nThe "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.\n\n\n''Notifications''\n\nNo notifications are sent when a tiddler's data value is changed through the "setData" methods. \n\n''Escape Data Section''\nIn case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.\n\n\n''The showData Macro''\n\nBy default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:\n\n''Syntax:'' \n|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|\n|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|\n|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\n\n!Revision history\n* v1.0.6 (2006-08-26) \n** Removed misleading comment\n* v1.0.5 (2006-02-27) (Internal Release Only)\n** Internal\n*** Make "JSLint" conform\n* v1.0.4 (2006-02-05)\n** Bugfix: showData fails in TiddlyWiki 2.0\n* v1.0.3 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.2 (2005-12-22)\n** Enhancements:\n*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.\n*** Improved (JSON) error messages.\n** Bugs fixed: \n*** References are not updated when using the DataTiddler.\n*** Changes to compound objects are not always saved.\n*** "~</data>" is not rendered correctly (expected "</data>")\n* v1.0.1 (2005-12-13)\n** Features: \n*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed\n** Bugs fixed: \n*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)\n* v1.0.0 (2005-12-12)\n** initial version\n\n!Code\n***/\n//{{{\n//============================================================================\n//============================================================================\n// DataTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Ensure that the DataTiddler Plugin is only installed once.\n//\nif (!version.extensions.DataTiddlerPlugin) {\n\n\n\nversion.extensions.DataTiddlerPlugin = {\n major: 1, minor: 0, revision: 6,\n date: new Date(2006, 7, 26), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) {\n TiddlyWiki.prototype.getTiddler = function(title) { \n var t = this.tiddlers[title]; \n return (t !== undefined && t instanceof Tiddler) ? t : null; \n };\n}\n\n//============================================================================\n// DataTiddler Class\n//============================================================================\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nfunction DataTiddler() {\n}\n\nDataTiddler = {\n // Function to stringify a JavaScript value, producing the text for the data section content.\n // (Must match the implementation of DataTiddler.parse.)\n //\n stringify : null,\n \n\n // Function to parse the text for the data section content, producing a JavaScript value.\n // (Must match the implementation of DataTiddler.stringify.)\n //\n parse : null\n};\n\n// Ensure access for IE\nwindow.DataTiddler = DataTiddler;\n\n// ---------------------------------------------------------------------------\n// Data Accessor and Mutator\n// ---------------------------------------------------------------------------\n\n\n// Returns the value of the given data field of the tiddler.\n// When no such field is defined or its value is undefined\n// the defaultValue is returned.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.getData = function(tiddler, field, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataValue(t, field, defaultValue);\n};\n\n\n// Sets the value of the given data field of the tiddler to\n// the value. When the value is equal to the defaultValue\n// no value is set (and the field is removed)\n//\n// Changing data of a tiddler will not trigger notifications.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.setData = function(tiddler, field, value, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler+ "("+t+")";\n }\n\n DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);\n};\n\n\n// Returns the data object of the tiddler, with a property for every field.\n//\n// The properties of the returned data object may only be read and\n// not be modified. To modify the data use DataTiddler.setData(...) \n// or the corresponding Tiddler method.\n//\n// If no data section is defined a new (empty) object is returned.\n//\n// @param tiddler either a tiddler name or a Tiddler\n//\nDataTiddler.getDataObject = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataObject(t);\n};\n\n// Returns the text of the content of the data section of the tiddler.\n//\n// When no data section is defined for the tiddler null is returned \n//\n// @param tiddler either a tiddler name or a Tiddler\n// @return [may be null]\n//\nDataTiddler.getDataText = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.readDataSectionText(t);\n};\n\n\n// ---------------------------------------------------------------------------\n// Internal helper methods (must not be used by code from outside this plugin)\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// The original JSONError is not very user friendly, \n// especially it does not define a toString() method\n// Therefore we extend it here.\n//\nDataTiddler.extendJSONError = function(ex) {\n if (ex.name == 'JSONError') {\n ex.toString = function() {\n return ex.name + ": "+ex.message+" ("+ex.text+")";\n };\n }\n return ex;\n};\n\n// Internal.\n//\n// @param t a Tiddler\n//\nDataTiddler.getTiddlerDataObject = function(t) {\n if (t.dataObject === undefined) {\n var data = DataTiddler.readData(t);\n t.dataObject = (data) ? data : {};\n }\n \n return t.dataObject;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {\n var value = DataTiddler.getTiddlerDataObject(tiddler)[field];\n return (value === undefined) ? defaultValue : value;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n var oldValue = data[field];\n \n if (value == defaultValue) {\n if (oldValue !== undefined) {\n delete data[field];\n DataTiddler.save(tiddler);\n }\n return;\n }\n data[field] = value;\n DataTiddler.save(tiddler);\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns its text\n// (as a String).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readDataSectionText = function(tiddler) {\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n if (matches === null || !matches[2]) {\n return null;\n }\n return matches[2];\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns it\n// (as an internalized object).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readData = function(tiddler) {\n var text = DataTiddler.readDataSectionText(tiddler);\n try {\n return text ? DataTiddler.parse(text) : null;\n } catch(ex) {\n throw DataTiddler.extendJSONError(ex);\n }\n};\n\n// Internal.\n// \n// Returns the serialized text of the data of the given tiddler, as it\n// should be stored in the data section.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getDataTextOfTiddler = function(tiddler) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n return DataTiddler.stringify(data);\n};\n\n\n// Internal.\n// \nDataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {\n var index = s.indexOf(subString, startIndex);\n while ((index > 0) && (s[index-1] == '~')) { \n index = s.indexOf(subString, index+1);\n }\n return index;\n};\n\n// Internal.\n//\nDataTiddler.getDataSectionInfo = function(text) {\n // Special care must be taken to handle "<data>" and "</data>" texts inside\n // a data section. \n // Also take care not to use an escaped <data> (i.e. "~<data>") as the start \n // of a data section. (Same for </data>)\n\n // NOTE: we are explicitly searching for a data section that contains a JSON\n // string, i.e. framed with braces. This way we are little bit more robust in\n // case the tiddler contains unescaped texts "<data>" or "</data>". This must\n // be changed when using a different stringifier.\n\n var startTagText = "<data>{";\n var endTagText = "}</data>";\n\n var startPos = 0;\n\n // Find the first not escaped "<data>".\n var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);\n if (startDataTagIndex < 0) {\n return null;\n }\n\n // Find the *last* not escaped "</data>".\n var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);\n if (endDataTagIndex < 0) {\n return null;\n }\n var nextEndDataTagIndex;\n while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {\n endDataTagIndex = nextEndDataTagIndex;\n }\n\n return {\n prefixEnd: startDataTagIndex, \n dataStart: startDataTagIndex+(startTagText.length)-1, \n dataEnd: endDataTagIndex, \n suffixStart: endDataTagIndex+(endTagText.length)\n };\n};\n\n// Internal.\n// \n// Returns the "matches" of a content of a DataTiddler on the\n// "data" regular expression. Return null when no data is defined\n// in the tiddler content.\n//\n// Group 1: text before data section (prefix)\n// Group 2: content of data section\n// Group 3: text behind data section (suffix)\n//\n// @param tiddler a Tiddler\n// @return [may be null] null when the tiddler contains no data section, otherwise see above.\n//\nDataTiddler.getDataTiddlerMatches = function(tiddler) {\n var text = tiddler.text;\n var info = DataTiddler.getDataSectionInfo(text);\n if (!info) {\n return null;\n }\n\n var prefix = text.substr(0,info.prefixEnd);\n var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);\n var suffix = text.substr(info.suffixStart);\n \n return [text, prefix, data, suffix];\n};\n\n\n// Internal.\n//\n// Saves the data in a <data> block of the given tiddler (as a minor change). \n//\n// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. \n// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.\n//\n// Notifications are not send. \n//\n// This method should only be called when the data really has changed. \n//\n// @param tiddler\n// the tiddler to be saved.\n//\nDataTiddler.save = function(tiddler) {\n\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n\n var prefix;\n var suffix;\n if (matches === null) {\n prefix = tiddler.text;\n suffix = "";\n } else {\n prefix = matches[1];\n suffix = matches[3];\n }\n\n var dataText = DataTiddler.getDataTextOfTiddler(tiddler);\n var newText = \n (dataText !== null) \n ? prefix + "<data>" + dataText + "</data>" + suffix\n : prefix + suffix;\n if (newText != tiddler.text) {\n // make the change in the tiddlers text\n \n // ... see DataTiddler.MyTiddlerChangedFunction\n tiddler.isDataTiddlerChange = true;\n \n // ... do the action change\n tiddler.set(\n tiddler.title,\n newText,\n config.options.txtUserName, \n config.options.chkForceMinorUpdate? undefined : new Date(),\n tiddler.tags);\n\n // ... see DataTiddler.MyTiddlerChangedFunction\n delete tiddler.isDataTiddlerChange;\n\n // Mark the store as dirty.\n store.dirty = true;\n \n // AutoSave if option is selected\n if(config.options.chkAutoSave) {\n saveChanges();\n }\n }\n};\n\n// Internal.\n//\nDataTiddler.MyTiddlerChangedFunction = function() {\n // Remove the data object from the tiddler when the tiddler is changed\n // by code other than DataTiddler code. \n //\n // This is necessary since the data object is just a "cached version" \n // of the data defined in the data section of the tiddler and the \n // "external" change may have changed the content of the data section.\n // Thus we are not sure if the data object reflects the data section \n // contents. \n // \n // By deleting the data object we ensure that the data object is \n // reconstructed the next time it is needed, with the data defined by\n // the data section in the tiddler's text.\n \n // To indicate that a change is a "DataTiddler change" a temporary\n // property "isDataTiddlerChange" is added to the tiddler.\n if (this.dataObject && !this.isDataTiddlerChange) {\n delete this.dataObject;\n }\n \n // call the original code.\n DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);\n};\n\n\n//============================================================================\n// Formatters\n//============================================================================\n\n// This formatter ensures that "~<data>" is rendered as "<data>". This is used to \n// escape the "<data>" of a data section, just in case someone really wants to use\n// "<data>" as a text in a tiddler and not start a data section.\n//\n// Same for </data>.\n//\nconfig.formatters.push( {\n name: "data-escape",\n match: "~<\s\s/?data>",\n\n handler: function(w) {\n w.outputText(w.output,w.matchStart + 1,w.nextMatch);\n }\n} );\n\n\n// This formatter ensures that <data>...</data> sections are not rendered.\n//\nconfig.formatters.push( {\n name: "data",\n match: "<data>",\n\n handler: function(w) {\n var info = DataTiddler.getDataSectionInfo(w.source);\n if (info && info.prefixEnd == w.matchStart) {\n w.nextMatch = info.suffixStart;\n } else {\n w.outputText(w.output,w.matchStart,w.nextMatch);\n }\n }\n} );\n\n\n//============================================================================\n// Tiddler Class Extension\n//============================================================================\n\n// "Hijack" the changed method ---------------------------------------------------\n\nDataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;\nTiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;\n\n// Define accessor methods -------------------------------------------------------\n\n// Returns the value of the given data field of the tiddler. When no such field \n// is defined or its value is undefined the defaultValue is returned.\n//\n// When field is undefined (or null) the data object is returned. (See \n// DataTiddler.getDataObject.)\n//\n// @param field [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n// @return [may be null, undefined]\n//\nTiddler.prototype.data = function(field, defaultValue) {\n return (field) \n ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)\n : DataTiddler.getTiddlerDataObject(this);\n};\n\n// Sets the value of the given data field of the tiddler to the value. When the \n// value is equal to the defaultValue no value is set (and the field is removed).\n//\n// @param value [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n//\nTiddler.prototype.setData = function(field, value, defaultValue) {\n DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);\n};\n\n\n//============================================================================\n// showData Macro\n//============================================================================\n\nconfig.macros.showData = {\n // Standard Properties\n label: "showData",\n prompt: "Display the values stored in the data section of the tiddler"\n};\n\nconfig.macros.showData.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the optional "JSON"\n var showInJSONFormat = false;\n if ((i < params.length) && params[i] == "JSON") {\n i++;\n showInJSONFormat = true;\n }\n \n var tiddlerName = story.findContainingTiddler(place).id.substr(7);\n if (i < params.length) {\n tiddlerName = params[i];\n i++;\n }\n\n // --- Processing ------------------------------------------\n try {\n if (showInJSONFormat) {\n this.renderDataInJSONFormat(place, tiddlerName);\n } else {\n this.renderDataAsTable(place, tiddlerName);\n }\n } catch (e) {\n this.createErrorElement(place, e);\n }\n};\n\nconfig.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {\n var text = DataTiddler.getDataText(tiddlerName);\n if (text) {\n createTiddlyElement(place,"pre",null,null,text);\n }\n};\n\nconfig.macros.showData.renderDataAsTable = function(place,tiddlerName) {\n var text = "|!Name|!Value|\sn";\n var data = DataTiddler.getDataObject(tiddlerName);\n if (data) {\n for (var i in data) {\n var value = data[i];\n text += "|"+i+"|"+DataTiddler.stringify(value)+"|\sn";\n }\n }\n \n wikify(text, place);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.showData.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".showDataError{color: #ffffff;background-color: #880000;}",\n "showData");\n\n\n} // of "install only once"\n// Used Globals (for JSLint) ==============\n\n// ... TiddlyWiki Core\n/*global createTiddlyElement, saveChanges, store, story, wikify */\n// ... DataTiddler\n/*global DataTiddler */\n// ... JSON\n/*global JSON */\n \n\n/***\n!JSON Code, used to serialize the data\n***/\n/*\nCopyright (c) 2005 JSON.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe Software shall be used for Good, not Evil.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/*\n The global object JSON contains two methods.\n\n JSON.stringify(value) takes a JavaScript value and produces a JSON text.\n The value must not be cyclical.\n\n JSON.parse(text) takes a JSON text and produces a JavaScript value. It will\n throw a 'JSONError' exception if there is an error.\n*/\nvar JSON = {\n copyright: '(c)2005 JSON.org',\n license: 'http://www.crockford.com/JSON/license.html',\n/*\n Stringify a JavaScript value, producing a JSON text.\n*/\n stringify: function (v) {\n var a = [];\n\n/*\n Emit a string.\n*/\n function e(s) {\n a[a.length] = s;\n }\n\n/*\n Convert a value.\n*/\n function g(x) {\n var c, i, l, v;\n\n switch (typeof x) {\n case 'object':\n if (x) {\n if (x instanceof Array) {\n e('[');\n l = a.length;\n for (i = 0; i < x.length; i += 1) {\n v = x[i];\n if (typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(v);\n }\n }\n e(']');\n return;\n } else if (typeof x.toString != 'undefined') {\n e('{');\n l = a.length;\n for (i in x) {\n v = x[i];\n if (x.hasOwnProperty(i) &&\n typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(i);\n e(':');\n g(v);\n }\n }\n return e('}');\n }\n }\n e('null');\n return;\n case 'number':\n e(isFinite(x) ? +x : 'null');\n return;\n case 'string':\n l = x.length;\n e('"');\n for (i = 0; i < l; i += 1) {\n c = x.charAt(i);\n if (c >= ' ') {\n if (c == '\s\s' || c == '"') {\n e('\s\s');\n }\n e(c);\n } else {\n switch (c) {\n case '\sb':\n e('\s\sb');\n break;\n case '\sf':\n e('\s\sf');\n break;\n case '\sn':\n e('\s\sn');\n break;\n case '\sr':\n e('\s\sr');\n break;\n case '\st':\n e('\s\st');\n break;\n default:\n c = c.charCodeAt();\n e('\s\su00' + Math.floor(c / 16).toString(16) +\n (c % 16).toString(16));\n }\n }\n }\n e('"');\n return;\n case 'boolean':\n e(String(x));\n return;\n default:\n e('null');\n return;\n }\n }\n g(v);\n return a.join('');\n },\n/*\n Parse a JSON text, producing a JavaScript value.\n*/\n parse: function (text) {\n var p = /^\ss*(([,:{}\s[\s]])|"(\s\s.|[^\sx00-\sx1f"\s\s])*"|-?\sd+(\s.\sd*)?([eE][+-]?\sd+)?|true|false|null)\ss*/,\n token,\n operator;\n\n function error(m, t) {\n throw {\n name: 'JSONError',\n message: m,\n text: t || operator || token\n };\n }\n\n function next(b) {\n if (b && b != operator) {\n error("Expected '" + b + "'");\n }\n if (text) {\n var t = p.exec(text);\n if (t) {\n if (t[2]) {\n token = null;\n operator = t[2];\n } else {\n operator = null;\n try {\n token = eval(t[1]);\n } catch (e) {\n error("Bad token", t[1]);\n }\n }\n text = text.substring(t[0].length);\n } else {\n error("Unrecognized token", text);\n }\n } else {\n token = operator = undefined;\n }\n }\n\n\n function val() {\n var k, o;\n switch (operator) {\n case '{':\n next('{');\n o = {};\n if (operator != '}') {\n for (;;) {\n if (operator || typeof token != 'string') {\n error("Missing key");\n }\n k = token;\n next();\n next(':');\n o[k] = val();\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next('}');\n return o;\n case '[':\n next('[');\n o = [];\n if (operator != ']') {\n for (;;) {\n o.push(val());\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next(']');\n return o;\n default:\n if (operator !== null) {\n error("Missing value");\n }\n k = token;\n next();\n return k;\n }\n }\n next();\n return val();\n }\n};\n\n/***\n!Setup the data serialization\n***/\n\nDataTiddler.format = "JSON";\nDataTiddler.stringify = JSON.stringify;\nDataTiddler.parse = JSON.parse;\n\n//}}}\n
Screens that need edit: http://csdirect.iii.com/manual/i_search_patron_verifica_ext.html\nProduct Overviw: http://csdirect.iii.com/documentation/ldap.shtml
PageTemplate\nStyleSheet\nMainMenu\nDefaultTiddlers\n<<toggleSideBar>> \n
The Maryland Specs look like they are doable but I have to wait and see. \n\n[[UMDM|http://www.lib.umd.edu/dcr/publications/taglibrary/umdm.html]]\n[[UMAM|http://www.lib.umd.edu/dcr/publications/taglibrary/umam.html]]\n[[UVA|http://www.lib.virginia.edu/digital/metadata/]]\n[[Getty|http://www.getty.edu/research/conducting_research/standards/intrometadata/crosswalks.html]]
config.macros.gadget = {};\n\nconfig.macros.gadget .handler = function(place,macroName,params, wikifier, paramString) {\n var elem = createTiddlyElement(place,"iframe",null,"greeting","");\n var p = paramString.parseParams(null, null, true);\n\n elem.src= "http://www.gmodules.com/ig/ifr?url=" + params[0] + "&" + getParam(p,"prefs","");\n elem.height = getParam(p,"height","200");\n elem.width= getParam(p,"width","300");\n elem.style.border= getParam(p,"border","1");\n \n place.appendChild(elem);\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
[[from Black Plastic Glasses|http://www.blackplasticglasses.com/2010/03/23/digital-reading/#more-445]]\n\n Digital learning is not pedagogic reading, but rather pedagogic reading is only part of what digital learning can offer. Digital learning can provide continuous assessment, remediation, advanced learning tools, integrated reference and multimedia.\n\n For example, imagine a digital algebra textbook that opens with an adaptive assessment tool that determines how much prior knowledge and skills a student brings to the work. If the student is weak in certain areas, remediation can be delivered before the algebra work is started. If she is highly proficient, she could be delivered a sped up curriculum allowing her to get ahead and advance more quickly.\n\nIn this way digital learning opens up huge and fundamental challenges to the entire learning establishment -- from the schools through the textbook publishers. Current systems of classroom management are mightily challenged by 2 or 3 sets of student paces -- imagine all 50 students in a classroom progressing at their own pace. And where our methods of teaching are challenged so too is the publishing world. No textbook publisher can drop its enormous investment in legacy print programs and invest the ungodly amounts it would take to build systems and platforms to deliver true digital learning.\n\n So the fate of pedagogic reading rests not so much on the success of devices or platforms that students will buy into, but more in the ability of the educational ecosphere to adapt the systems of teaching and textbooks to the potential that digital learning holds. This isn't to say there won't be successful endeavors taking linear textbook content and adapting them to digital -- there will be plenty of success for platforms and products such as the iPad and the eDGe. However, their level of success will be limited to the commercial viability of digital pedagogic reading -- not the true potential that digital learning holds.
* MyMenu\n** [[Let's go to MIT|http://mit.edu]]\n** [[Or maybe just to Harvard|http://www.harvard.edu]]\n<<dropMenu>>
/***\n|Name|TagCloudPlugin|\n|Source|http://www.TiddlyTools.com/#TagCloudPlugin|\n|Version|1.6.0|\n|Author|Eric Shulman|\n|Original Author|Clint Checketts|\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|present a 'cloud' of tags (or links) using proportional font display|\n!Usage\n<<<\n{{{\n<<cloud type action:... limit:... tag tag tag ...>>\n<<cloud type action:... limit:... +TiddlerName>>\n<<cloud type action:... limit:... =tagvalue>>\n}}}\nwhere:\n* //type// is a keyword, one of:\n** ''tags'' (default) - displays a cloud of tags, based on frequency of use\n** ''links'' - displays a cloud of tiddlers, based on number of links //from// each tiddler\n** ''references'' - displays a cloud of tiddlers, based on number of links //to// each tiddler\n* ''action:popup'' (default) - clicking a cloud item shows a popup with links to related tiddlers<br>//or//<br> ''action:goto'' - clicking a cloud item immediately opens the tiddler corresponding to that item\n* ''limit:N'' (optional) - restricts the cloud display to only show the N most popular tags/links\n* ''tag tag tag...'' (or ''title title title'' if ''links''/''references'' is used)<br>shows all tags/links in the document //except// for those listed as macro parameters\n* ''+TiddlerName''<br>shows tags/links read from a space-separated, bracketed list stored in a separate tiddler.\n* ''=tagvalue'' (//only if type=''tags''//)<br>shows only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)\n//note: for backward-compatibility, you can also use the macro {{{<<tagCloud ...>>}}} in place of {{{<<cloud ...>>}}}//\n<<<\n!Examples\n<<<\n//all tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//\n{{{<<cloud systemConfig excludeMissing script>>}}}\n{{groupbox{<<cloud systemConfig excludeMissing script>>}}}\n//top 10 tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//\n{{{<<cloud limit:10 systemConfig excludeMissing script>>}}}\n{{groupbox{<<cloud limit:10 systemConfig excludeMissing script>>}}}\n//tags listed in// [[FavoriteTags]]\n{{{<<cloud +FavoriteTags>>}}}\n{{groupbox{<<cloud +FavoriteTags>>}}}\n//links to tiddlers tagged with 'package'//\n{{{<<cloud action:goto =package>>}}}\n{{groupbox{<<cloud action:goto =package>>}}}\n//top 20 most referenced tiddlers//\n{{{<<cloud references limit:20>>}}}\n{{groupbox{<<cloud references limit:20>>}}}\n//top 20 tiddlers that contain the most links//\n{{{<<cloud links limit:20>>}}}\n{{groupbox{<<cloud links limit:20>>}}}\n<<<\n!Revisions\n<<<\n2009.02.26 [1.6.0] added {{{action:...}}} parameter to apply popup vs. goto action when clicking cloud items\n2009.02.05 [1.5.0] added ability to show links or back-links (references) instead of tags and renamed macro to {{{<<cloud>>}}} to reflect more generalized usage.\n2008.12.16 [1.4.2] corrected group calculation to prevent 'group=0' error\n2008.12.16 [1.4.1] revised tag filtering so excluded tags don't affect calculations\n2008.12.15 [1.4.0] added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular\n2008.11.15 [1.3.0] added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler\n2008.09.05 [1.2.0] added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)\n2008.07.03 [1.1.0] added 'segments' property to macro object. Extensive code cleanup\n<<<\n!Code\n***/\n//{{{\nversion.extensions.TagCloudPlugin= {major: 1, minor: 6 , revision: 0, date: new Date(2009,2,26)};\n//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman\n//Currently maintained and enhanced by Eric Shulman\n//}}}\n//{{{\nconfig.macros.cloud = {\n tagstip: "%1 tiddlers tagged with '%0'",\n refslabel: " (%0 references)",\n refstip: "%1 tiddlers have links to '%0'",\n linkslabel: " (%0 links)",\n linkstip: "'%0' has links to %1 other tiddlers",\n groups: 9,\n init: function() {\n config.macros.tagCloud=config.macros.cloud; // for backward-compatibility\n config.shadowTiddlers.TagCloud='<<cloud>>';\n config.shadowTiddlers.StyleSheetTagCloud=\n '/*{{{*/\sn'\n +'.tagCloud span {line-height: 3.5em; margin:3px;}\sn'\n +'.tagCloud1{font-size: 80%;}\sn'\n +'.tagCloud2{font-size: 100%;}\sn'\n +'.tagCloud3{font-size: 120%;}\sn'\n +'.tagCloud4{font-size: 140%;}\sn'\n +'.tagCloud5{font-size: 160%;}\sn'\n +'.tagCloud6{font-size: 180%;}\sn'\n +'.tagCloud7{font-size: 200%;}\sn'\n +'.tagCloud8{font-size: 220%;}\sn'\n +'.tagCloud9{font-size: 240%;}\sn'\n +'/*}}}*/\sn';\n setStylesheet(store.getTiddlerText('StyleSheetTagCloud'),'tagCloudsStyles');\n },\n getLinks: function(tiddler) { // get list of links to existing tiddlers and shadows\n if (!tiddler.linksUpdated) tiddler.changed();\n var list=[]; for (var i=0; i<tiddler.links.length; i++) {\n var title=tiddler.links[i];\n if (store.isShadowTiddler(title)||store.tiddlerExists(title))\n list.push(title);\n }\n return list;\n },\n handler: function(place,macroName,params) {\n // unpack params\n var inc=[]; var ex=[]; var limit=0; var action='popup';\n var links=(params[0]&¶ms[0].toLowerCase()=='links'); if (links) params.shift();\n var refs=(params[0]&¶ms[0].toLowerCase()=='references'); if (refs) params.shift();\n if (params[0]&¶ms[0].substr(0,7).toLowerCase()=='action:')\n action=params.shift().substr(7).toLowerCase();\n if (params[0]&¶ms[0].substr(0,6).toLowerCase()=='limit:')\n limit=parseInt(params.shift().substr(6));\n if (params.length) {\n if (params[0].substr(0,1)=='+') { // get tag list from tiddler\n var inc=store.getTiddlerText(params[0].substr(1),'').readBracketedList();\n } else if (params[0].substr(0,1)=='=') { // get tag list using tagged tags\n var tagged=store.getTaggedTiddlers(params[0].substr(1));\n for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);\n } else ex=params; // exclude params\n }\n // get all items, include/exclude specific items\n var items=[];\n var list=(links||refs)?store.getTiddlers('title','excludeLists'):store.getTags();\n for (var t=0; t<list.length; t++) {\n var title=(links||refs)?list[t].title:list[t][0];\n if (links) var count=this.getLinks(list[t]).length;\n else if (refs) var count=store.getReferringTiddlers(title).length;\n else var count=list[t][1];\n if ((!inc.length||inc.contains(title))&&(!ex.length||!ex.contains(title)))\n items.push({ title:title, count:count });\n }\n if(!items.length) return;\n // sort by decending count, limit results (optional)\n items=items.sort(function(a,b){return(a.count==b.count)?0:(a.count>b.count?-1:1);});\n while (limit && items.length>limit) items.pop();\n // find min/max and group size\n var most=items[0].count;\n var least=items[items.length-1].count;\n var groupSize=(most-least+1)/this.groups;\n // sort by title and draw the cloud of items\n items=items.sort(function(a,b){return(a.title==b.title)?0:(a.title>b.title?1:-1);});\n var cloudWrapper = createTiddlyElement(place,'div',null,'tagCloud',null);\n for (var t=0; t<items.length; t++) {\n cloudWrapper.appendChild(document.createTextNode(' '));\n var group=Math.ceil((items[t].count-least)/groupSize)||1;\n var className='tagCloudtag tagCloud'+group;\n var tip=refs?this.refstip:links?this.linkstip:this.tagstip;\n tip=tip.format([items[t].title,items[t].count]);\n if (action=='goto') { // TAG/LINK/REFERENCES GOTO\n var btn=createTiddlyLink(cloudWrapper,items[t].title,true,className);\n btn.title=tip;\n btn.style.fontWeight='normal';\n } else if (!links&&!refs) { // TAG POPUP\n var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,onClickTag,className);\n btn.setAttribute('tag',items[t].title);\n } else { // LINK/REFERENCES POPUP\n var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,\n function(ev) { var e=ev||window.event; var cmt=config.macros.cloud;\n var popup = Popup.create(this);\n var title = this.getAttribute('tiddler');\n var count = this.getAttribute('count');\n var refs = this.getAttribute('refs')=='T';\n var links = this.getAttribute('links')=='T';\n var label = (refs?cmt.refslabel:cmt.linkslabel).format([count]);\n createTiddlyLink(popup,title,true);\n createTiddlyText(popup,label);\n createTiddlyElement(popup,'hr');\n if (refs) {\n popup.setAttribute('tiddler',title);\n config.commands.references.handlePopup(popup,title);\n }\n if (links) {\n var tiddler = store.fetchTiddler(title);\n var links=config.macros.cloud.getLinks(tiddler);\n for(var i=0;i<links.length;i++)\n createTiddlyLink(createTiddlyElement(popup,'li'),\n links[i],true);\n }\n Popup.show();\n e.cancelBubble=true; if(e.stopPropagation) e.stopPropagation();\n return false;\n }, className);\n btn.setAttribute('tiddler',items[t].title);\n btn.setAttribute('count',items[t].count);\n btn.setAttribute('refs',refs?'T':'F');\n btn.setAttribute('links',links?'T':'F');\n btn.title=tip;\n }\n }\n }\n};\n//}}}
<html>\n <h2>Dublin Core with Qualifiers</h2>\n <table width="100%" border="2" cellspacing="0" cellpadding="3" bgcolor="#FFFFFF">\n <tr bgcolor="#CCCCCC">\n <td width="26%" valign="top"><b><font color="#000000">Element</font></b></td>\n <td width="24%" valign="top"><b><font color="#000000">Qualifier </font></b></td>\n <td width="50%" valign="top"><b><font color="#000000">Scope Note</font></b></td>\n </tr>\n <tr>\n <td width="26%" height="83" valign="top">contributor</td>\n <td width="24%" height="83" valign="top"> </td>\n <td width="50%" height="83" valign="top"> A person, organization,\n or service responsible for the content of the resource. Catch-all\n for unspecified contributors </td>\n </tr>\n <tr>\n <td width="26%" height="46" valign="top">contributor </td>\n <td width="24%" height="46" valign="top">advisor</td>\n <td width="50%" height="46" valign="top">Use primarily for thesis\n advisor</td>\n </tr>\n <tr>\n <td width="26%" valign="top">contributor</td>\n <td width="24%" valign="top">author</td>\n <td width="50%" valign="top"> </td>\n </tr>\n <tr>\n <td width="26%" valign="top">contributor</td>\n <td width="24%" valign="top">editor</td>\n <td width="50%" valign="top"> </td>\n </tr>\n <tr>\n <td width="26%" valign="top">contributor</td>\n <td width="24%" valign="top">illustrator</td>\n <td width="50%" valign="top"> </td>\n </tr>\n <tr>\n <td width="26%" valign="top">contributor</td>\n <td width="24%" valign="top">other</td>\n <td width="50%" valign="top"> </td>\n </tr>\n <tr>\n <td width="26%" valign="top">coverage</td>\n <td width="24%" valign="top">spatial</td>\n <td width="50%" valign="top">Spatial characteristics of content</td>\n </tr>\n <tr>\n <td width="26%" valign="top">coverage </td>\n <td width="24%" valign="top">temporal</td>\n <td width="50%" valign="top"> Temporal characteristics of content</td>\n </tr>\n <tr>\n <td width="26%" valign="top">creator</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Do not use; for harvested metadata only </td>\n </tr>\n <tr>\n <td width="26%" valign="top">date</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Use qualified form if possible</td>\n </tr>\n <tr>\n <td width="26%" valign="top">date </td>\n <td width="24%" valign="top">accessioned</td>\n <td width="50%" valign="top">Date DSpace takes possession of\n item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">date</td>\n <td width="24%" valign="top">available</td>\n <td width="50%" valign="top">Date or date range item became available\n to the public</td>\n </tr>\n <tr>\n <td width="26%" valign="top">date </td>\n <td width="24%" valign="top">copyright</td>\n <td width="50%" valign="top">Date of copyright</td>\n </tr>\n <tr>\n <td width="26%" valign="top">date</td>\n <td width="24%" valign="top">created</td>\n <td width="50%" valign="top">Date of creation or manufacture\n of intellectual content if different from date.issued</td>\n </tr>\n <tr>\n <td width="26%" valign="top">date</td>\n <td width="24%" valign="top">issued</td>\n <td width="50%" valign="top">Date of publication or distribution.</td>\n </tr>\n <tr>\n <td width="26%" valign="top">date</td>\n <td width="24%" valign="top">submitted</td>\n <td width="50%" valign="top">Recommend for theses and dissertations</td>\n </tr>\n <tr>\n <td width="26%" height="117" valign="top">identifier</td>\n <td width="24%" height="117" valign="top"> </td>\n <td width="50%" height="117" valign="top">Catch-all for unambiguous\n identifiers not defined by qualified form; use identifier.other\n for a known identifier common to a local collection instead\n of unqualified form</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">citation</td>\n <td width="50%" valign="top"> Bibliographic citation for works\n that have been published as a part of a larger work, e.g. journal\n articles, book chapters</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">govdoc</td>\n <td width="50%" valign="top"> Government document number</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">isbn</td>\n <td width="50%" valign="top">International Standard Book Number</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">issn</td>\n <td width="50%" valign="top">International Standard Serial Number</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">sici</td>\n <td width="50%" valign="top">Serial Item and Contribution Identifier</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">ismn</td>\n <td width="50%" valign="top">International Standard Music Number</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">other</td>\n <td width="50%" valign="top">A known identifier type common to\n a local collection</td>\n </tr>\n <tr>\n <td width="26%" valign="top">identifier</td>\n <td width="24%" valign="top">uri</td>\n <td width="50%" valign="top">Uniform Resource Identifier</td>\n </tr>\n <tr>\n <td width="26%" valign="top">description</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Catch-all for any description not\n defined by qualifiers</td>\n </tr>\n <tr>\n <td width="26%" valign="top">description</td>\n <td width="24%" valign="top">abstract</td>\n <td width="50%" valign="top">Abstract or summary</td>\n </tr>\n <tr>\n <td width="26%" valign="top">description</td>\n <td width="24%" valign="top">provenance</td>\n <td width="50%" valign="top">The history of custody of the item\n since its creation, including any changes successive custodians\n made to it</td>\n </tr>\n <tr>\n <td width="26%" valign="top">description</td>\n <td width="24%" valign="top">sponsorship</td>\n <td width="50%" valign="top"> Information about sponsoring agencies,\n individuals, or contractual arrangements for the item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">description</td>\n <td width="24%" valign="top">statementofresponsibility</td>\n <td width="50%" valign="top">To preserve statement of responsibility\n from MARC records</td>\n </tr>\n <tr>\n <td width="26%" valign="top">description</td>\n <td width="24%" valign="top">tableofcontents</td>\n <td width="50%" valign="top">A table of contents for this item</td>\n </tr>\n <tr>\n <td width="26%" height="2" valign="top">description</td>\n <td width="24%" height="2" valign="top">uri</td>\n <td width="50%" height="2" valign="top">Uniform Resource Identifier\n pointing to description of this item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">format</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Catch-all for any format information\n not defined by qualifiers</td>\n </tr>\n <tr>\n <td width="26%" valign="top">format</td>\n <td width="24%" valign="top">extent</td>\n <td width="50%" valign="top">Size or duration</td>\n </tr>\n <tr>\n <td width="26%" valign="top">format</td>\n <td width="24%" valign="top">medium</td>\n <td width="50%" valign="top">Physical medium</td>\n </tr>\n <tr>\n <td width="26%" valign="top">format</td>\n <td width="24%" valign="top">mimetype</td>\n <td width="50%" valign="top">Registered MIME type identifiers</td>\n </tr>\n <tr>\n <td width="26%" valign="top">language</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Catch-all for non-ISO forms of the\n language of the item, accommodating harvested values</td>\n </tr>\n <tr>\n <td width="26%" valign="top">language</td>\n <td width="24%" valign="top">iso</td>\n <td width="50%" valign="top">Current ISO standard for language\n of intellectual content, including country codes (e.g., "en_US")</td>\n </tr>\n <tr>\n <td width="26%" valign="top">publisher</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top"> Entity responsible for publication,\n distribution, or imprint</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Catch-all for references to other\n related items</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">isformatof</td>\n <td width="50%" valign="top">References additional physical form</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation </td>\n <td width="24%" valign="top">ispartof</td>\n <td width="50%" valign="top">References physically or logically\n containing item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">ispartofseries</td>\n <td width="50%" valign="top">Series name and number within that\n series, if available</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation </td>\n <td width="24%" valign="top">haspart</td>\n <td width="50%" valign="top">References physically or logically\n contained item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">isversionof</td>\n <td width="50%" valign="top">References earlier version</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">hasversion</td>\n <td width="50%" valign="top">References later version</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">isbasedon</td>\n <td width="50%" valign="top">References source.</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">isreferencedby</td>\n <td width="50%" valign="top">Pointed to by referenced resource</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">requires</td>\n <td width="50%" valign="top">Reference resource is required to\n support function, delivery, or coherence of item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation </td>\n <td width="24%" valign="top">replaces</td>\n <td width="50%" valign="top">References preceeding item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">isreplacedby</td>\n <td width="50%" valign="top">References succeeding item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">relation</td>\n <td width="24%" valign="top">uri</td>\n <td width="50%" valign="top">References Uniform Resource Identifier\n for related item</td>\n </tr>\n <tr>\n <td width="26%" valign="top">rights</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Terms governing use and reproduction</td>\n </tr>\n <tr>\n <td width="26%" valign="top">rights</td>\n <td width="24%" valign="top">uri</td>\n <td width="50%" valign="top">References terms governing use and\n reproduction</td>\n </tr>\n <tr>\n <td width="26%" valign="top">source</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Do not use; for harvested metadata only</td>\n </tr>\n <tr>\n <td width="26%" valign="top">source</td>\n <td width="24%" valign="top">uri</td>\n <td width="50%" valign="top">Do not use; for harvested metadata only</td>\n </tr>\n <tr>\n <td width="26%" valign="top">subject</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Uncontrolled index term</td>\n </tr>\n <tr>\n <td width="26%" valign="top">subject</td>\n <td width="24%" valign="top">classification</td>\n <td width="50%" valign="top">Catch-all for value from local classification\n system; global classification systems will receive specific\n qualifier.</td>\n </tr>\n <tr>\n <td width="26%" valign="top">subject</td>\n <td width="24%" valign="top">ddc</td>\n <td width="50%" valign="top">Dewey Decimal Classification Number</td>\n </tr>\n <tr>\n <td width="26%" valign="top">subject</td>\n <td width="24%" valign="top">lcc</td>\n <td width="50%" valign="top">Library of Congress Classification\n Number</td>\n </tr>\n <tr>\n <td width="26%" valign="top">subject</td>\n <td width="24%" valign="top">lcsh</td>\n <td width="50%" valign="top">Library of Congress Subject Heading</td>\n </tr>\n <tr>\n <td width="26%" valign="top">subject</td>\n <td width="24%" valign="top">mesh</td>\n <td width="50%" valign="top">Medical Subject Headings</td>\n </tr>\n <tr>\n <td width="26%" valign="top">subject</td>\n <td width="24%" valign="top">other</td>\n <td width="50%" valign="top">Local controlled vocabulary</td>\n </tr>\n <tr>\n <td width="26%" valign="top">title</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Title statement/title proper</td>\n </tr>\n <tr>\n <td width="26%" valign="top">title</td>\n <td width="24%" valign="top">alternative</td>\n <td width="50%" valign="top">Varying (or substitute) form of\n title proper appearing in item, e.g., abbreviation or translation</td>\n </tr>\n <tr>\n <td width="26%" valign="top">type</td>\n <td width="24%" valign="top"> </td>\n <td width="50%" valign="top">Nature or genre of content</td>\n </tr>\n </table>\n</html>
* DefaultTiddlers\n* MainMenu\n* SiteSubtitle\n* SiteTitle\n* SiteUrl
/***\n|''Name:''|FootnotesPlugin|\n|''Description:''|Create automated tiddler footnotes.|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#FootnotesPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.01|\n|''Date:''|10/25/07|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.2|\n\n!!Usage:\n*To create a footnote, just put the footnote text inside triple backticks.\n*Footnotes are numbered automatically, and listed at the bottom of the tiddler.\n*{{{Creating a footnote is easy. ```This is the text for my footnote```}}}\n*[[Example|FootnotesDemo]]\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\nconfig.footnotesPlugin = {\n backLabel: "back",\n prompt:"show footnote"\n};\n\nconfig.formatters.unshift( {\n name: "footnotes",\n match: "```",\n lookaheadRegExp: /```((?:.|\sn)*?)```/g,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source);\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart )\n {\n var tiddler = story.findContainingTiddler(w.output);\n if (!tiddler.notes)\n tiddler.notes = [];\n var title = tiddler.getAttribute("tiddler");\n tiddler.notes.pushUnique(lookaheadMatch[1]);\n var pos = tiddler.notes.indexOf(lookaheadMatch[1]) + 1;\n createTiddlyButton(w.output,pos,config.footnotesPlugin.prompt,function(){var x = document.getElementById(title+"ftn"+pos);window.scrollTo(0,ensureVisible(x)+(ensureVisible(x)<findScrollY()?(findWindowHeight()-x.offsetHeight):0));return false;},"ftnlink",title+"ftnlink"+pos); \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n});\n\nold_footnotes_refreshTiddler = Story.prototype.refreshTiddler;\nStory.prototype.refreshTiddler = function(title,template,force)\n{\n var tiddler = old_footnotes_refreshTiddler.apply(this,arguments);\n if (tiddler.notes && tiddler.notes.length)\n {\n var holder = createTiddlyElement(null,"div",null,"footnoteholder");\n var list = createTiddlyElement(holder,"ol",title+"footnoteholder");\n for (var i=0; i<tiddler.notes.length; i++)\n {\n var ftn = createTiddlyElement(list,"li",title+"ftn"+(i+1),"footnote");\n wikify(tiddler.notes[i]+" ",ftn);\n createTiddlyButton(ftn,"["+config.footnotesPlugin.backLabel+"]",config.footnotesPlugin.backLabel,function(){window.scrollTo(0,ensureVisible(document.getElementById(this.parentNode.id.replace("ftn","ftnlink"))));return false;},"ftnbklink");\n }\n var count = tiddler.childNodes.length;\n for (var j=0; j<count; j++){\n if(hasClass(tiddler.childNodes[j],"viewer")){\n var viewer = tiddler.childNodes[j]; \n }\n }\n viewer.appendChild(holder);\n tiddler.notes = [];\n }\n return tiddler;\n};\n\nsetStylesheet(\n".tiddler a.ftnlink {vertical-align: super; font-size: 0.8em; color:red;}\sn"+\n".tiddler a.ftnlink:hover, .tiddler .footnoteholder a.ftnbklink:hover{color:#fff;background:red;}\sn"+\n".tiddler div.footnoteholder{margin:1.8em 1.0em; padding:0.1em 1.0em 0.1em 1.0em ;border-left: 1px solid #ccc;}"+\n".tiddler footnoteholder ol {font-size: 0.9em; line-height: 1.2em;}\sn"+\n".tiddler .footnoteholder li.footnote {margin: 0 0 5px 0;}\sn"+\n".tiddler .footnoteholder a.ftnbklink{color:red;}\sn","FootNotesStyles");\n//!END-PLUGIN-CODE\n// %/
/*{{{*/\n/*Haemoglobin Theme for TiddlyWiki*/\n/*Design and CSS by Saq Imtiaz*/\n/*Version 1.0*/\n/*}}}*/\n/*{{{*/\n\n#sidebarTabs {font-family:arial,helvetica;}\n\nbody\n{background:#fefefe;}\n\n#contentWrapper {\n font-family: Verdana, Arial, Tahoma, Sans-Serif;\n color: #555555;\nmargin:1.9em auto 1em ; width:800px;}\n\n#header {background:#fefefe;}\n\n.headerShadow { padding: 1.4em 0em 0.5em 1em; }\n\n.siteTitle {\n font-family: 'Trebuchet MS' sans-serif;\n font-weight: bold;\n font-size: 36px;\n color: #FF4040;\n background-color: #FFF;\n}\n\n.siteSubtitle {\n font-size: 1.0em;\n display: block;\n margin: .5em 3em; color: #999;\n}\n\n.clearAll {clear:both;}\n.tagClear {clear:none;}\n#sidebar {position:relative; float:right; display:inline; right:0;}\n\na{\ncolor:#A60000;\ntext-decoration: none; font-weight:normal;\n}\n\na:hover{\ncolor:#A60000;\nbackground-color: #fefefe;\nborder-bottom:1px solid #A60000;\n}\n\n.viewer .button, .editorFooter .button{\ncolor: #555;\nborder: 1px solid #A60000;\n}\n\n.viewer .button:hover,\n.editorFooter .button:hover{\ncolor: #fff;\nbackground: #A60000;\nborder-color: #A60000;\n}\n\n.viewer .button:active, .viewer .highlight,.editorFooter .button:active,\n.editorFooter .highlight{color:#fff;\nbackground:#9F1313;border-color:#9F1313;}\n\n#topMenu br {display:none;}\n\n#topMenu {padding:0.45em 1em; background:DarkRed;}\n\n#topMenu a, #topMenu .tiddlyLink, #topMenu .button {color:#f1f1f1;\npadding:0.3em 0.45em; margin:0\n4px;font-size:120%;font-weight:normal;font-variant: small-caps; border:none;\nbackground:#A60000; text-decoration:none; }\n\n#topMenu a:hover, #topMenu .tiddlyLink:hover, #topMenu .button:hover,\n#topMenu .button:active, #topMenu .highlight\n{color:#fff;text-decoration:none; background:#9F1313; }\n\n\n\n#displayArea{margin:0 17em 2em 0.5em; width:90%;}\n\n.tiddler {padding-left:0;}\n\n.title {color:#A60000; border-bottom:1px solid#A60000; }\n.subtitle, .subtitle a { color: #999999; font-size: 1.0em;margin:0.2em;}\n.shadow .title{color:#999;}\n\n.toolbar {font-size:85%;}\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 * html .viewer pre {\n\nmargin-left: 0em;\n}\n\n * html .editor textarea, * html .editor input {\n\nwidth: 98%;\n}\n\n/***\n!Sidebar\n***/\n#sidebar {position:relative;float:right; line-height: 1.4em; border-left:0px solid#000; display:inline; background:#fefefe; right:0; margin-bottom:2em !important; margin-bottom:1em;\nwidth: 16em;display:none;}\n\n/***\n!SidebarOptions\n***/\n#sidebarOptions {padding-left:0.5em; padding-top:2em;}\n\n#sidebarOptions a {\n color:#999;\n text-decoration: none;}\n\n#sidebarOptions a:hover, #sidebarOptions a:active {\n color:#CC0000;\n background-color:#f5f5f5;border:1px solid #f5f5f5;\n }\n\n#sidebarOptions input {border:1px solid #999; }\n\n\n\n .listTitle {color:#888;}\n\n#sidebarTabs .tabContents {background:#fefefe;}\n#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#999;}\n#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#CC0000;background:#fefefe; text-decoration:none;border:none;}\n\n#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#CC0000;background:#fefefe}\n\n\n.tabSelected{color:#fefefe; background:#999;}\n\n\n\n .tabSelected, .tabSelected:hover {\n color: #555;\n background: #fefefe;\n border: solid 1px #ccc;\n\n}\n\n#sidebarTabs .tabUnselected:hover { border-bottom: none;padding-bottom:3px;color:#999;}\n\n .tabUnselected {\n color: #999;\n background: #eee;\n border: solid 1px #ccc;\n\n}\n\n.tabUnselected:hover {text-decoration:none; border:1px solid #ccc;}\n\n#sidebarTabs .tabUnselected { border-bottom: none;padding-bottom:3px;}\n#sidebarTabs .tabSelected{padding-bottom:3px;}\n\n#sidebarOptions .sliderPanel {\n background: #eee; border:1px solid#ccc;\n font-size: .9em;\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: #eee; border-bottom:1px dotted #333;}\n\n\n#sidebarOptions .sliderPanel a:hover {\ncolor:#111;\nbackground-color: #eee;\nborder:none;\nborder-bottom:1px dotted #111;\n}\n\n.tabContents {background:#fefefe;}\n\n\n\n\n.tagging, .tagged {\nborder: 1px solid #eee;\nbackground-color: #F7F7F7;\n}\n\n.selected .tagging, .selected .tagged {\nbackground-color: #f7f7f7;\nborder: 1px solid #ccc;\n}\n\n.tagging .listTitle, .tagged .listTitle {\ncolor: #bbb;\n}\n\n.selected .tagging .listTitle, .selected .tagged .listTitle {\ncolor: #666;\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.popup {\nbackground: #A60000;\nborder: 1px solid #A60000;\n}\n\n.popup li.disabled {\ncolor: #000;\n}\n\n.popup li a, .popup li a:visited {\ncolor: #eee;\nborder: none;\n}\n\n.popup li a:hover {\nbackground: #bf1717;\ncolor: #fff;\nborder: none;\n}\n\n\n\n #messageArea {\n\nborder: 4px solid #A60000;\nbackground: #fefefe;\ncolor: #555;\nfont-size:90%;\n}\n\n #messageArea a:hover { background:#f5f5f5; border:none;}\n\n\n #messageArea .button{\ncolor: #666;\nborder: 1px solid #A60000;\n}\n\n #messageArea .button:hover {\ncolor: #fff;\nbackground: #A60000;\nborder-color: #A60000;\n}\n\n #contentFooter {background:#A60000; color:#DF7D7D; clear: both; padding: 0.5em 1em; }\n\n\n#contentFooter a {\ncolor: #DF7D7D;\nborder-bottom: 1px dotted #DF7D7D; font-weight:normal;text-decoration:none;\n}\n\n\n\n#contentFooter a:hover {\ncolor: #FFFFFF;\nbackground-color:transparent;\nborder-bottom: 1px dotted #fff; text-decoration:none;\n}\n\n\n\n\n.searchBar {float:right;font-size: 1.0em;position:relative; margin-top:1.3em;}\n.searchBar .button {color:#999;display:block;}\n.searchBar .button:hover {border:1px solid #fefefe;color:#4F4B45;}\n.searchBar input { \n background-color: #fefefe;\n color: #999999;\n border: 1px solid #CCC; margin-right:3px;\n}\n\n.tiddler {padding-bottom:10px; width:100%%; \n\n.viewer blockquote {\nborder-left: 5px solid #A60000;\n}\n\n.viewer table, .viewer td {\nborder: 1px solid #A60000;\n}\n\n.viewer th, thead td {\nbackground: #A60000;\nborder: 1px solid #A60000;\ncolor: #fff;\n}\n.viewer pre {\n border: 1px solid #ccc;\n background: #f5f5f5;\n}\n\n.viewer code {\ncolor: #111; background:#f5f5f5;\n}\n\n.viewer hr {\nborder-top: dashed 1px #555;\n}\n\n.editor input {\nborder: 1px solid #888; margin-top:5px;\n}\n\n.editor textarea {\nborder: 1px solid #888;\n}\n\nh1,h2,h3,h4,h5 { color: #A60000; 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
orignal tiddler: \n<slider Slider1> \n[ ] fake link 1 \n[ ]fake link 2 \n[ ] fake link 3 \n</slider> \n<slider Slider2> \n* fake link 1 \n* fake link 2 \n* fake link 3 \n</slider>
http://www.switch.ch/collection/spec/\n\nhttp://www.cs.colorado.edu/~kena/classes/7818/f06/lectures/19/index.html
/***\n|''Name:''|Plugin: ZiddlyWiki|\n|''Description:''|Client-side component of the ZiddlyWiki server-side for TiddlyWiki|\n|''Version:''|1.0.0|\n|''Date:''|Sep 30, 2006|\n|''Source:''|http://ziddlywiki.com|\n|''Author:''|BobMcElrath|\n|''Email:''|my first name at my last name dot org|\n|''License:''|[[GPL open source license|http://www.gnu.org/licenses/gpl.html]]|\n|''~CoreVersion:''|2.1.0|\n!Description\nThis plugin is useful only in conjunction with the ZiddlyWiki server-side for\nTiddlyWiki. This plugin is automatically added to any TiddlyWiki downloaded\nfrom a ZiddlyWiki server, and should not be added by hand to your TiddlyWiki.\n\nIf you want to use the ZiddlyWiki server, install that first, and you will\nautomatically get this plugin.\n!My Server\nThis ZiddlyWiki lives at: \n{{{\n http://kennison.name/work/notes\n}}}\n!API\n{{{\n action=get\n}}}\n!Code\n***/\n//{{{\n// Place to store my junk\nif(typeof zw == "undefined") var zw = {};\nconfig.options.checkUnsavedChanges = false;\nconfig.options.confirmExit = false;\n//zw.ieurl = (navigator.appVersion.indexOf('MSIE') > -1) ? 'ie=1&' : '';\nzw.editingTiddlers = {};\nzw.dirty = false; // flag for when ZW was unable to save something\nzw.serverUrl = "http://kennison.name/work/notes";\n\nconfig.messages.loginToEdit = 'You must be logged in to make changes. Viewing source instead.';\nconfig.messages.errorDeleting = 'An error has occurred. Review your Zope error log for details.';\nconfig.messages.errorSaving = 'An error has occurred. Review your Zope error log for details. If you navigate away from this page now, you will lose your changes.';\nconfig.messages.protectedTiddler = 'You are not allowed to edit here. Click OK to view the source.';\nconfig.messages.lockedTiddler = 'This tiddler is currently being edited by %s. Please try again in a few minutes.';\nconfig.messages.lockedTiddlerYou = 'This tiddler is currently locked by you. Would you like to edit anyway?';\nconfig.messages.viewRevisionTooltip = 'View this revision.';\nconfig.messages.exportLinkLabel = 'export to file';\nconfig.messages.exportLinkPrompt = 'Export to a TiddlyWiki file';\nconfig.messages.importLinkLabel = 'import from file';\nconfig.messages.importLinkPrompt = 'Import from a TiddlyWiki file';\nconfig.messages.unsavedChangesWarning = 'Something has gone wrong and ZiddlyWiki was unable to save all changes to the server.\snIf you navigate away from this page, those changes will be lost.\snPress OK to save a backup to a local file.';\n\nconfig.views.wikified.toolbarRevisions = {text: "revisions", tooltip: "View another revision of this tiddler", popupNone: "No revisions"};\n\n// Shadow tiddlers that are protected\nconfig.protectedTiddlers = ['DefaultTiddlers', 'MainMenu'];\n\nconfig.replaceBodyCharacters = [\n [/‘/g, "'"],\n [/’/g, "'"],\n [/“/g, '"'],\n [/”/g, '"'],\n [/…/g, '...'],\n [/–/g, ' -- ']\n];\n\nconfig.macros.login = {\n label: 'login',\n prompt: 'Log into the system',\n sizeTextbox: 15,\n // FIXME onmouseover, etc... do these cause a problem? Add (?!onmouseover|onmouseout...)\n innerHTMLSafe: /^<div( ([a-zA-Z0-9_]+)="[^"]*")+>[^<>]*<\s/div>$/,\n handler: function(place) {\n if(zw.loggedIn) {\n var link = createTiddlyLink(place, zw.username, true);\n if(location.protocol == "file:") {\n link.innerHTML = zw.username + ' (offline)';\n } else {\n link.innerHTML = zw.username + ' (logged in)';\n createTiddlyButton(place, "logout", "Log out of the system", this.doLogout);\n }\n } else {\n // FIXME Only make login form if cookie-based login are enabled.\n var form = document.createElement("form");\n form.action = "?action=get&title=ZiddlyStatus";\n var u = createTiddlyElement(form, "input", "zw_username");\n u.value = "YourName";\n u.onclick = this.clearInput;\n u.size = this.sizeTextbox;\n u.onkeypress = this.enterSubmit;\n u.name = "__ac_name";\n var p = createTiddlyElement(form, "input", "zw_password");\n p.value = "password";\n p.size = this.sizeTextbox;\n p.onclick = this.clearInput;\n p.onkeypress = this.enterSubmit;\n p.name = "__ac_password";\n place.appendChild(form);\n createTiddlyButton(place,this.label,this.prompt,this.doLogin);\n }\n },\n clearInput: function(e) {\n var u = document.getElementById("zw_username");\n var p = document.getElementById("zw_password");\n if((e.target == u || e.target == p) && p.type != "password") { \n u.value = ''; \n p.value=''; \n p.type = "password";\n }\n },\n enterSubmit: function(e) {\n if(e.keyCode == 13 || e.keyCode == 10) config.macros.login.doLogin(e);\n },\n doLogin: function(e) {\n clearMessage();\n displayMessage('Logging in...');\n var u = document.getElementById("zw_username");\n var p = document.getElementById("zw_password");\n zw.loggingIn = true;\n ajax.post(zw.serverUrl.replace("http://","http://"+u.value+":"+p.value+"@")\n ,zw.addTiddler,\n "action=get&title=ZiddlyStatus&__ac_name="+u.value+"&__ac_password="+p.value);\n },\n doLogout: function(e) {\n clearMessage();\n displayMessage('Logging out...');\n zw.loggingIn=false;\n // FIXME this will fail if " " is a valid username\n ajax.post(zw.serverUrl.replace("http://","http:// :@")\n ,zw.addTiddler,\n "action=get&title=ZiddlyStatus&__ac_name=&__ac_password=");\n },\n statusChange: function() {\n var oldreadOnly = readOnly;\n config.options.chkHttpReadOnly = (zw.loggedIn || zw.anonEdit || location.protocol == "file:") ? false:true;\n readOnly = !zw.loggedIn;\n // Check for new tiddlers\n var numtofetch = 0;\n var missingtiddlers = "";\n for(var t in zw.tiddlerList) {\n if(!store.fetchTiddler(t.htmlDecode())) {\n numtofetch++;\n missingtiddlers += "\sn" + t;\n }\n }\n var fetched = 0;\n this.fetchlist = [];\n if(zw.tiddlerList.length == 0) {\n clearMessage();\n } else for(var t in zw.tiddlerList) {\n if(!store.fetchTiddler(t.htmlDecode())) {\n var callback = zw.addTiddler;\n this.fetchlist.push(t);\n if(++fetched == numtofetch) \n callback = config.macros.login.addLastTiddler;\n ajax.get('?action=get&title=' + encodeURIComponent(t.htmlDecode())\n + "&" + zw.no_cache(), callback)\n }\n }\n if(oldreadOnly != readOnly || numtofetch == 0) {\n refreshDisplay(["ViewTemplate", "EditTemplate"]);\n story.refreshAllTiddlers();\n refreshAll();\n }\n },\n doneLoginout: function() {\n var evalme = store.fetchTiddler("ZiddlyStatus").text;\n window.eval(evalme);\n readOnly = !zw.loggedIn;\n store.notify(["ZiddlyStatus"], true);\n if(!zw.loggedIn && zw.loggingIn) { // still not logged in.\n clearMessage();\n displayMessage("Authentication failed. Did you type your username and password correctly?");\n }\n if(!zw.loggingIn || (zw.loggedIn && zw.loggingIn)) clearMessage();\n return true;\n },\n addLastTiddler: function(str,status) {\n zw.addTiddler(str,status);\n refreshAll(); // Just redraw everything.\n }\n};\n// This causes our doneLogin method above to be called on startup.\nstore.addNotification("ZiddlyStatus", config.macros.login.statusChange);\n\n// Dynamically load a tiddler\nzw.loadTiddler = function(t) {\n var str = ajax.gets('?action=get&title=' + encodeURIComponent(t.htmlDecode())\n + "&" + zw.no_cache());\n return zw.addTiddler(str, 200);\n}\n\nzw.addTiddler = function(str,status) {\n var tiddler = new Tiddler();\n var d = document.createElement("div");\n if(!str.match(config.macros.login.innerHTMLSafe)) { \n if(!confirm("This tiddler appears to contain HTML and may be dangerous\sn\sn"+str)) \n return tiddler;\n }\n d.innerHTML = str; // FIXME dangerous -- response could contain <script>\n var title = store.getLoader().getTitle(store, d.firstChild);\n if(status == 404) { // not found\n store.zw_removeTiddler(title);\n } else if(status == 200) { // okay\n tiddler = store.getLoader().internalizeTiddler(store, tiddler, title, d.firstChild);\n tiddler.changed();\n store.addTiddler(tiddler);\n if(typeof store.getValue(title, "oldtitle") != "undefined") {\n store.setValue(title, "renamedSubTitle", \n "(renamed from "+store.getValue(title, "oldtitle")+")");\n }\n }\n if(tiddler.title == "ZiddlyStatus")\n config.macros.login.doneLoginout();\n refreshDisplay(title);\n return tiddler;\n}\n\nTiddler.prototype.getSubtitle = function() {\n var theModifier = this.modifier;\n if(!theModifier)\n theModifier = config.messages.subtitleUnknown;\n var theModified = this.modified;\n if(theModified)\n theModified = theModified.toLocaleString();\n else\n theModified = config.messages.subtitleUnknown;\n return(config.messages.tiddlerLinkTooltip.format([this.title,theModifier,\ntheModified]));\n\n}\n\nconfig.macros.ziddlyversion = {\n handler: function(place) {\n createTiddlyElement(place,"span",null,null,version.major + "." \n + version.minor + "." + version.revision \n + (version.beta ? "(b" + version.beta + ")" : "") + "." \n + version.extensions.ZiddlyWiki);\n }\n};\n\nconfig.macros.exportLink = {\n label: config.messages.exportLinkLabel,\n prompt: config.messages.exportLinkPrompt,\n handler: function(place) { \n if(location.protocol == "file:") {\n this.label = config.macros.saveChanges.label;\n this.prompt = config.macros.saveChanges.prompt;\n this.accessKey = config.macros.saveChanges.accessKey;\n config.macros.saveChanges.handler(place);\n } else {\n createTiddlyButton(place,this.label,this.prompt,function(){\n location.href='?action=export';return false;\n });\n }\n }\n};\n\nconfig.macros.importLink = {\n label: config.messages.importLinkLabel,\n prompt: config.messages.importLinkPrompt,\n handler: function(place) {\n if(zw.loggedIn || zw.anonEdit) {\n createTiddlyButton(place,this.label,this.prompt,function(){\n displayTiddler(null, "ImportTiddlers");\n });\n }\n }\n};\n\nTiddlyWiki.prototype.zw_removeTiddler = TiddlyWiki.prototype.removeTiddler;\nTiddlyWiki.prototype.removeTiddler = function(title) {\n displayMessage("Deleting '"+title+"' on server...");\n ajax.post(zw.serverUrl, zw.addTiddler, 'action=delete&title=' + encodeURIComponent(title) + '&' + zw.no_cache());\n return true;\n};\n\nTiddlyWiki.prototype.zw_saveTiddler = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n displayMessage("Saving '"+title+"'...");\n newBody = replaceBodyCharacters(newBody);\n var tiddler = this.zw_saveTiddler(title,newTitle,newBody,modifier,modified,tags);\n var callback = function(r,status){\n var newtiddler = zw.addTiddler(r,status);\n if(!newtiddler) {\n alert("ZiddlyWiki error: The tiddler '"+title+"' that I just tried to save\sn"\n +"doesn't exist after the save! Response ("+status+") was: \sn"+r);\n zw.dirty = true;\n } else if(newtiddler.escapeLineBreaks().htmlEncode() != tiddler.escapeLineBreaks().htmlEncode()) {\n alert("ZiddlyWiki error: Saved tiddler '"+title+"' is not the same as what was just saved."\n +"\sn-------------------before---------------------\sn"+tiddler.escapeLineBreaks().htmlEncode()\n +"\sn-------------------after----------------------\sn"+newtiddler.escapeLineBreaks().htmlEncode()\n );\n zw.dirty = true;\n }\n };\n// FIXME by using async ajax here, a reload timeout may come between the save\n// and the callback's return, which causes the tiddler to be double-rendered.\n ajax.post(zw.serverUrl, callback, 'action=save&oldtitle=' + encodeURIComponent(title) + '&title=' \n + encodeURIComponent(newTitle) + '&body=' + encodeURIComponent(newBody) + '&tags=' \n + encodeURIComponent(tags) + '&modified=' \n + encodeURIComponent((modified||store.fetchTiddler(title).modified).convertToYYYYMMDDHHMM()) \n + '&' + zw.no_cache());\n clearMessage();\n return tiddler;\n};\n\nfunction replaceBodyCharacters(body) {\n var chars = config.replaceBodyCharacters;\n for(var i=0; i<chars.length; i++) {\n body = body.replace(chars[i][0], chars[i][1]);\n }\n return body;\n};\n\nzw.no_cache = function() {return new String((new Date()).getTime())};\n\nconfig.commands.revisions = {\n text: config.views.wikified.toolbarRevisions.text,\n tooltip: config.views.wikified.toolbarRevisions.tooltip,\n popupNone: config.views.wikified.toolbarRevisions.popupNone,\n hideShadow: true,\n handler: function(event,src,title) {\n var popup = Popup.create(src);\n Popup.show(popup,false);\n var callback = function(r,status) {\n if(popup) {\n if(status != 200) {\n createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),\n config.views.wikified.toolbarRevisions.popupNone);\n } else {\n var revs = r.split('\sn');\n for(var i=0; i<revs.length; i++) {\n var parts = revs[i].split(' ');\n if(parts.length>1) {\n var modified = Date.convertFromYYYYMMDDHHMM(parts[0]);\n var key = parts[1];\n var modifier = parts[2];\n var button = createTiddlyButton(createTiddlyElement(popup,"li"), modified.toLocaleString() +" "+ modifier, \n config.messages.viewRevisionTooltip, \n function(){\n displayTiddlerRevision(this.getAttribute('tiddlerTitle'), \n this.getAttribute('revision'), this); \n return false;\n }, 'tiddlyLinkExisting tiddlyLink');\n button.setAttribute('tiddlerTitle', title);\n button.setAttribute('revision', key);\n var t = store.fetchTiddler(title);\n if(!t) alert("Attempt to find revisions for non-existant tiddler '"+title+"'!");\n if(t && (store.getValue(t, 'revision') == key))\n button.className = 'revisionCurrent';\n if(i == 0)\n this.latestRevision = key;\n }\n }\n }\n }\n };\n ajax.get('?action=get_revisions&title=' + encodeURIComponent(title.htmlDecode()) + '&' + zw.no_cache(), callback);\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n return true;\n }\n}\n\nfunction displayTiddlerRevision(title, revision, src, updateTimeline) {\n var tiddler = store.fetchTiddler(title);\n// We already have the latest version\n if(tiddler && store.getValue(tiddler, 'revision') == revision) return;\n displayMessage("Loading revision information for '"+title+"'...");\n revision = revision ? '&revision=' + revision : '';\n ajax.get('?action=get&title=' + encodeURIComponent(title.htmlDecode()) + revision \n + '&' + zw.no_cache(), displayTiddlerRevisionCallback)\n};\n\nfunction displayTiddlerRevisionCallback(str,status) {\n store.suspendNotifications(); // To prevent multiple redraws\n var tiddler = zw.addTiddler(str,status);\n store.setValue(tiddler.title, "historicalSubTitle", "");\n if(tiddler.tags.contains('deleted'))\n store.setValue(tiddler.title, "historicalSubTitle", \n store.getValue(tiddler.title, "historicalSubTitle")+" (deleted)");\n if(latestRevision != store.getValue(tiddler.title, "revision"))\n store.setValue(tiddler.title, "historicalSubTitle", \n store.getValue(tiddler.title, "historicalSubTitle")+" (historical revision)");\n store.setValue(tiddler.title, "latestRevision", latestRevision);\n story.refreshTiddler(tiddler.title, DEFAULT_VIEW_TEMPLATE, true);\n store.resumeNotifications();\n clearMessage();\n}\n\nTiddler.prototype.isReadOnly = function() {\n if(store.getValue(this.title, "readonly") == "true") return true;\n if(zw.isAdmin) return false;\n if(zw.loggedIn && this.modifier == zw.username) return false;\n if(location.protocol == "file:") return false;\n return isProtectedTiddler(this.title) || !(zw.anonEdit || zw.loggedIn);\n};\n\n// Add the protected tag to tiddlers in config.protectedTiddlers\nTiddler.prototype.zw_set = Tiddler.prototype.set;\nTiddler.prototype.set = function(title,text,modifier,modified,tags,created) {\n if(!tags) tags = [];\n if(typeof tags == "string") tags = tags.readBracketedList();\n if(!store.tiddlerExists(title) && store.isShadowTiddler(title)) {\n for(var i=0;i<config.protectedTiddlers.length;i++) {\n if(config.protectedTiddlers[i] == title) {\n tags.push('protected');\n break;\n }\n }\n }\n return this.zw_set(title, text, modifier, modified, tags, created);\n}\n\nconfig.commands.editTiddler.zw_handler = config.commands.editTiddler.handler;\nconfig.commands.editTiddler.handler = function(event,src,title) {\n if(readOnly) {\n this.zw_handler(event,src,title);\n } else {\n displayMessage("Loading '"+title+"'...");\n var obj = this;\n var callback = function(r,status) {\n clearMessage();\n if(status == 404) { // doesn't exist (might be a shadow tiddler)\n zw.editingTiddlers[title] = true;\n obj.zw_handler(event,src,title);\n } else if(status == 200) {\n var tiddler = zw.addTiddler(r,status);\n if(tiddler.tags.indexOf('deleted') != -1) // Remove the deleted tag on edit\n tiddler.tags.splice(tiddler.tags.indexOf('deleted'),1);\n zw.editingTiddlers[tiddler.title] = true;\n obj.zw_handler(event,src,tiddler.title);\n } else if(status == 503) { // "Temporarily Unavailable" Conflict\n if(r == zw.username) {\n if(confirm(config.messages.lockedTiddlerYou)) {\n var str = ajax.gets('?action=unlock&title=' + encodeURIComponent(title)\n + "&" + zw.no_cache());\n zw.addTiddler(str, 200);\n return obj.handler(event,src,title);\n }\n } else {\n alert(config.messages.lockedTiddler.replace(/%s/g, r));\n }\n } else if(status == 403) {\n // Lock failed, we must not be logged in, or something changed underneath us.\n zw.loggedIn = false;\n zw.isAdmin = false;\n readOnly = true;\n zw.loadTiddler("ZiddlyStatus");\n //refreshDisplay(["SideBarOptions","ViewTemplate", "EditTemplate"]);\n //story.refreshAllTiddlers();\n alert(config.messages.loginToEdit);\n config.commands.editTiddler.zw_handler(event,src,title);\n } else {\n alert("Server returned a response I don't understand:\sn\sn"+k);\n }\n };\n var rev = "";\n if(store.getValue(title, "latestRevision") != "undefined")\n rev = "revision="+store.getValue(title, "revision");\n ajax.post(zw.serverUrl, callback, 'action=lock&title=' + encodeURIComponent(title) + '&' + rev + '&' + zw.no_cache());\n }\n return false;\n};\n\nconfig.commands.saveTiddler.zw_handler = config.commands.saveTiddler.handler;\nconfig.commands.saveTiddler.handler = function(event,src,title) {\n if(zw.isAdmin \n || (zw.loggedIn || zw.anonEdit) && !isProtectedTiddler(title)\n || (isProtectedTiddler(title) && zw.loggedIn && this.modifier == zw.username)) {\n zw.editingTiddlers[title] = false;\n return this.zw_handler(event,src,title);\n } else {\n config.commands.cancelTiddler.zw_handler(null,null,title);\n }\n return false;\n};\n\nconfig.commands.deleteTiddler.zw_handler = config.commands.deleteTiddler.handler;\nconfig.commands.deleteTiddler.handler = function(event,src,title) {\n if(zw.isAdmin \n || (zw.loggedIn || zw.anonEdit) && !isProtectedTiddler(title)\n || (isProtectedTiddler(title) && zw.loggedIn && this.modifier == zw.username)) {\n zw.editingTiddlers[title] = false;\n return this.zw_handler(event,src,title);\n } else {\n config.commands.cancelTiddler.zw_handler(null,null,title);\n }\n return false;\n};\n\nconfig.commands.cancelTiddler.zw_handler = config.commands.cancelTiddler.handler;\nconfig.commands.cancelTiddler.handler = function(event,src,title) {\n if(!config.options.chkHttpReadOnly) {\n if(zw.editingTiddlers[title]) {\n var str = ajax.gets('?action=unlock&title=' + encodeURIComponent(title) + "&" + zw.no_cache());\n zw.addTiddler(str, 200);\n }\n zw.editingTiddlers[title] = false;\n }\n return this.zw_handler(event,src,title);\n};\n\nfunction isProtectedTiddler(title) {\n var tiddler = store.fetchTiddler(title);\n if(!tiddler) { // Must be a shadow\n for(var i=0;i<config.protectedTiddlers.length;i++) {\n if(config.protectedTiddlers[i] == title) return true;\n }\n }\n if(tiddler && tiddler.tags) {\n for(var i=0;i<tiddler.tags.length;i++) {\n if(tiddler.tags[i] == 'protected') return true;\n }\n }\n return false;\n};\n\nzw.refresh_count = 0;\nzw.refresh_tiddlers = function() {\n zw.refresh_count++;\n if(zw.refresh_count > 30) { // thirty minutes\n clearInterval(zw.refresh_interval_id);\n } else {\n ajax.get(zw.serverUrl + '?action=refresh&latest=' + zw.latestTiddler, zw.refresh_tiddlers_callback);\n }\n};\n\n// If there are unsaved changes, force the user to confirm before exitting\nfunction confirmExit()\n{\n hadConfirmExit = true;\n if(zw.dirty) return config.messages.confirmExit;\n}\n\n// Give the user a chance to save changes before exitting\nfunction checkUnsavedChanges()\n{\n if(zw.dirty && window.hadConfirmExit === false)\n {\n if(confirm(config.messages.unsavedChangesWarning))\n saveChanges();\n }\n}\n\nTiddler.prototype.isReadOnly = function() {\n return readOnly || store.getValue(this.title, "readonly");\n}\n\n// Receives a list of updated tiddler [timestamp, [title, modified, revision], ...]\n// If TW supports higher resolution modification stamps (currently: 1 minute) we can use\n// that as an identifier instead of revision\nzw.refresh_tiddlers_callback = function(tiddlers) {\n if(tiddlers == '') return;\n tiddlers = tiddlers.split('\sn\sn');\n zw.latestTiddler = parseInt(tiddlers[0]);\n for(var i=1; i<tiddlers.length; i++) {\n var l = tiddlers[i].split('\sn'); // [title, modified, revision]\n if(!zw.editingTiddlers[l[0]]) // FIXME if it's being edited and we just found out someone else modified it, we should issue a warning.\n displayTiddlerRevision(l[0], l[2], null, true);\n }\n};\n\nif(location.protocol != "file:")\n zw.refresh_interval_id = setInterval('zw.refresh_tiddlers()', 60000); // refresh every minute\n\n// mini/ajax.js - http://timmorgan.org/mini\n\nfunction $(e){if(typeof e=='string')e=document.getElementById(e);return e};\nfunction collect(a,f){var n=[];for(var i=0;i<a.length;i++){var v=f(a[i]);if(v!=null)n.push(v)}return n};\n\nvar ajax={};\najax.x=function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}};\najax.serialize=function(f){var g=function(n){return f.getElementsByTagName(n)};var nv=function(e){if(e.name)return encodeURIComponent(e.name)+'='+encodeURIComponent(e.value);else return ''};var i=collect(g('input'),function(i){if((i.type!='radio'&&i.type!='checkbox')||i.checked)return nv(i)});var s=collect(g('select'),nv);\nvar t=collect(g('textarea'),nv);return i.concat(s).concat(t).join('&');};\najax.send=function(u,f,m,a){var x=ajax.x();x.open(m,u,true);x.onreadystatechange=function(){if(x.readyState==4)f(x.responseText,x.status,x.statusText)};if(m=='POST')x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(a)};\najax.get=function(url,func){ajax.send(url,func,'GET')};\najax.gets=function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText};\najax.post=function(url,func,args){ajax.send(url,func,'POST',args)};\najax.posts=function(url,args){var x=ajax.x();x.open('POST',url,false);x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(args);return x.responseText};\najax.update=function(url,elm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.get(url,f)};\najax.submit=function(url,elm,frm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.post(url,f,ajax.serialize(frm))};\n\n//if(window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)\n//window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n//window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");\n//window.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n\n//}}}\n
Cataloguers: We want something better than MARC.\n\nLoC: Okay, did you have anything specific in mind?\n\nCataloguers: Not really, just.. you know, better.\n\nLoC: Okay, here you go <produces MODS>\n\nCataloguers: No, no, that's not good enough. <insert reason du jour>
Contents
{{{\nBUFFERSIZE = 1024 * 512 # for file uploads\n\ndef saveFile(self, name, targetFilename):\n """If "name" corresponds to an uploaded file, then open a\n file on the server specified by the fully-qualified filename\n "targetFilename" and write the file.\n Return 1 if file "name" existed and was saved successfully.\n Return 0 if no file existed for "name".\n An exception may be raised if file I/O fails.\n """\n if(not self.get(name)): return 0\n upfile = self.getFile(name)\n if(upfile):\n targetfile = open(targetFilename, "w")\n try:\n while(1):\n buffer = upfile.read(BUFFERSIZE)\n if(buffer): targetfile.write(buffer)\n else: break\n finally:\n targetfile.close()\n upfile.close()\n return 1\n else:\n return 0\n\n}}}
http://www.educause.edu/EDUCAUSE+Quarterly/EDUCAUSEQuarterlyMagazineVolum/EnvisioningthePostLMSEraTheOpe/199389
http://epsilon.slu.se/eindex.html
With cron I just update the xml file using xmlstarlet
* {{{<br>}}} forces a manual line break\n* {{{----}}} creates a horizontal ruler\n* [http://www.tiddlywiki.com/#HtmlEntities HTML entities]\n* {{{<<macroName>>}}} calls the respective [[macro|Macros]]\n* To hide text within a tiddler so that it is not displayed, it can be wrapped in {{{/%}}} and {{{%/}}}.<br/>This can be a useful trick for hiding drafts or annotating complex markup.\n* To prevent wiki markup from taking effect for a particular section, that section can be enclosed in three double quotes: e.g. {{{"""WikiWord"""}}}.
To get started with this blank ZiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the ZiddlyWiki is opened\n
<tabs mytabs>\n<tab Introduction>\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc dolor elit, sollicitudin vel, suscipit vitae, pretium quis, ante. Fusce dapibus. Maecenas non eros. Fusce venenatis est ac eros. Integer vitae metus. In luctus dolor sed tortor. Nam leo. Ut dapibus vehicula tellus. Aenean laoreet pretium urna. Maecenas suscipit, velit sit amet laoreet varius, ligula mi lacinia ligula, sit amet semper ipsum nulla id arcu. Nam vel nisi. Integer at neque eget mi ullamcorper aliquet. Mauris dignissim orci. Vestibulum ornare iaculis elit. Duis eu orci nec nisl pulvinar lobortis. Nunc diam mi, porta quis, accumsan sed, dapibus id, nibh. Cras vel metus. \n</tab>\n\n<tab Links>\n[[Let's Go to MIT|http://mit.edu]]\n[[Let's Go to Harvard|http://harvard.edu]]\n</tab>\n<tab Databases for this topic>\nThis is my third tab\nwith more than one line\n</tab>\n\n<tab Reference Works for this topic>\n[[CINAHL with Full Text|http://library.wcsu.edu/cgi-bin/go_db.py?db=Cinahl]]\n\n CINAHL is an acronym for Cumulated Index to Nursing and Allied Health Literature. CINAHL with Full Text is the world's most comprehensive source of current full text (up-to-the-minute content with no embargo*) for nursing & allied health journals, providing full text for more than 600 journals indexed in CINAHL. The database is designed to meet the information needs of nursing and allied health professionals. This premier database is recommended as a first choice for nursing research.\n\nCINAHL contains more than 1,000,000 item records dating back to 1982. It provides complete coverage of English-language nursing journals and publications from the National League for Nursing and the American Nurses' Association. CINAHL covers nursing, biomedicine, health sciences librarianship, alternative/complementary medicine, consumer health and 17 allied health disciplines. Examples of titles offered in CINAHL include: AANA Journal, Gastroenterology Nursing, Maternal and Child Health Journal, Paediatric Nursing, Parents, etc.\n\nCINAHL with Full Text also includes the Pre-CINAHL dataset. Pre-CINAHL is intended to provide current awareness of new journal articles, and is a collection of records that provide basic bibliographic information before they are indexed with CINAHL Headings.\n\nIn addition, this database offers access to health care books, nursing dissertations, selected conference proceedings, standards of practice, educational software, audiovisuals and book chapters. Searchable cited references for more than 1,150 journals are also included. Full text material includes more than 70 journals plus legal cases, clinical innovations, critical paths, drug records, research instruments and clinical trials.\n</tab>\n\n</tabs>\n
[img[/filestore/uploads/learning/commoncartridge.jpg]]
{{{\n {{{\n preformatted (e.g. code)\n }}}\n}}}\n<<<\n{{{\npreformatted (e.g. code)\n}}}\n<<<\n
http://www.sc.doe.gov/bes/BES.html\n\nhttp://www.eere.energy.gov/\n\nhttp://ec.europa.eu/research/index.cfm?lg=en&pg=who&cat=a&tips=on\nCan you do anything with this?
/***\n|Name|TiddlerPasswordPlugin|\n|Source|http://www.TiddlyTools.com/#TiddlerPasswordPlugin|\n|Version|1.1.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||\n\nThis plugin blocks viewing of specific tiddler content by prompting for a NON-SECURE, UNENCRYPTED password before the tiddler is displayed. If the correct password is not entered, the tiddler is automatically closed. The process does not prevent tiddler content from being viewed directly from the TiddlyWiki source file's storeArea, nor does it encrypt the tiddler content in any way. Because it is relatively simple to bypass and/or disable the password prompting process, this macro should be thought of as a "latch" rather than a "lock" on a given tiddler.\n!!!!!Usage\n<<<\n{{{<<getTiddlerPassword>>}}} \n{{{<<getTiddlerPassword password>>}}}\n{{{<<getTiddlerPassword password "prompt message">>}}}\n{{{<<getTiddlerPassword - "prompt message">>}}}\n\nPlace the {{{<<getTiddlerPassword>>}}} macro at the beginning of your tiddler content. The macro prompts for a password until either A) the correct password is entered or B) the user presses the cancel button from the prompt box, in which case the tiddler is automatically closed so it cannot be viewed. If a valid password is input, it will be remembered only until the user closes the tiddler. Each time the tiddler is opened, the password must be re-entered.\n\nThe optional ''password'' parameter provides a "user-level" password for the tiddler in which the macro occurs. If no user password is provided, then only the admin-level password (see below) will be accepted. \n\nBy default, the prompt message reads: "Please enter a password to view '%0'" (where the %0 is automatically replaced by the name of the tiddler in which the macro occurs) To change this text, enter an additional macro parameter, following the user password.\n>Note: because the prompt text is likely to contain spaces, you should always enclose it in quotes (or use {{{[[...]]}}} if it contains quotes). In addition, to enter an alternative prompt without providing a user-level password, use "-" as a //placeholder// for the password parameter.\n\nNotes:\n* You can also set a hard-coded admin password (see below) to define a "universal passkey" that will grant access to all tiddlers protected by this script, regardless of the individual password used on each protected tiddler.\n* If you embed one or more password-protected tiddlers within another tiddler (by using the {{{<<tiddler TiddlerName>>}}} macro) the user will be prompted to provide the appropriate password for the EACH protected tiddler contained in the tiddler being rendered.\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''TiddlerPasswordPlugin'' (tagged with <<tag systemConfig>>)\n\n''As soon as you have installed this plugin, you should change the default admin password in [[TiddlerPasswordConfig]].'' Note: the configuration tiddler is password-protected to prevent the admin password from being viewed (and/or modified) unless the current password is provided. By default, the admin password is set to "admin".\n<<<\n!!!!!Revision History\n<<<\n''2007.02.22 [1.1.1]'' updated documentation for using custom prompt text\n''2007.01.01 [1.1.0]'' added optional param for using custom prompt text \n''2006.12.03 [1.0.1]'' handler() uses passed-in 'tiddler.title' (if any), so that title of included protected tiddlers can be correctly displayed (instead of showng title of containing tiddler)\n''2006.12.02 [1.0.0]'' initial release - converted from GetTiddlerPassword inline script\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.getTiddlerPassword= {major: 1, minor: 1, revision: 1, date: new Date(2007,2,22)};\n\nconfig.macros.getTiddlerPassword = {\n msg: "Please enter a password to view '%0'",\n defaultText: "enter password here",\n retryMsg: "'%0' is not the correct password for '%1'. Please try again:",\n cancelMsg: "Sorry, you cannot view '%0' without entering a valid password.",\n thanksMsg: "Thank you, your password has been accepted.",\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var here=story.findContainingTiddler(place); if (!here) return;\n var title=tiddler?tiddler.title:here.getAttribute("tiddler");\n var who=here.getAttribute("logID");\n var userPass=params[0]?params[0]:""; if (userPass=='-') userPass="";\n var msg=params[1]?params[1]:this.msg;\n if (who==userPass||who==this.adminPass) return; // already 'logged in'?\n var who=prompt(msg.format([title]),this.defaultText); // ask for ID\n while (who && who!=userPass && who!=this.adminPass) // not correct ID?\n who=prompt(this.retryMsg.format([who,title]),this.defaultText); // ask again\n if (who==userPass||who==this.adminPass) // correct ID? mark tiddler logged in...\n { here.setAttribute("logID",who); alert(this.thanksMsg); }\n else // incorrect ID (e.g., entry cancelled by user)...\n { story.closeTiddler(here.getAttribute("tiddler")); alert(this.cancelMsg.format([title])); }\n }\n}\n// default admin password (may be overridden in TiddlerPasswordConfig)\nif (config.macros.getTiddlerPassword.adminPass==undefined)\n config.macros.getTiddlerPassword.adminPass="admin";\n//}}}
Powered by [[TiddlyWiki|http://tiddlywiki.org]] and [[Zope|http://zope.org]]
[img[/filestore/uploads/webservices/rest-web-application-arch.png]]\n\nThe above is about trust and who can call the methods on those resources.\n\n[[This is another article from that same fellow|http://www.peej.co.uk/articles/rmr-architecture.html]]\n\n
/***\n|''Name:''|JsDoIt|\n|''Version:''|1.0.1|\n|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|\n|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|\n|''Type:''|Macro extension|\n|''Required:''|TiddlyWiki 2.0.0|\n!Description\nJsDoIt lets you execute Javascript executable codes immediately when you click on a JsDoIt macro button.\n!Syntax\n{{{<<}}}JsDoIt {label} {prompt} {jsEntity} [[jsEntity2] [jsEntity3] ... [jsEntityN]]{{{>>}}}\nparameters:\n* label - caption text of the JsDoIt button\n* prompt - tip text of the JsDoIt button\n* jsEntity - javascript that would be executed\n** javascript code - begin with ''javascript:''\n** javascript tiddler - tiddler that contains javascript code\n** external javascript source - including URIs and local files\n!Example & Demo\n* execute javascript code(s):\n<<<\n{{{<<JsDoIt 'click me!' 'execute javascript code' 'javascript:alert("Hello world!");'>>}}}\n<<JsDoIt 'click me!' 'execute javascript code' 'javascript:alert("Hello world!");'>>\n<<<\n* execute javascript tiddler(s):\n<<<\n{{{<<JsDoIt 'click me!' 'execute javascript tiddler(s)' 'code1.js' 'code2.js'>>}}}\n<<JsDoIt 'click me!' 'execute javascript tiddler(s)' 'code1.js' 'code2.js'>>\n<<<\n* execute external javascript source\n<<<\n{{{<<JsDoIt 'click me!' 'execute external javascript' 'external.js'>>}}}\n<<JsDoIt 'click me!' 'execute external javascript' 'external.js'>>\n{{{<<JsDoIt 'click me!' 'execute external javascript' 'http://aiddlywiki.sourceforge.net/external.js'>>}}}\n<<JsDoIt 'click me!' 'execute external javascript' 'http://aiddlywiki.sourceforge.net/external.js'>>\n<<<\n!Revision history\n*v1.0.1 (2006/1/6)\n**fixed for(var key in params){} problem\n*v1.0.0 (2006/1/4)\n**Initial release\n!Code\n***/\n//{{{\nconfig.macros.JsDoIt = {major: 1, minor: 0, revision: 1, date: new Date(2006,1,6)};\nconfig.macros.JsDoIt.handler = function(place,macroName,params,wikifier,allParams,tiddler){\n if(params.length<=2){ throw 'not enough parameters'; }\n var button = createTiddlyButton(place, params[0], params[1]);\n button.onclick = function(){\n for(var paramIndex=2; paramIndex<params.length; paramIndex++){\n var p=params[paramIndex];\n if(p.trim().search(/javascript:/gi)===0){\n eval(p.trim().replace(/javascript:/gi,''));\n }else{\n var t=store.getTiddler(p);\n if(t){\n eval(t.text);\n }else{\n var rs=document.createElement('script');\n rs.type = 'text/javascript';\n rs.src = p.trim();\n try{\n document.body.appendChild(rs);\n document.body.removeChild(rs);\n }catch(e){\n displayMessage('load ' + p + ' error: ' + e);\n }\n }\n }\n }\n };\n};\n//}}}
Background: #fff\nForeground: #000\nPrimaryPale: #8cf\nPrimaryLight: #18f\nPrimaryMid: #04b\nPrimaryDark: #014\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88
Collect and perserve or disseminate?
!!! Libraries as viewed from the Administration Building\nhttp://www.libraryjournal.com/article/CA6726948.html\n\nWhat are the most likely Outcomes? \n* Within five years, libraries will focus exclusively on electronic resources\n* Academic computing and libraries will merge.\n* Librarians who do not produce will be reassigned or fired.\n* The library will only house materials that are actively used.\n* Libraries will shrink, in both collection size and staffing, and funding will be redirected from libraries to more critical and productive areas of the university.\n\nPossibly non of these!
<<formTiddler MyFormTemplate>>\n\n<test>can you store brackets in here</test>\n\n<<ziddlyversion>>\n<<showData>>\n\n<script label="Click Here" show>\n var tiddlerName = story.findContainingTiddler(place).id.substr(7);\n t = store.getTiddler(tiddlerName)\n var title = t.title\n var newTitle = t.title\n var newBody = t.text\n var modifier = t.modifier\n var modified = new Date()\n var tags = t.tags\n store.saveTiddler(title, newTitle, newBody, modifier, modified, tags)\n</script><data>{"firstname":"Brian","lastname":"Kennison","email":"kennisonb@wcsu.edu","phone":"(203) 835-8847","address":"473 Weekeepeemee Road","city":"Woodbury","state":"CT","zip":"06798","country":"USA","webpage":"http://kennison.name","notes":"Can this be the end!"}</data>
* html .tiddler {height:1%;}\n\nbody {font-size: .85em; font-family:arial,helvetica; margin:0; padding:0;}\n\nh1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}\nh1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}\nh4,h5,h6 {margin-top:1em;}\nh1 {font-size:1.35em;}\nh2 {font-size:1.25em;}\nh3 {font-size:1.1em;}\nh4 {font-size:1em;}\nh5 {font-size:.9em;}\n\nhr {height:1px;}\n\na {text-decoration:none;}\n\ndt {font-weight:bold;}\n\nol {list-style-type:decimal;}\nol ol {list-style-type:lower-alpha;}\nol ol ol {list-style-type:lower-roman;}\nol ol ol ol {list-style-type:decimal;}\nol ol ol ol ol {list-style-type:lower-alpha;}\nol ol ol ol ol ol {list-style-type:lower-roman;}\nol ol ol ol ol ol ol {list-style-type:decimal;}\n\n.txtOptionInput {width:11em;}\n\n#contentWrapper .chkOptionInput {border:0;}\n\n.externalLink {text-decoration:underline;}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {font-weight:bold;}\n.tiddlyLinkNonExisting {font-style:italic;}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */\na.tiddlyLinkNonExisting.shadow {font-weight:bold;}\n\n#mainMenu .tiddlyLinkExisting,\n #mainMenu .tiddlyLinkNonExisting,\n #sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}\n#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}\n\n.header {position:relative;}\n.header a:hover {background:transparent;}\n.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}\n.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}\n\n.siteTitle {font-size:3em;}\n.siteSubtitle {font-size:1.2em;}\n\n#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}\n\n#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}\n#sidebarOptions {padding-top:0.3em;}\n#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}\n#sidebarOptions input {margin:0.4em 0.5em;}\n#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}\n#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}\n#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}\n#sidebarTabs .tabContents {width:15em; overflow:hidden;}\n\n.wizard {padding:0.1em 1em 0em 2em;}\n.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}\n.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}\n.wizardStep {padding:1em 1em 1em 1em;}\n.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}\n.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}\n.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}\n.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}\n\n#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}\n.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}\n#messageArea a {text-decoration:underline;}\n\n.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}\n.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}\n\n.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}\n.popup .popupMessage {padding:0.4em;}\n.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}\n.popup li.disabled {padding:0.4em;}\n.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}\n.listBreak {font-size:1px; line-height:1px;}\n.listBreak div {margin:2px 0;}\n\n.tabset {padding:1em 0em 0em 0.5em;}\n.tab {margin:0em 0em 0em 0.25em; padding:2px;}\n.tabContents {padding:0.5em;}\n.tabContents ul, .tabContents ol {margin:0; padding:0;}\n.txtMainTab .tabContents li {list-style:none;}\n.tabContents li.listLink { margin-left:.75em;}\n\n#contentWrapper {display:block;}\n#splashScreen {display:none;}\n\n#displayArea {margin:1em 17em 0em 14em;}\n\n.toolbar {text-align:right; font-size:.9em;}\n\n.tiddler {padding:1em 1em 0em 1em;}\n\n.missing .viewer,.missing .title {font-style:italic;}\n\n.title {font-size:1.6em; font-weight:bold;}\n\n.missing .subtitle {display:none;}\n.subtitle {font-size:1.1em;}\n\n.tiddler .button {padding:0.2em 0.4em;}\n\n.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}\n.isTag .tagging {display:block;}\n.tagged {margin:0.5em; float:right;}\n.tagging, .tagged {font-size:0.9em; padding:0.25em;}\n.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}\n.tagClear {clear:both;}\n\n.footer {font-size:.9em;}\n.footer li {display:inline;}\n\n.annotation {padding:0.5em; margin:0.5em;}\n\n* html .viewer pre {width:99%; padding:0 0 1em 0;}\n.viewer {line-height:1.4em; padding-top:0.5em;}\n.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}\n.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}\n.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}\n\n.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}\n.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}\ntable.listView {font-size:0.85em; margin:0.8em 1.0em;}\ntable.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}\n\n.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}\n.viewer code {font-size:1.2em; line-height:1.4em;}\n\n.editor {font-size:1.1em;}\n.editor input, .editor textarea {display:block; width:100%; font:inherit;}\n.editorFooter {padding:0.25em 0em; font-size:.9em;}\n.editorFooter .button {padding-top:0px; padding-bottom:0px;}\n\n.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}\n\n.sparkline {line-height:1em;}\n.sparktick {outline:0;}\n\n.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}\n.zoomer div {padding:1em;}\n\n* html #backstage {width:99%;}\n* html #backstageArea {width:99%;}\n#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}\n#backstageToolbar {position:relative;}\n#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}\n#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}\n#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}\n#backstage {position:relative; width:100%; z-index:50;}\n#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}\n.backstagePanelFooter {padding-top:0.2em; float:right;}\n.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}\n#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}\n\n.whenBackstage {display:none;}\n.backstageVisible .whenBackstage {display:block;}
<<options>>
What users want from a library:\n\n>This brings me back to my original point about librarians and libraries. My most pressing need is to gain access to more of the academic literature with fewer hurdles. Access from my computer. Anywhere. With fewer clicks through proxy servers and specialized journal links.\n\n>I guess I don't really have any use for librarians per se. Except in so far as they get me closer to these unfettered access goals.\n\nFrom another user:\n\n>I see libraries going in three different directions.\n\n>One really important function (just now at least) is managing the byzantine world of publishers and subscriptions. Making sure we actually have access to what we want, hopefully without breaking the budget of the University.\n\n>Another role is basically IT infrastructure and support. I would like to see this become more explicitly a function of the library and less it's own department. 95+% of IT is about making sure people have access to the information resources they need... and I think the libraries would probably do a better job of it since it is baked into "what they do" (unlike many IT departments).\nIt is also notable that libraries already deal with "user generated" data, not just access to externally published stuff.\n\n>Finally, I see librarians becoming more like consultants (such as stats consultants).\n\n
!! Resource-Method-Representation\n\n[img[/filestore/uploads/webservices/rmr.jpg]]\n\n!!! Why\n<<<\nIf we think about URLs as being only nouns, no verbs, then we end up with a URL for every important thing in our site. Those URLs can then be bookmarked and linked easily. We can change code behind the scenes without changing the URLs as the URLs refer to objects that don't change rather than functions that do.\n\nThe model is inherently object-oriented, with every object (at least those of meaning to the outside world) having a URI and every object responding to the standard HTTP verbs, GET, PUT, POST, DELETE. This is object-orientation at the level of the web, not at the level of a server-side language. That's a very different thing to what JSP does, where internally the server-side code may be object-oriented, but the URIs refer to verbs, so look more procedural or perhaps functional.\n<<<\n\nThe above is from [[Rob Styles from Talis|http://dynamicorange.com/2008/10/03/pages-screens-mvc-and-not-getting-it/]] You need to read the whole article!\n\n\nhttp://architects.dzone.com/news/common-rest-design-pattern\n\n[[Paul Sadauskas on RESTful services|http://www.theamazingrando.com/blog/?p=107]] //(very good)//
This is good for every element but it is also good as an example of a topic map.\n\nhttp://semanticweb.org/wiki/Semantic_Web_Topic_Hierarchy\n\nFind out about "semantic web for research commnunities" SWRC ontology\n\nhttp://sindice.com/\n\nhttp://semanticweb.org/wiki/Ontology
"Becomes visible upon breakdown" \n\nthe only time you (want) to see a library is when it doesn't work\n\n>If all libraries are good for is contracting for goods, then why not hand this off to the people who order the office supplies or the lab supplies? Surely they have to select among various suppliers -- isn't that the same?
Andy Powell has posted a [[piece|http://efoundations.typepad.com/efoundations/2009/10/a-couple-of-useful-dublin-core-rdf-usage-patterns.html#comments]] about how simple dublin core has progressed. It not as simple as it was but it is still not all that hard. The question is how to you produce it, using a stripped down model inside and then generating a full blown mode for exchange. You just have to make sure you have all the information there from the start.
{{{\n#!/iiidb/software/tpp/perl/bin/perl -w\n\nuse Net::LDAP;\nuse Net::LDAPS;\nuse strict;\nuse CGI qw(unescape);\n\n#\n#-----------------------------------------------------------------------\n# This perl script is provided as an example for libraries that want to\n# employ Innovative's "plugin" model for External Patron Verification.\n#\n# The example script queries multiple LDAP servers depending on the type \n# of user, e.g. staff/faculty vs. student; campus1 vs. campus2; etc.\n#\n# This script is not intended to be "standalone" but is instead called by \n# the Innovative checkLDAP script.\n#\n# Innovative provides this example script as a courtesy to libraries that\n# have multiple LDAP servers. The library is responsible for customizing \n# this script with local values, enhanced functionality, etc. \n#-----------------------------------------------------------------------\n#\n\nmy $debug = "yes";\n\nopen (DEBUG, ">>/tmp/checkLDAP_dlevy.log") if ($debug eq "yes");\n\n#\n# LDAP connection information is stored in arrays of size 2.\n# The script assumes that the first location (0) in the array \n# contains the connection information for the student LDAP server, \n# i.e. the input extpatserver = student, if extpatserver = staff the\n# script uses the connection information from the second location (1)\n# in the following arrays.\n# If there is no value in extpatserver, the script queryies the student\n# LDAP server.\n# These arrays should be initialized here with the real values.\n# To customize this script for you system, configure the following \n# arrays:\n#\n# m_sLDAPServer : contains the host domain name of the LDAP servers.\n#\n# m_nPort : specifies the port used to connect to the LDAP server.\n#\n# m_bUseLDAPS : set to 1 if you use a secure connection i.e. port 636, \n# set to 0 if you use a non-secure connection.\n# m_sBindBase : contains a string that defines which database to use \n# on the LDAP server on the first bind command; \n# if empty use anonymous bind.\n#\n# m_sBindPassword : contains the password of the administrator account \n# you use to bind. Set the password unencrypted, \n# i.e. use the string you received from the LDAP \n# adminstartor as it is. \n# m_sBindUser : set the login of the administartor account, or an empty string\n#\n# m_bUseOneBind: set to 1 if you use user's credentials to bind.\n#\n# m_sSearchAttribute : contains the primary search attribute to be used \n# (university ID, for example) when searching for \n# a given patron on the LDAP server.\n#\n# m_sSearchBase : contains the search DN used to retrieve user records.\n#\n# m_sIDAttribute : contains the attribute in the data returned by the LDAP\n# server which is used as the patron search key on the\n# Millennium server. \n#\n\nmy @m_sLDAPServer = ("","");\nmy @m_nPort = ("","");\nmy @m_bUseLDAPS = (0,0);\nmy @m_sBindBase = ("","");\nmy @m_sBindPassword = ("","");\nmy @m_sBindUser = ("","");\nmy @m_bUseOneBind = (0,0);\nmy @m_sSearchAttribute = ("","");\nmy @m_sSearchBase = ("","");\nmy @m_sIDAttribute = ("","");\n\n\nmy $m_bUseLDAPPassword = 1;\nmy $m_bTryMillenniumAfterBadVerify = 0;\n\nmy @m_nTimeOut = (3,3);\nmy $m_sLDAPVersion = 3;\n\n#\n# Input variables are stored in teh following variables\n#\nmy $m_sUserName = "";\nmy $m_sUserId = "";\nmy $m_sPassword = "";\nmy $m_sServer= "";\n\nmy $m_hLDAP;\nmy $m_whichServer = 0; #Identifies which server to query by index, either 0 or 1\nmy $m_hSearchMessage;\nmy $m_bVerbose = 0;\n#my $m_bVerbose = 1;\nmy $m_nTimeOut = 3;\n\n\nmy $m_sOriginalUserId;\nmy $m_sResult = "Failed";\nmy $m_sLogMessage = "";\nmy $m_sIIIDB = "";\n\n#------------------------------------------------------------\n# log a message for each verification to $IIIDB/errlog/ldap.log\n# append if is used to wrap log so it doesn't grow to big\n#------------------------------------------------------------\nsub logger\n{\nmy $sMessage = shift;\n\nmy $sOutName = $m_sIIIDB . "/errlog/ldap.log";\n\nif( ( -e "$sOutName" ) && ( -s "$sOutName" ) > 100000 )\n {\n rename( "$sOutName", "$sOutName.old" );\n system( "touch $sOutName" );\n }\n\nopen( OUT, ">>$sOutName" ) ||\n die( "Cannot appendf $sOutName\sn" );\n\nmy ($nSec,$nMin,$nHr,$nDay,$nMonth,$nYear,$sRest) = localtime();\n\nmy $sDenseTime = sprintf "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d",\n $nYear + 1900, $nMonth + 1, $nDay, $nHr, $nMin, $nSec;\nprint OUT "$sDenseTime:$m_sOriginalUserId:$m_sUserId" .\n ":$m_sLogMessage:$sMessage\sn";\nif( $m_bVerbose )\n {\n print "$sDenseTime:$m_sOriginalUserId:$m_sUserId" .\n ":$m_sLogMessage:$sMessage\sn";\n }\nclose( OUT );\n}\n#----------------------------------------------------------------\n#\n# Innovative checkLDAP script\n# The Innovative Perl script sends the following name/value pairs\n# via STDIN to this plugin script:\n#\n# extpatid= is the patron ID number.\n#\n# extpatpw= is the patron password.\n#\n# extpatserver= indicates the patron's choice of \n# "student" or "staff"\n#\n#----------------------------------------------------------------\nsub parseInput\n{\nwhile( <> )\n {\n chomp;\n\n for( split /\s&/ )\n {\n if( /^extpatname=(.*)/ )\n {\n $m_sUserName = unescape($1);\n }\n elsif( /^extpatid=(.*)/ )\n {\n $m_sUserId = unescape($1);\n }\n elsif( /^extpatpw=(.*)/ )\n {\n $m_sPassword = unescape($1);\n }\n elsif( /^extpatserver=(.*)/ )\n {\n $m_sServer= unescape($1);\n }\n }\n }\n}\n#---------------------------------------------------------------\n#\n# Open a connection to the LDAP server.\n#\n#---------------------------------------------------------------\nsub doConnect\n{\nmy @aLDAPArgs;\n\npush( @aLDAPArgs, $m_sLDAPServer[$m_whichServer] );\npush( @aLDAPArgs, port => $m_nPort[$m_whichServer] );\n\n\nif( $m_bUseLDAPS[$m_whichServer] )\n {\n $m_hLDAP = new Net::LDAPS( @aLDAPArgs ) ||\n systemError( "Cannot create session, args=@aLDAPArgs" );\n }\n\nelse\n {\n\n $m_hLDAP = Net::LDAP->new( @aLDAPArgs ) ||\n systemError( "Cannot create session, args=@aLDAPArgs" );\n }\n\nif( ! defined( $m_hLDAP ) )\n {\n systemError( "Bad return from LDAP->new with args=@aLDAPArgs" );\n }\n\nif( $m_bVerbose )\n {\n print "LDAP connection established args=@aLDAPArgs\sn";\n }\n\nreturn 1;\n}\n#------------------------------------------------------------\nsub doBind\n{\n#expects the following parameters\nmy $sBindBase = shift;\nmy $sBindUser = shift;\nmy $sBindPassword = shift;\nmy $sMessage = shift;\nmy $bReturnOnVerifyError = shift;\n\nmy @aBindArgs;\nmy $mesg;\n\nif( $sBindBase ne "" )\n {\n push( @aBindArgs, dn => $sBindBase ) ;\n }\nif( $sBindPassword ne "" )\n {\n push( @aBindArgs, password => $sBindPassword );\n }\nif( $m_sLDAPVersion ne "" )\n {\n push( @aBindArgs, version => $m_sLDAPVersion );\n }\n\n$mesg = $m_hLDAP->bind( @aBindArgs ) ||\n systemError("Failed to bind args=dn $sBindBase version $m_sLDAPVersion");\n\nif( $m_bVerbose )\n {\n print "Bindargs = @aBindArgs\sn";\n }\n\nif( $mesg->code() )\n {\n if( $bReturnOnVerifyError )\n {\n return( 0 );\n }\n else\n {\n verifyError( "$sMessage:bind failed:mesg=" .\n "(". $mesg->code() . "),args=dn $sBindBase version $m_sLDAPVersion" );\n exit( 0 );\n }\n }\nif( $m_bVerbose )\n {\n print "Bind succeeded\sn";\n }\nreturn( 1 );\n}\n\n#------------------------------------------------------------\n# performs a search, if the count is not 1 and there exists\n# a fallback search method try that.\n#------------------------------------------------------------\n\nsub doSearch\n{\nmy @aSearchArgs;\n\npush( @aSearchArgs, base => $m_sSearchBase[$m_whichServer] );\nmy $sFilter = "$m_sSearchAttribute[$m_whichServer]=$m_sUserId";\npush( @aSearchArgs, filter => "$sFilter" );\n\nalarm $m_nTimeOut;\n\n$m_hSearchMessage = $m_hLDAP->search( @aSearchArgs ) ||\n systemError ("Failed on search args=@aSearchArgs");\n\n\nalarm 0;\n\nif( $m_hSearchMessage->code() )\n {\n verifyError( "search failed mesg=" .\n "(". $m_hSearchMessage->code() . "),args=@aSearchArgs" );\n return 0;\n }\n\nif( $m_bVerbose )\n {\n printf( "Search done: args=@aSearchArgs\sn" );\n }\n\nmy @aList = $m_hSearchMessage->all_entries;\n\nmy $nCount = $#aList + 1;\n\nif( $m_bVerbose ) { print "Search found $nCount matching patrons\sn"; }\n\nreturn $nCount;\n}\n\n#------------------------------------------------------------\nsub checkPassword\n{\nmy $hEntry = shift;\n\nif( $m_bUseLDAPPassword == 0 ) { return 1; }\n\nmy $sVerifyUserName = $m_sUserId;\n\nif( ! doBind( $hEntry->dn(),\n $sVerifyUserName,\n $m_sPassword,\n "Bad password",\n $m_bTryMillenniumAfterBadVerify ) )\n {\n return( 0 );\n }\n\n$m_sLogMessage .= "good password ";\n\nif( $m_bVerbose )\n {\n print "Password check succeeded\sn";\n }\nreturn( 1 );\n}\n\n#------------------------------------------------------------\n# verification has failed log and exit with string Error\n#------------------------------------------------------------\nsub verifyError\n{\nmy $sMessage = shift;\n\n$m_sUserId = "Error"; # this is the string we will return to the webpac\nif( defined $m_hLDAP )\n {\n $m_hLDAP->unbind;\n }\nlogger( $sMessage );\n\nprint "extvererr=$sMessage\sn";\n}\n\n#------------------------------------------------------------\n# log an error message to the syserr file\n#------------------------------------------------------------\nsub logError\n{\nmy $sMessage = shift;\nmy $sSyserr = $m_sIIIDB . "/errlog/syserr";\nif( open( SYSERR, ">>$sSyserr" ) )\n {\n print SYSERR "$sMessage\sn";\n close( SYSERR );\n }\n}\n\n#------------------------------------------------------------\n# log an error message to the syserr file and exit with Error\n#------------------------------------------------------------\nsub systemError\n{\nmy $sMessage = shift;\n\n$m_sUserId = "Error"; # this is the string we will return to the webpac\nif( defined $m_hLDAP )\n {\n $m_hLDAP->unbind;\n }\nlogger( "$sMessage ($!)" );\nlogError( "$sMessage ($!)" );\n\nprint "extsyserr=$sMessage\sn";\nexit 1;\n}\n\n\n#---------------------------------------------------------------\nsub cleanUpAndExit\n{\n$m_hLDAP->unbind; # take down session\nexit 0;\n}\n#---------------------------------------------------------------\n\nsub notFound\n{\nmy $sMessage = shift;\n\nif( ! defined( $sMessage ) ) { $sMessage = "no message"; }\nprint "extvererr=$sMessage\sn";\ncleanUpAndExit();\n}\n\n#------------------------------------------------------------\n# catches alarm, we set alarm so we don't wait forever for the ldap server\n#------------------------------------------------------------\nsub catchAlarm\n{\nlogError( "Timeout occurred" );\n}\n\n#------------------------------------------------------------\n#\n# main() starts here\n#\n# it is CRITICAL that nothing read stdin that will be done by\n# parseInput after the globals are loaded and a user script\n# has been ruled out\n#\n#------------------------------------------------------------\n$SIG{ALRM} = \s&catchAlarm;\n\nparseInput();\n\n print DEBUG "The userID entered is: $m_sUserId\sn" if ($debug eq "yes");\n\n\n$m_sOriginalUserId = $m_sUserId;\nif( $m_sPassword eq "" )\n {\n verifyError( "password not specified" );\n exit( 0 );\n }\n\nif( $m_sUserId eq "" )\n {\n verifyError( "got empty lookup field" );\n exit( 0 );\n }\n\nif( $m_sServer eq "staff" )\n {\n $m_whichServer = 1;\n }\nelse\n {\n $m_whichServer = 0;\n }\n\nif( ! doConnect() )\n {\n exit 0;\n }\n\nif( $m_bUseOneBind[$m_whichServer] )\n {\n my $sTempUserName = $m_sUserId;\n }\n\n\nif( ! doBind($m_sBindBase[$m_whichServer], $m_sBindUser[$m_whichServer], \n $m_sBindPassword[$m_whichServer] ,"",$m_bUseOneBind[$m_whichServer] ))\n {\n notFound( "no bind" );\n }\n\nmy $nMatchCount = doSearch();\n\nif( $nMatchCount == 0 )\n {\n $m_sLogMessage .= "not on LDAP, ";\n notFound( "not found" );\n }\nelsif( $nMatchCount == 1 )\n {\n $m_sLogMessage .= "on LDAP ";\n\n my @aList = $m_hSearchMessage->all_entries;\n my $hEntry = pop @aList;\n\n if( $m_bVerbose )\n {\n print "Entry dn= " . $hEntry->dn() . "\sn";\n $hEntry->dump;\n }\n\n if( ! $m_bUseOneBind[$m_whichServer] && ! checkPassword( $hEntry ) )\n {\n $m_sLogMessage .= "failed password on LDAP, ";\n notFound( "failed password" );\n }\n else\n {\n my @sID = $hEntry->get_value( $m_sIDAttribute[$m_whichServer] );\n my $sID;\n\n if( ! @sID )\n {\n verifyError("Could not find attribute $m_sIDAttribute[$m_whichServer]");\n notFound( "no attribute" );\n }\n\n $sID = $sID[0];\n if( ! defined( $sID ) || $sID eq "" )\n {\n verifyError("Could not get attribute $m_sIDAttribute[$m_whichServer]");\n notFound( "no attribute" );\n }\n\n $m_sUserId = $sID;\n }\n }\nelse\n {\n $m_sLogMessage .= "many on LDAP ";\n\n verifyError( "$m_sUserId had $nMatchCount matches on LDAP server" );\n }\n\nlogger( "OK" );\n\nprint "extid=$m_sUserId\sn";\n\ncleanUpAndExit();\n\n1;\n}}}
Powered by [[ZiddlyWiki|http://ziddlywiki.com]]\n
Some of the assorted theories, models, and researchers used to illustrate the characters information seeking behaviors are the following [for the record, some of these are borrowed from outside LIS]:\n\n* Selection of dubious information sources : Elfreda Chatman studied the working poor, women, prisoners and retirees.\n* People prefer informal sources for spur of the moment info needs : Kirsty Williamson, older adults\n* Information sharing within groups (ostracism/exclusion) : Eric Jones, et. al.\n* User's perspective : Carol Kuhlthau\n* Beliefs : Donald Case on J.D. Johnson's model\n* Personal construct theory : George Kelly\n* Preference for attitudinally consistent info amongst those with strongly held beliefs : Laura Brannon, Michael Tagler and Alice Eagly\n* Competency theory : Justin Kruger and David Dunning\n* Overconfidence as indicator of incompetence : Melissa Gross\n* Invitational attitude (as in "new shit") [vs. indicative attitude] : Kelly's personal construct theory\n* Positive attitude : Kuhlthau; and, Eva Jonas, Verena Graupmann and Dieter Frey (dissonance reduction)\n* Openness to experience : Jannica Heinström\n\n[[Mark Lindner about this article|https://scholarworks.iupui.edu/bitstream/handle/1805/2099/new%20shit.pdf?sequence=1]]\n\n
On February 1, 2010 11:35:30 AM EST, brian imported 1 tiddler from\n[[http://kennison.name/notes|http://kennison.name/notes]]:\n<<<\n#[[Adding Value]] - added\n<<<\n\n----\nOn August 18, 2009 4:36:16 PM EDT, brian imported 1 tiddler from\n[[http://kennison.name/notes/|http://kennison.name/notes/]]:\n<<<\n#[[Recursively chmod directories only]] - added\n<<<\n
* http://www.freewebsitetemplates.com/preview/media/ (modern but not too busy)\n* http://www.freewebsitetemplates.com/preview/architecture/\n* http://www.freewebsitetemplates.com/preview/hardwarestore/\n* http://www.freewebsitetemplates.com/preview/template28/ (interesting)\n* http://www.soros.org/initiatives (not great but a possibility)\n\nhttp://www.iriss.org.uk/ (steal this?)
* Digital Libraries Development \n* Tools and Techniques for Managing Digital Repositories \n* Digital Resource Management Strategies \n* Evaluation of Digital Libraries \n* Content Development: Tools and Techniques \n* Cultural Issues of Online Services \n* Technology Issues in Online Services \n* Standards and Specifications for Digital Objects \n* Metadata Standards, Interoperability and Crosswalks \n* Case Studies of Digital Libraries and Institutional Repositories \n* Multilingual Digital Libraries \n* Digital Preservation Strategies \n* Web Retrieval Tools and Strategies \n* User Interface and Patron Interactions Tools \n* Open Source Software Tools for Digital Library Development \n* Open Access Initiatives, Open Access Repositories \n* Open Access for Scholarly Contents \n* Information Management Using Web 2.0/3.0 Technologies \n* Social Networking Tools for Information Services \n* Knowledge Organization Techniques \n* Knowledge Representation Models \n* Emergent Techniques for Search Algorithms and Context Sensitive Indexing \n* Semantic Web Technologies for Knowledge Representation and Management \n* Ontologies and Approaches to Building Ontologies \n
/***\n|''Name:''|~TaggerPlugin|\n|''Version:''|1.0.1 (2006-06-01)|\n|''Source:''|http://tw.lewcid.org//#TaggerPlugin|\n|''Author:''|SaqImtiaz|\n|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|\n|''Documentation:''|[[TaggerPluginDocumentation]]|\n|''Source Code:''|[[TaggerPluginSource]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n***/\n// /%\nconfig.tagger={defaults:{label:"Tags: ",tooltip:"Manage tiddler tags",taglist:"true",excludeTags:"",notags:"tiddler has no tags",aretags:"current tiddler tags:",toggletext:"add tags:"}};config.macros.tagger={};config.macros.tagger.arrow=(document.all?"âÂÅ":"âÂÅž");config.macros.tagger.handler=function(_1,_2,_3,_4,_5,_6){var _7=config.tagger.defaults;var _8=_5.parseParams("tagman",null,true);var _9=((_8[0].label)&&(_8[0].label[0])!=".")?_8[0].label[0]+this.arrow:_7.label+this.arrow;var _a=((_8[0].tooltip)&&(_8[0].tooltip[0])!=".")?_8[0].tooltip[0]:_7.tooltip;var _b=((_8[0].taglist)&&(_8[0].taglist[0])!=".")?_8[0].taglist[0]:_7.taglist;var _c=((_8[0].exclude)&&(_8[0].exclude[0])!=".")?(_8[0].exclude[0]).readBracketedList():_7.excludeTags.readBracketedList();if((_8[0].source)&&(_8[0].source[0])!="."){var _d=_8[0].source[0];}if(_d&&!store.getTiddler(_d)){return false;}var _e=function(e){if(!e){var e=window.event;}var _11=Popup.create(this);var _12=store.getTags();var _13=new Array();for(var i=0;i<_12.length;i++){_13.push(_12[i][0]);}if(_d){var _15=store.getTiddler(_d);_13=_15.tags.sort();}var _16=_6.tags.sort();var _17=function(_18,_19,_1a){var sp=createTiddlyElement(createTiddlyElement(_11,"li"),"span",null,"tagger");var _1c=createTiddlyButton(sp,_18,_1a+" '"+_19+"'",taggerOnToggle,"button","toggleButton");_1c.setAttribute("tiddler",_6.title);_1c.setAttribute("tag",_19);insertSpacer(sp);if(window.createTagButton_orig_mptw){createTagButton_orig_mptw(sp,_19)}else{createTagButton(sp,_19);}};createTiddlyElement(_11,"li",null,"listTitle",(_6.tags.length==0?_7.notags:_7.aretags));for(var t=0;t<_16.length;t++){_17("[x]",_16[t],"remove tag ");}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");if(_b!="false"){createTiddlyElement(_11,"li",null,"listTitle",_7.toggletext);for(var i=0;i<_13.length;i++){if(!_6.tags.contains(_13[i])&&!_c.contains(_13[i])){_17("[ ]",_13[i],"add tag ");}}createTiddlyElement(createTiddlyElement(_11,"li"),"hr");}var _1f=createTiddlyButton(createTiddlyElement(_11,"li"),("Create new tag"),null,taggerOnToggle);_1f.setAttribute("tiddler",_6.title);if(_d){_1f.setAttribute("source",_d);}Popup.show(_11,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};createTiddlyButton(_1,_9,_a,_e,"button","taggerDrpBtn");};window.taggerOnToggle=function(e){var tag=this.getAttribute("tag");var _22=this.getAttribute("tiddler");var _23=store.getTiddler(_22);if(!tag){var _24=prompt("Enter new tag:","");if(_24!=""&&_24!=null){var tag=_24;if(this.getAttribute("source")){var _26=store.getTiddler(this.getAttribute("source"));_26.tags.pushUnique(_24);}}else{return false;}}if(!_23||!_23.tags){store.saveTiddler(_22,_22,"",config.options.txtUserName,new Date(),tag);}else{if(_23.tags.find(tag)==null){_23.tags.push(tag);}else{if(!_24){_23.tags.splice(_23.tags.find(tag),1);}}store.saveTiddler(_23.title,_23.title,_23.text,_23.modifier,_23.modified,_23.tags);}story.refreshTiddler(_22,null,true);if(config.options.chkAutoSave){saveChanges();}return false;};setStylesheet(".tagger a.button {font-weight: bold;display:inline; padding:0px;}\sn"+".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\sn"+"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\sn"+".popup .listTitle {color:#000;}\sn"+"","TaggerStyles");window.lewcidTiddlerSwapTag=function(_27,_28,_29){for(var i=0;i<_27.tags.length;i++){if(_27.tags[i]==_28){_27.tags[i]=_29;return true;}}return false;};window.lewcidRenameTag=function(e){var tag=this.getAttribute("tag");var _2d=prompt("Rename tag '"+tag+"' to:",tag);if((_2d==tag)||(_2d==null)){return false;}if(store.tiddlerExists(_2d)){if(confirm(config.messages.overwriteWarning.format([_2d.toString()]))){story.closeTiddler(_2d,false,false);}else{return null;}}tagged=store.getTaggedTiddlers(tag);if(tagged.length!=0){for(var j=0;j<tagged.length;j++){lewcidTiddlerSwapTag(tagged[j],tag,_2d);}}if(store.tiddlerExists(tag)){store.saveTiddler(tag,_2d);}if(document.getElementById("tiddler"+tag)){var _2f=document.getElementById(story.idPrefix+tag);var _30=story.positionTiddler(_2f);var _31=document.getElementById(story.container);story.closeTiddler(tag,false,false);story.createTiddler(_31,_30,_2d,null);story.saveTiddler(_2d);}if(config.options.chkAutoSave){saveChanges();}return false;};window.onClickTag=function(e){if(!e){var e=window.event;}var _34=resolveTarget(e);var _35=(!isNested(_34));if((Popup.stack.length>1)&&(_35==true)){Popup.removeFrom(1);}else{if(Popup.stack.length>0&&_35==false){Popup.removeFrom(0);}}var _36=(_35==false)?"popup":"nestedtagger";var _37=createTiddlyElement(document.body,"ol",_36,"popup",null);Popup.stack.push({root:this,popup:_37});var tag=this.getAttribute("tag");var _39=this.getAttribute("tiddler");if(_37&&tag){var _3a=store.getTaggedTiddlers(tag);var _3b=[];var li,r;for(r=0;r<_3a.length;r++){if(_3a[r].title!=_39){_3b.push(_3a[r].title);}}var _3d=config.views.wikified.tag;if(_3b.length>0){var _3e=createTiddlyButton(createTiddlyElement(_37,"li"),_3d.openAllText.format([tag]),_3d.openAllTooltip,onClickTagOpenAll);_3e.setAttribute("tag",tag);createTiddlyElement(createTiddlyElement(_37,"li"),"hr");for(r=0;r<_3b.length;r++){createTiddlyLink(createTiddlyElement(_37,"li"),_3b[r],true);}}else{createTiddlyText(createTiddlyElement(_37,"li",null,"disabled"),_3d.popupNone.format([tag]));}createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var h=createTiddlyLink(createTiddlyElement(_37,"li"),tag,false);createTiddlyText(h,_3d.openTag.format([tag]));createTiddlyElement(createTiddlyElement(_37,"li"),"hr");var _40=createTiddlyButton(createTiddlyElement(_37,"li"),("Rename tag '"+tag+"'"),null,lewcidRenameTag);_40.setAttribute("tag",tag);}Popup.show(_37,false);e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation();}return (false);};if(!window.isNested){window.isNested=function(e){while(e!=null){var _42=document.getElementById("contentWrapper");if(_42==e){return true;}e=e.parentNode;}return false;};}config.shadowTiddlers.TaggerPluginDocumentation="The documentation is available [[here.|http://tw.lewcid.org/#TaggerPluginDocumentation]]";config.shadowTiddlers.TaggerPluginSource="The uncompressed source code is available [[here.|http://tw.lewcid.org/#TaggerPluginSource]]";\n// %/
<<option chkRegExpSearch>> ~RegExp Search\n<<option chkCaseSensitiveSearch>> Case sensitive search\n<<option chkAnimate>> Enable animations\n<<option chkOpenInNewWindow>> Open links in new window\n<<option chkToggleLinks>> Links close open tiddlers\n<<option chkConfirmDelete>> Confirm before deleting\n<<option chkForceMinorUpdate>> Preserve date/time on edit\n<<option chkInsertTabs>> Insert tab characters\n<<option txtMaxEditRows>> Maximum editor rows\n----\nPluginManager\n
{{{\n<?xml version="1.0"?>\n<!--*******************************************************************************************************************************************-->\n<!-- FOXML REFERENCE EXAMPLE OBJECT: --> <!-- This is an example\nof a FOXML encoded digital object as it would appear in the Fedora\npersistent storage area. -->\n<!--*******************************************************************************************************************************************-->\n<!-- The digitalObject root element contains the object PID, which\nuniquely identifies the Fedora object -->\n<!--*******************************************************************************************************************************************-->\n<foxml:digitalObject xmlns:foxml="info:fedora/fedora-system:def/foxml#"\nxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" PID="demo:999"\nxsi:schemaLocation="info:fedora/fedora-system:def/foxml#\nhttp://www.fedora.info/definitions/1/0/foxml1-0.xsd">\n <!---***************************************************************************************************************************************\n FEDORA OBJECT PROPERTIES : non-versionable properties of the\n digital object At ingest, the object MUST have these attributes:\n - type:(required) The object is classified as one of three\n primitive Fedora object types,\n namely FedoraObject, FedoraBDefObject, or FedoraBMechObject\n - state:(required) The object state can be Active (A),\n Inactive (I), or Deleted (D)\n\n And at ingest, it may have these optional attributes:\n - label: (optional) The object is given a user-defined\n descriptive label. - contentModel: (optional) The object\n is given user-defined content model identifier\n (to classify the pattern of\n datastreams and disseminations\n found in this object).\n\n The system will automatically assign these attributes (they\n should not be put in the ingest files, but they appear in stored\n files):\n - createdDate: (system assigned) The object creation date\n is assigned to the millisecond. - lastModifiedDate:(system\n assigned) The object creation date is assigned to the\n millisecond.\n******************************************************************************************************************************************-->\n <foxml:objectProperties>\n <foxml:property NAME="http://www.w3.org/1999/02/22-rdf-syntax-ns#type"\n VALUE="FedoraObject"/> <foxml:property\n NAME="info:fedora/fedora-system:def/model#state" VALUE="A"/>\n <foxml:property NAME="info:fedora/fedora-system:def/model#label"\n VALUE="FOXML Reference Example"/> <foxml:property\n NAME="info:fedora/fedora-system:def/model#contentModel"\n VALUE="TEST_IMAGE"/> <foxml:property\n NAME="info:fedora/fedora-system:def/model#createdDate"\n VALUE="2004-12-10T00:21:58.000Z"/> <foxml:property\n NAME="info:fedora/fedora-system:def/view#lastModifiedDate"\n VALUE="2005-01-20T22:46:07.506Z"/> <!-- EXTENSIBLE OBJECT\n PROPERTIES --> <!-- These are optional, user-defined object\n properties, for example an OAI identifier for the object. -->\n <!-- Fedora will store these, but it will not recognize them\n or operate on them. --> <foxml:extproperty\n NAME="http://www.openarchives.org/OAI/1.1/oai-identifier.xsd"\n VALUE="oai:cornell.edu:demo:999"/>\n </foxml:objectProperties>\n <!--*******************************************************************************************************************************************\n FEDORA RESERVED DATASTREAM: DUBLIN CORE METADATA FOR OBJECT:\n This datastream is always recognized by Fedora by the\n reserved datastream identifier of "DC".\n Fedora will automatically index the DC datastream as part\n of the default repository catalog search,\n and also as part of the new RDF-based Resource Index.\n *********************************************************************************************************************************************-->\n <foxml:datastream ID="DC" STATE="A" CONTROL_GROUP="X" VERSIONABLE="true">\n <foxml:datastreamVersion ID="DC.0" MIMETYPE="text/xml"\n LABEL="Default Dublin Core Record" SIZE="488"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:xmlContent>\n <oai_dc:dc\n xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"\n xmlns:dc="http://purl.org/dc/elements/1.1/">\n <dc:title>FOXML Reference Object</dc:title> <dc:creator>Sandy\n Payette</dc:creator> <dc:subject>Fedora\n documentation</dc:subject> <dc:description>FOXML showing\n how a digital object is encoded for persistent storage\n in a Fedora repository</dc:description> <dc:publisher>Cornell\n CIS</dc:publisher> <dc:identifier>demo:999</dc:identifier>\n </oai_dc:dc>\n </foxml:xmlContent>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--*******************************************************************************************************************************************\n FEDORA RESERVED DATASTREAM: OBJECT-TO-OBJECT RELATIONSHIPS\n This datastream is always recognized by Fedora by the\n reserved datastream identifier of "RELS-EXT". The RELS-EXT\n datastream is used to make assertions about the relationship\n of this digital object to other digital objects. Assertions\n are made in RDF. Relationships can be asserted from the\n default Fedora relationship namespace or other namespaces.\n Fedora will automatically index this datastream as part of\n the new RDF-based Resource Index. The RELS-EXT datastream\n is validated by Fedora.\n *************************************************************************************************************************************************\n See the RDF Schema for the default Fedora relationships at:\n http://www.fedora.info/definitions/1/0/fedora-rels.rdfs See\n the "Fedora Relationship Metadata Guide" in the system\n documentation for specific constraints and syntax rules.\n *************************************************************************************************************************************************\n Below, the RDF <Description> element declares that the\n asserted relationships are about "this" digital object since\n its rdf:about attribute points to the Fedora URI for this\n object. (Fedora URIs are PIDs prepended with "info:fedora/").\n See system documentation for more information about Fedora\n URIs. Below, there are two relationships from the fedora\n namespace to indicate that this object is a member of two\n different collections. For each relationship assertion, the\n rdf:resource attribute must contain the URI of another\n Fedora object that this object is related to. For example,\n there exists a Fedora object known as\n "info:fedora/test:collection1" that represents a specific\n collection.\n *******************************************************************************************************************************************-->\n <foxml:datastream ID="RELS-EXT" CONTROL_GROUP="X">\n <foxml:datastreamVersion ID="RELS-EXT.0" MIMETYPE="text/xml"\n LABEL="Fedora Object-to-Object Relationship Metadata" SIZE="752"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:xmlContent>\n <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\n xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"\n xmlns:fedora="info:fedora/fedora-system:def/relations-external#"\n xmlns:myns="http://www.nsdl.org/ontologies/relationships#"\n xmlns:dc="http://purl.org/dc/elements/1.1/"\n xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/">\n <rdf:Description rdf:about="info:fedora/demo:999">\n <!-- This object ("info:fedora/demo:999") is a member\n of Collection #1 (info:fedora/test:collection1) -->\n <fedora:isMemberOfCollection\n rdf:resource="info:fedora/test:collection1"/> <!-- ...\n and it is also a member of Collection #2\n (info:fedora/test:collection2) --> <fedora:isMemberOfCollection\n rdf:resource="info:fedora/test:collection2"/> <!-- You\n can also make your own relationship assertions in your\n own namespace...--> <myns:isPartOf\n rdf:resource="info:fedora/mystuff:100"/>\n </rdf:Description>\n </rdf:RDF>\n </foxml:xmlContent>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--**************************************************************************************************************************************\n DATASTREAMS (notice the four different kinds of datastreams\n supported by Fedora)\n *******************************************************************************************************************************************\n Notice that Fedora will automatically keep track of different\n versions of a datastream. Datastreams are versioned whenever\n modifications are made via API-M\n\n At ingest, each datastream MUST have following attributes:\n - ID (required) a unique identifier\n for the datastream within this object. User can provide\n it,\n or if not provided, the system will\n assign one.\n - STATE (Required) The datastream state can be\n Active (A), Inactive (I), or Deleted (D) - CONTROL_GROUP\n (required) indicates the kind of datastream, either\n Externally Referenced Content (E),\n Redirected Content (R), Managed\n Content (M) or Inline XML (X)\n - MIME (required per version) user-assigned\n MIME type of the bytestream referred to by the\n contentLocation URL\n\n And at ingest, it may have these optional attributes:\n - LABEL (optional per version) user-assigned\n descriptive label for the datastream - ALT_IDS\n (optional per version) user-assigned set of alternative\n identifiers for the datastream,\n with the identifiers separated by\n spaces\n - FORMAT_URI (optional per version) user-assigned\n URI used to identify the media type of the bytestream\n referred to by the contentLocation\n URL (more specific than MIME type)\n - SIZE (optional per version) size of the\n bytestream referred to by the contentLocation.\n User can provide it, or Fedora can\n be configured to calculate it.\n\n The system will assign these attributes (they should not\n be put in the ingest file):\n - VERSIONABLE (system-assigned) a true/false\n indication as to whether the datastream should\n be versioned by the Fedora repository\n service. In Fedora 2.0, all\n datastreams are set to VERSIONABLE="true".\n In a future release, selective\n datastream versioning will be enabled\n and this attribute can then be\n user-assigned.\n - CREATED (system-assigned per version)\n creation date for the datastream version, to the\n millisecond\n *******************************************************************************************************************************************\n DATASTREAM (E): This datastream demonstrates "Externally\n Referenced Content" (see attribute CONTROL_GROUP=E). The\n contentLocation element points to content on a external web\n server (meaning the content is not under the custodianship\n of the Fedora repository). When repository access requests\n are made for this datastream, the content bytestream will\n be mediated by the Fedora repository service, meaning that\n Fedora will get the content and return it to the client.\n The client will not be aware of the true URL of the content.\n Notice that the datastream\n *******************************************************************************************************************************************-->\n <foxml:datastream CONTROL_GROUP="E" ID="IMAGE" STATE="A"\n VERSIONABLE="true">\n <foxml:datastreamVersion ID="IMAGE.0" MIMETYPE="image/x-mrsid-image"\n LABEL="Image of Pavilion III, University of Virginia"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:contentLocation\n REF="http://iris.lib.virginia.edu/mrsid/mrsid_images/iva/archerp01.sid"\n TYPE="URL"/>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--*******************************************************************************************************************************************\n DATASTREAM (R): This datastream demonstrates "Redirected\n Referenced Content" (see attribute CONTROL_GROUP=R). Like\n the E datastream above, the contentLocation points to content\n on a external web server. However, in this case, when\n repository access requests are made for this datastream,\n the repository will redirect the client to this URL, and\n will not mediate the streaming of the content. This is\n particularly useful when the content is a streaming media\n file, or for complex, animated web pages where streaming\n through the Fedora server may cause lossiness. (The .jpg\n image is not a great motivating example of the "R" datastream,\n but it just used in this example.)\n *******************************************************************************************************************************************-->\n <foxml:datastream CONTROL_GROUP="R" ID="DRAWING-BEST" STATE="A"\n VERSIONABLE="true">\n <foxml:datastreamVersion ID="DRAWING-BEST.0" MIMETYPE="image/jpeg"\n LABEL="Architectural Drawing Pavilion III (veryhigh res)"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:contentLocation\n REF="http://icarus.lib.virginia.edu/images/iva/archerd05high.jpg"\n TYPE="URL"/>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--*******************************************************************************************************************************************\n DATASTREAM (M): This datastream demonstrates "Managed\n Content" (see attribute CONTROL_GROUP=M). This is an\n example of a datastream whose content bytestream is under\n the direct custodianship of the Fedora repository. Notice\n that the contentLocation points to an internal identifier\n instead of a URL. The content is actually stored in the\n repository's persistent storage area. When Fedora access\n requests are made for this datastream, the repository service\n retrieves the content from its own persistent storage area.\n\n It is worth noting that prior to iingest into the repository,\n this datastream was specified with a contentLocation URL\n pointing to an external source. You can see this contentLocation\n URLs commented out below. Since this datastream is marked\n as CONTROL_GROUP=M, the repository service must store the\n bytestream inside the repository. Therefore, when this\n object was ingested, the Fedora repository service called\n back to this URL to obtain the content for local storage.\n Once the content was stored, the orignial URL was replaced\n with the Fedora internal identifier depicted below. See\n the "Fedora Ingest and Export Guide" in the system documentation\n for more details on encoding ingest files.\n *******************************************************************************************************************************************-->\n <foxml:datastream CONTROL_GROUP="M" ID="DRAWING-BETTER" STATE="A"\n VERSIONABLE="true">\n <foxml:datastreamVersion ID="DRAWING-BETTER.0" MIMETYPE="image/jpeg"\n LABEL="Architectural Drawing Pavilion III (med res)"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:contentLocation\n REF="http://icarus.lib.virginia.edu/images/iva/archerd05medium1.jpg"\n TYPE="URL"/> <!-- <foxml:contentLocation\n REF="demo:999+DRAWING-BETTER+DRAWING-BETTER.0" TYPE="INTERNAL_ID"/>\n -->\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--*******************************************************************************************************************************************\n DATASTREAM (M): (with multiple versions) This datastream\n also demonstrates "Managed Content" (see attribute\n CONTROL_GROUP=M).\n\n Notice in the example below the datastream has two versions.\n In the second version the datastream label was changed and\n an alternate identifier was added. Fedora access requests\n can be given date-time stamps to retrieve the appropriate\n version.\n *******************************************************************************************************************************************-->\n <foxml:datastream CONTROL_GROUP="M" ID="DRAWING-ICON" STATE="A"\n VERSIONABLE="true">\n <foxml:datastreamVersion ID="DRAWING-ICON.0" MIMETYPE="image/jpeg"\n LABEL="Architectural Drawing Pavilion III"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:contentLocation\n REF="http://icarus.lib.virginia.edu/images/iva/archerd05small.jpg"\n TYPE="URL"/>\n </foxml:datastreamVersion> <foxml:datastreamVersion ID="DRAWING-ICON.1"\n MIMETYPE="image/jpeg" LABEL="Architectural Drawing Pavilion III\n (thumbnail icon)" ALT_IDS="doi:10.1234/123"\n CREATED="2005-01-20T22:46:07.428Z">\n <foxml:contentLocation\n REF="http://icarus.lib.virginia.edu/images/iva/archerd05small.jpg"\n TYPE="URL"/>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--*******************************************************************************************************************************************\n DATASTREAM (X): This datastream demonstrates "Inlined XML\n Content" (see attribute CONTROL_GROUP=X). This type of\n datastream is used when it is desirable to have XML content\n "inlined" within the digital object XML wrapper itself.\n Notice that there is no contentLocation element pointing\n to a content URL; instead there is a block of XML wrapped\n by the <xmlContent> element.\n **********************************************************************************************************************************************-->\n <foxml:datastream ID="UVATECH" STATE="A" CONTROL_GROUP="X"\n VERSIONABLE="true">\n <foxml:datastreamVersion ID="UVATECH.0" MIMETYPE="text/xml"\n FORMAT_URI="info:fedora/format:xml:uvalibadmin" LABEL="UVA\n Technical Metadata Record" SIZE="556"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:xmlContent>\n <uvalibadmin:admin\n xmlns:uvalibadmin="http://virginia.lib.edu/uvalibadmin:tech">\n <uvalibadmin:technical>\n <uvalibadmin:format>image/jpeg</uvalibadmin:format>\n <uvalibadmin:compression>LZW</uvalibadmin:compression>\n <uvalibadmin:bitDepth BITS=""/> <uvalibadmin:colorSpace/>\n <uvalibadmin:colorProfile CPLOCAT="" CPFILE=""/>\n <uvalibadmin:resolution>600</uvalibadmin:resolution>\n </uvalibadmin:technical>\n </uvalibadmin:admin>\n </foxml:xmlContent>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--*******************************************************************************************************************************************\n EXPERIMENTAL DATASTREAM: FEDORA RESERVED DATASTREAM FOR\n INNER OBJECT RELATIONSHIP METADATA This datastream demonstrates\n datastream-to-datastream relationships in this object,\n expressed as RDF. The sample datastream shows how to assert\n that the "UVATECH" datastream is metadata about the "DRAWING"\n datastream. Unlike the RELS-EXT datastream, the RDF is NOT\n validated by Fedora (since RELS-INT is still experimental).\n Clients can provide a RELS-INT datastream if they want one,\n but the Fedora repository will not operate on it at this\n time.\n *******************************************************************************************************************************************-->\n <foxml:datastream ID="RELS-INT" STATE="A" CONTROL_GROUP="X"\n VERSIONABLE="false">\n <foxml:datastreamVersion ID="RELS-INT.0" MIMETYPE="text/xml"\n LABEL="Fedora Internal Object Relationship Metadata"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:xmlContent>\n <!-- Note: it is up to the object owner to ensure that\n these relationships are maintained as the object changes.-->\n <!-- Fedora does not ensure referential integrity of RELS-INT\n assertions at this time. --> <rdf:RDF\n xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\n xmlns:relsint="info:fedora/fedora-system:def/relations-internal#"\n xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">\n <relsint:Datastream rdf:about="info:fedora/demo:999/UVATECH">\n <relsint:adminMetadataFor\n rdf:resource="info:fedora/demo:999/DRAWING"/>\n </relsint:Datastream>\n </rdf:RDF>\n </foxml:xmlContent>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!--*******************************************************************************************************************************************\n SYSTEM-CONTROLLED AUDIT TRAIL DATASTREAM The Fedora repository\n system will automatically create an audit trail of changes\n made to the digital object. An audit record will be added\n for each API-M operation that changes the object.\n The system creates and updates this special audit trail\n datastream and prevents any client from modifying it.\n *******************************************************************************************************************************************-->\n <foxml:datastream CONTROL_GROUP="X" ID="AUDIT" STATE="A"\n VERSIONABLE="false">\n <foxml:datastreamVersion CREATED="2004-12-10T00:21:58.000Z"\n FORMAT_URI="info:fedora/fedora-system:format/xml.fedora.audit"\n ID="AUDIT.0" LABEL="Fedora Object Audit Trail" MIMETYPE="text/xml">\n <foxml:xmlContent>\n <audit:auditTrail\n xmlns:audit="info:fedora/fedora-system:def/audit#">\n <audit:record ID="AUDREC1"><audit:process type="Fedora\n API-M"/><audit:action>modifyDatastreamByReference</audit:action><audit:componentID>DRAWING-ICON</audit:componentID><audit:responsibility>fedoraAdmin</audit:responsibility><audit:date>2005-01-20T22:46:07.428Z</audit:date><audit:justification>changed\n the datastream label and added an alternate\n identifier.</audit:justification>/>\n </audit:record>\n </audit:auditTrail>\n </foxml:xmlContent>\n </foxml:datastreamVersion>\n </foxml:datastream>\n <!---******************************************************************************************************************************************\n CUSTOM DISSEMINATORS: Note that the Fedora repository system\n provides a default disseminator for each object. The default\n disseminator is dynamically associated with every object,\n thus it does not appear explicitly in the FOXML encoding\n of the object. The <disseminator> element is used to\n specifying special-purpose disseminators that extend the\n object's default access points. See the Fedora system\n documenation for a full discussion of Disseminators and\n their utility.\n\n At ingest, each Disseminator MUST have following attributes:\n - ID (required) a unique identifier\n for the disseminatoar within this object. User can\n provide it,\n or if not provided, the system\n will assign one.\n - BDEF_CONTRACT_PID (required) - STATE (required)\n The datastream state can be Active (A), Inactive (I),\n or Deleted (D) - BMECH_SERVICE_PID (required per\n version)\n\n And, at ingest, it must have a serviceInputMap element to\n define one or more datastreams inputs to the BMECH service:\n - DATASTREAM_ID (required) the unique identifier of a\n datastream that should be an input parm to the service\n - KEY (required) the input parm name\n that the datastream should be associated with.\n (The name of this key is defined\n in the object named by the\n BMECH_SERVICE_PID.)\n - LABEL (optional) a label to describe the\n nature of the input binding - ORDER (optional)\n if there are multiple datastream inputs defined, and\n they have an intrinsic order,\n then this contains an integer\n indicating sequence number.\n\n The system will assign these attributes (they should not\n be put in the ingest file):\n - VERSIONABLE (system-assigned) true/false\n indication as to whether the datastream should be\n versioned by\n the Fedora repository service. In\n Fedora 2.0, all datastreams are set\n to VERSIONABLE="true". In a future\n release, selective datastream\n versioning will be enabled and this\n attribute can then be user-assigned.\n - CREATED (system-assigned per version)\n creation date for the datastream version, to the\n millisecond\n *******************************************************************************************************************************************\n\n DISSEMINATOR 1: Provides "virtual representations" of this\n object. A virtual representation of an object is a view\n of the object that is created by a service operation. In\n this case, different renditions of the IMAGE datastream of\n this object can be obtained at runtime by via the operations\n defined by this disseminator.\n\n Note that on the disseminator, the BDEF_CONTRACT_PID attribute\n is used to identify the desired set of extended operations\n to produce virtual representations of this object at runtime\n (requested via API-A and API-A-LITE). These operations\n have abstract definitions that are stored in a special\n Fedora digital object (in this case a FedoraBDefObject known\n as demo:8). So, the set of extended operations that produce\n "virtual representations" get associated with this digital\n object in a by-reference manner. Naming a BDEF_CONTRACT_PID\n on a disseminator is analogous to identifying a particular\n abstract service interface to be associated with this digital\n object.\n\n The BMECH_SERVICE_PID attribute (on the disseminatorVersion\n element) is used to identify a specific service that runs\n the abstract operations of the BDEF_CONTRACT_PID. The\n service binding information is stored in a special Fedora\n digital object (in this case a FedoraBMechObject know\n as demo:9). The service binding information is specified\n using the Web Service Description Language (WSDL), which\n the Fedora repository services uses to figure out how to\n dispatch requests to an external web service that will\n produce the dynamic views of this digital object. The\n BMECH_SERVICE_PID is kind of like identifying a particular\n implementation of an abstract interface.\n\n Note that the BMECH_SERVICE_PID attribute is at the\n disseminatorVersion level. This means you could modify a\n disseminator to point to a different service implementation\n (i.e., represented by a different BMECH_SERVICE_PID), and\n this information would be captured in a new version of this\n disseminator. Both versions would implement the same BDEF\n contract. A change to the BMECH_SERVICE_PID essentially\n means that the repository will use a "new" implementation\n of the service that implements the BDEF contract. Below,\n a new disseminator version is depicted below, but it is\n commented out since the new service implementation is\n hypothetical ("i.e., newservice:100").\n *******************************************************************************************************************************************-->\n <foxml:disseminator ID="DISS1" BDEF_CONTRACT_PID="demo:8" STATE="A"\n VERSIONABLE="true">\n <foxml:disseminatorVersion ID="DISS1.0" BMECH_SERVICE_PID="demo:9"\n LABEL="Disseminator to provide dynamic views of a MRSID image"\n CREATED="2004-12-10T00:21:58.000Z">\n <foxml:serviceInputMap>\n <foxml:datastreamBinding DATASTREAM_ID="IMAGE" KEY="MRSID"\n LABEL="The IMAGE datastream serves as input to the MRSID\n service" ORDER="0"/>\n </foxml:serviceInputMap>\n </foxml:disseminatorVersion> <!--\n <foxml:disseminatorVersion ID="DISS1.1"\n BMECH_SERVICE_PID="newservice:100" LABEL="Disseminator with\n a better MRSID service" CREATED="2005-01-20T22:46:08.001Z">\n <foxml:serviceInputMap>\n <foxml:datastreamBinding DATASTREAM_ID="IMAGE"\n KEY="MRSID" LABEL="The IMAGE datastream serves as\n input to the MRSID service" ORDER="0"/>\n </foxml:serviceInputMap>\n </foxml:disseminatorVersion> -->\n </foxml:disseminator>\n</foxml:digitalObject>\n}}}
/%RGB hexadecimal 216-color "Web safe" palette %/\nSource: Paul Petterson, revised by Eric Shulman\n{{menubox{\n|bgcolor(#FFF):FFF |bgcolor(#CCC):CCC |bgcolor(#999):999 |bgcolor(#666):@@color(white):666@@ |bgcolor(#333):@@color(white):333@@ |bgcolor(#000):@@color(white):000@@ |bgcolor(#FC0):~FC0 |bgcolor(#F90):F90 |bgcolor(#F60):@@color(white):F60@@ |bgcolor(#F30):@@color(white):F30@@ |>|>|>|>|>| |\n|bgcolor(#9C0):9C0 |>|>|>| |bgcolor(#C90):C90 |bgcolor(#FC3):~FC3 |bgcolor(#FC6):~FC6 |bgcolor(#F96):F96 |bgcolor(#F63):@@color(white):F63@@ |bgcolor(#C30):@@color(white):C30@@ |>|>|>| |bgcolor(#C03):@@color(white):C03@@ |\n|bgcolor(#CF0):~CF0 |bgcolor(#CF3):~CF3 |bgcolor(#330):@@color(white):330@@ |bgcolor(#660):@@color(white):660@@ |bgcolor(#990):990 |bgcolor(#CC0):~CC0 |bgcolor(#FF0):~FF0 |bgcolor(#C93):C93 |bgcolor(#C63):@@color(white):C63@@ |bgcolor(#300):@@color(white):300@@ |bgcolor(#600):@@color(white):600@@ |bgcolor(#900):@@color(white):900@@ |bgcolor(#C00):@@color(white):C00@@ |bgcolor(#F00):@@color(white):F00@@ |bgcolor(#F36):@@color(white):F36@@ |bgcolor(#F03):@@color(white):F03@@ |\n|bgcolor(#9F0):9F0 |bgcolor(#CF6):~CF6 |bgcolor(#9C3):9C3 |bgcolor(#663):@@color(white):663@@ |bgcolor(#993):993 |bgcolor(#CC3):~CC3 |bgcolor(#FF3):~FF3 |bgcolor(#960):@@color(white):960@@ |bgcolor(#930):@@color(white):930@@ |bgcolor(#633):@@color(white):633@@ |bgcolor(#933):@@color(white):933@@ |bgcolor(#C33):@@color(white):C33@@ |bgcolor(#F33):@@color(white):F33@@ |bgcolor(#C36):@@color(white):C36@@ |bgcolor(#F69):@@color(white):F69@@ |bgcolor(#F06):@@color(white):F06@@ |\n|bgcolor(#6F0):6F0 |bgcolor(#9F6):9F6 |bgcolor(#6C3):6C3 |bgcolor(#690):690 |bgcolor(#996):996 |bgcolor(#CC6):~CC6 |bgcolor(#FF6):~FF6 |bgcolor(#963):@@color(white):963@@ |bgcolor(#630):@@color(white):630@@ |bgcolor(#966):@@color(white):966@@ |bgcolor(#C66):@@color(white):C66@@ |bgcolor(#F66):@@color(white):F66@@ |bgcolor(#903):@@color(white):903@@ |bgcolor(#C39):@@color(white):C39@@ |bgcolor(#F6C):@@color(white):~F6C@@ |bgcolor(#F09):@@color(white):F09@@ |\n|bgcolor(#3F0):3F0 |bgcolor(#6F3):6F3 |bgcolor(#390):390 |bgcolor(#6C0):6C0 |bgcolor(#9F3):9F3 |bgcolor(#CC9):~CC9 |bgcolor(#FF9):~FF9 |bgcolor(#C96):C96 |bgcolor(#C60):@@color(white):C60@@ |bgcolor(#C99):C99 |bgcolor(#F99):F99 |bgcolor(#F39):@@color(white):F39@@ |bgcolor(#C06):@@color(white):C06@@ |bgcolor(#906):@@color(white):906@@ |bgcolor(#F3C):@@color(white):~F3C@@ |bgcolor(#F0C):@@color(white):~F0C@@ |\n|bgcolor(#0C0):0C0 |bgcolor(#3C0):3C0 |bgcolor(#360):@@color(white):360@@ |bgcolor(#693):693 |bgcolor(#9C6):9C6 |bgcolor(#CF9):~CF9 |bgcolor(#FFC):FFC |bgcolor(#FC9):~FC9 |bgcolor(#F93):F93 |bgcolor(#FCC):FCC |bgcolor(#F9C):~F9C |bgcolor(#C69):@@color(white):C69@@ |bgcolor(#936):@@color(white):936@@ |bgcolor(#603):@@color(white):603@@ |bgcolor(#C09):@@color(white):C09@@ |bgcolor(#303):@@color(white):303@@ |\n|bgcolor(#3C3):3C3 |bgcolor(#6C6):6C6 |bgcolor(#0F0):0F0 |bgcolor(#3F3):3F3 |bgcolor(#6F6):6F6 |bgcolor(#9F9):9F9 |bgcolor(#CFC):CFC |>|>| |bgcolor(#C9C):~C9C |bgcolor(#969):@@color(white):969@@ |bgcolor(#939):@@color(white):939@@ |bgcolor(#909):@@color(white):909@@ |bgcolor(#636):@@color(white):636@@ |bgcolor(#606):@@color(white):606@@ |\n|bgcolor(#060):@@color(white):060@@ |bgcolor(#363):@@color(white):363@@ |bgcolor(#090):090 |bgcolor(#393):393 |bgcolor(#696):696 |bgcolor(#9C9):9C9 |>|>| |bgcolor(#FCF):FCF |bgcolor(#F9F):~F9F |bgcolor(#F6F):@@color(white):~F6F@@ |bgcolor(#F3F):@@color(white):~F3F@@ |bgcolor(#F0F):@@color(white):~F0F@@ |bgcolor(#C6C):@@color(white):~C6C@@ |bgcolor(#C3C):@@color(white):~C3C@@ |\n|bgcolor(#030):@@color(white):030@@ |bgcolor(#0C3):0C3 |bgcolor(#063):@@color(white):063@@ |bgcolor(#396):396 |bgcolor(#6C9):6C9 |bgcolor(#9FC):9FC |bgcolor(#CFF):CFF |bgcolor(#39F):39F |bgcolor(#9CF):9CF |bgcolor(#CCF):CCF |bgcolor(#C9F):~C9F |bgcolor(#96C):@@color(white):96C@@ |bgcolor(#639):@@color(white):639@@ |bgcolor(#306):@@color(white):306@@ |bgcolor(#90C):@@color(white):90C@@ |bgcolor(#C0C):@@color(white):~C0C@@ |\n|bgcolor(#0F3):0F3 |bgcolor(#3F6):3F6 |bgcolor(#093):093 |bgcolor(#0C6):0C6 |bgcolor(#3F9):3F9 |bgcolor(#9FF):9FF |bgcolor(#9CC):9CC |bgcolor(#06C):@@color(white):06C@@ |bgcolor(#69C):69C |bgcolor(#99F):99F |bgcolor(#99C):99C |bgcolor(#93F):@@color(white):93F@@ |bgcolor(#60C):@@color(white):60C@@ |bgcolor(#609):@@color(white):609@@ |bgcolor(#C3F):@@color(white):~C3F@@ |bgcolor(#C0F):@@color(white):~C0F@@ |\n|bgcolor(#0F6):0F6 |bgcolor(#6F9):6F9 |bgcolor(#3C6):3C6 |bgcolor(#096):096 |bgcolor(#6FF):6FF |bgcolor(#6CC):6CC |bgcolor(#699):699 |bgcolor(#036):@@color(white):036@@ |bgcolor(#369):@@color(white):369@@ |bgcolor(#66F):@@color(white):66F@@ |bgcolor(#66C):@@color(white):66C@@ |bgcolor(#669):@@color(white):669@@ |bgcolor(#309):@@color(white):309@@ |bgcolor(#93C):@@color(white):93C@@ |bgcolor(#C6F):@@color(white):~C6F@@ |bgcolor(#90F):@@color(white):90F@@ |\n|bgcolor(#0F9):0F9 |bgcolor(#6FC):6FC |bgcolor(#3C9):3C9 |bgcolor(#3FF):3FF |bgcolor(#3CC):3CC |bgcolor(#399):399 |bgcolor(#366):@@color(white):366@@ |bgcolor(#069):@@color(white):069@@ |bgcolor(#039):@@color(white):039@@ |bgcolor(#33F):@@color(white):33F@@ |bgcolor(#33C):@@color(white):33C@@ |bgcolor(#339):@@color(white):339@@ |bgcolor(#336):@@color(white):336@@ |bgcolor(#63C):@@color(white):63C@@ |bgcolor(#96F):@@color(white):96F@@ |bgcolor(#60F):@@color(white):60F@@ |\n|bgcolor(#0FC):0FC |bgcolor(#3FC):3FC |bgcolor(#0FF):0FF |bgcolor(#0CC):0CC |bgcolor(#099):099 |bgcolor(#066):@@color(white):066@@ |bgcolor(#033):@@color(white):033@@ |bgcolor(#39C):39C |bgcolor(#36C):@@color(white):36C@@ |bgcolor(#00F):@@color(white):00F@@ |bgcolor(#00C):@@color(white):00C@@ |bgcolor(#009):@@color(white):009@@ |bgcolor(#006):@@color(white):006@@ |bgcolor(#003):@@color(white):003@@ |bgcolor(#63F):@@color(white):63F@@ |bgcolor(#30F):@@color(white):30F@@ |\n|bgcolor(#0C9):0C9 |>|>|>| |bgcolor(#09C):09C |bgcolor(#3CF):3CF |bgcolor(#6CF):6CF |bgcolor(#69F):69F |bgcolor(#36F):@@color(white):36F@@ |bgcolor(#03C):@@color(white):03C@@ |>|>|>| |bgcolor(#30C):@@color(white):30C@@ |\n|>|>|>|>|>| |bgcolor(#0CF):0CF |bgcolor(#09F):09F |bgcolor(#06F):@@color(white):06F@@ |bgcolor(#03F):@@color(white):03F@@ |>|>|>|>|>| |\n<script>place.lastChild.style.width="95%"</script>}}}
!!!University Perspective\n* Visibility of degree programmes and research output of HE institutions \n* Curriculum design \n* Recruitment and retention of students \n* Efficiency of accreditation \n* Collaboration across departments and institutions through workflows \n* Integration of knowledge capital, cross-curricular initiatives \n* Transparency of data held by educational institutions \n\n!!! Other Issues\n* Course creation and delivery workflows \n* Group formation for learning and teaching activities \n* Critical thinking and argumentation support \n*Personal and group knowledge space construction \n* Assessment, certification and addressing of plagiarism\n\n!!!Collaborative activities \n* Team Building \n* Computer Mediated Discussion \n* Computer Mediated Experimentation \n* Role Play \n* Content Creation \n* Content Annotation \n* Simulation \n* Experiments \n\n!!!T&L activities involving the individual \n* Information Gathering \n* Information Handling \n* Information Publishing \n
!Documentation for TiddlyLightBoxPlugin\n''Credits:''\nThis lightbox implementation is a derivative of Bob Denny's [[DC3.LightBox|http://solo.dc3.com/tw/index.html]] library optimized for a ~TiddlyWiki environment, with an emphasis on ease of use. It also uses some code and ideas from [[LightBox Gone Wild|http://particletree.com/features/lightbox-gone-wild/]] and [[Ibox|http://www.ibegin.com/ibox/]]. For a more feature rich and versatile option, you can't beat the ~DC3 library.\n\n\n''Concept:''\nI needed a light weight lightbox implementation for [[TiddlyThemes|http://tiddlythemes.googlepages.com/index.html]] but none of the existing options fit the bill. The ~DC3 library came closest, so I set out to rewrite it. I believe the result is a quite versatile ~TW plugin. Some of the bells and whistles have been removed though since I find them annoying (animations), and there are some features yet to be implemented, as you can read further on this document. Almost the entire library has been rewritten.\n\n\n''Installation:''\nCopy the TiddlyLightBoxPlugin tiddler to your TW, tag it with systemConfig, save and reload your TW file. You will also need to save [[this|indicator.gif]] 'loading' image to the same folder as your TW. Or you can choose one of many [[here|http://www.ajaxload.info/]]. That's it, you are ready to create some lightboxes!\n\n\n''Usage:''\nThere are 3 macros provide to facilitate setting up macros.\n1. ''{{{<<imagebox>>}}}''\nThe imagebox macro is designed to display images in the lightbox. The usage is very easy. Simply create a text or image link to an image using standard TW syntax, and follow it with {{{<<imagebox>>}}}.\nEg: {{{[img[cactus-thumb.jpg]cactus.jpg]]}}}\n\n[img[cactus-thumb.jpg][cactus.jpg]]<<imagebox>>\n\nLet's try a text link: {{{[[click me|triad.jpg]]<<imagebox>>}}}\n\n[[click me|triad.jpg]]<<imagebox>>\n\nThis macro also accepts some optional parameters in this order:\n2. description text\n3. width ( as a number, like 500)\n4. height (as a number, like 300)\nAlso, if width is passed as a word, like "bananas", then it is treated as a css class and the container for the image is given the class "bananas".\n\nLet's try one more, with a title and a custom size:\n{{{[img[cubicles-thumb.jpg][cubicles.jpg]]<<imagebox 'Office space' 300 300>>}}}\n\n[img[cubicles-thumb.jpg][cubicles.jpg]]<<imagebox 'Office space' 300 300>>\n\n----\n\n2. ''{{{<<divbox>>}}}''\nThe divbox macro lets you put the html content of any inline div into a lightbox, you just need the id of the div in question. The idea being to create a hidden div using "display:none" and then displaying it on the click of a link/button.\nYou can create such a div in any tiddler by wrapping it in html tags, but using the MarkupPostBody tiddler might be the better option.\n\nThe macro can create the button for you, or you can use an existing element to launch the lightbox. To create a button, pass the label for the button as the first parameter. To use an existing element, pass the first parameter as ' ' and place the macro immediately after the element. Eg: {{{<<tiddlerbox label>> or <<tiddlerbox ''>>}}}\n\nThe next parameter is the id of the div to display: {{{<<tiddlerbox label theID>>}}}\nThese two parameters are a must for the divbox macro. There are also 3 more optional parameters, just like the imagebox macro:\n3. description text\n4. width ( as a number, like 500) OR className\n5. height (as a number, like 300)\nAs an example, lets display this hidden div which I have written inline:\n{{{<html><div id="testDiv" style="display:none;"><div style="text-align:center;"> Lightboxes have become very cliche, but they can still be useful!</div></div></html><<divbox "Click to see it" "testDiv" "This is a test div">>}}}\n<html><div id="testDiv" style="display:none;"><div style="text-align:center"><br><br><br><br> Lightboxes have become very cliche, but they can still be useful!</div></div></html><<divbox "Click to see it" "testDiv" "This is a test div">>\n\n----\n\n3.''{{{<<tiddlerbox>>}}}''\nThis macro lets you put the wikified contents of any tiddler into a lightbox! So you can put your MainMenu and Sidebar into a lightbox for example, and have handy links to bring them up whenever you need them. (like in say the hovering menu provided by HoverMenuPlugin). It's also very useful for when you are working on something and want to refer to some reference material without having to loose your place in your work.\nThe parameters for this macro are the same as for the divbox macro, except instead of the id for the div, you use the title of the tiddler.\nLet's give it a go:\n{{{<<tiddlerbox "menu" "MainMenu" "Thats my main menu, and the links work!">>}}}\n<<tiddlerbox "menu" "MainMenu" "Thats my main menu, and the links work!">>\nor\n{{{<<tiddlerbox "menu" "Sidebar" "Thats my sidebar!" 300 500>>}}}\n<<tiddlerbox "sidebar" "Sidebar" "Thats my sidebar!" 300 500>>\n\n-----\n\n''CSS Styling:''\nThe css rules for the lightbox and its contents are in the TiddlyLightBoxStyles folder. You can edit them to your liking, but I recommend not changing the rules for ~lightBoxOverlay and lightboxprogress. But don't worry, if you break anything, just delete the tiddler. It's a shadow tiddler!\n\nI'll post a diagram showing the structure of the lightbox later, to faciliate css styling.\n\n----\n\n''Features comparison with ~DC3Lightbox:''\nMissing:\n* IE transparency filters\n* ability to create own lightbox containers\n*call back functions on closing lightbox\n\nAdded:\n*macros for TW usage\n*optimized for TW environment\n*ability to display Tiddlers in lightboxes\n*preloading of images, to avoid layout problems\n*removed need for manually creating styles tiddler and adding html markup.\n*fixed bug with regards to selects displaying over the lightbox!\n\n----\n\n''To Do''\n* fixed positioning of lightbox so it scrolls with the page!\n*possible light weight animation for images\n* optional preloading of images\n* resizing of images to fit the viewport when larger.\n* optional automatic lightboxing of all links to images.\n*grabbing description from image alt text.\n* improved support for inline html content.\n
Well part of this relates to the key skills we expect our students to have/acquire. These include learning to learn (how to learn), teamwork (working in a group), self-management (managing time and tasks), communication (presentation, written), ICT (using computers/technology) and numeracy (working with numbers). These then feed in to intellectual skills (analysis, synthesis, evaluation, problem solving) and are assessed through essays, exams, MCQs, presentations, reports, projects, groupwork etc.
* AdvancedOptions\n* OptionsPanel
[img[filestore/uploads/webservices/repositories_exchange.png]]\n\nfrom Madison Digital Image Database
{{{\n<?xml version="1.0"?>\n<mets:mets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" \n xmlns:mods="http://www.loc.gov/mods/v3" \n xmlns:xlink="http://www.w3.org/1999/xlink" \n xmlns:mets="http://www.loc.gov/METS/" \n OBJID="oai:eprints.rclis.org:15680" \n LABEL="Eprints Item" \n xsi:schemaLocation="http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/mets.xsd http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd">\n <mets:metsHdr CREATEDATA="2009-02-14T12:20:01Z">\n <mets:agent TYPE="ORGANIZATION" ROLE="CUSTODIAN">\n <mets:name>E-LIS</mets:name>\n </mets:agent>\n </mets:metsHdr>\n <mets:dmdSec ID="DMD_oai:eprints.rclis.org:15680_mods">\n <mets:mdWrap MDTYPE="mods">\n <mets:xmlData>\n <mods:titleInfo>\n <mods:title>Interview on Open Access with Dr. Stevan Harnad</mods:title>\n </mods:titleInfo>\n <mods:name type="personal">\n <mods:namePart type="given">Stephen Michael</mods:namePart>\n <mods:namePart type="family">Kellat</mods:namePart>\n <mods:role>\n <mods:roleTerm type="text">author</mods:roleTerm>\n </mods:role>\n </mods:name>\n <mods:name type="personal">\n <mods:namePart type="given">Stevan</mods:namePart>\n <mods:namePart type="family">Harnad</mods:namePart>\n <mods:role>\n <mods:roleTerm type="text">author</mods:roleTerm>\n </mods:role>\n </mods:name>\n <mods:abstract>In light of the recent Conyers bill that would remove the NIH mandate on Open Access, LISTen (LISNews.org) talked to Dr. Harnad about Open Access so that librarians may learn more about it.</mods:abstract>\n <mods:classification authority="lcc">EB. Printing, electronic publishing, broadcasting.</mods:classification>\n <mods:classification authority="lcc">BD. Information society.</mods:classification>\n <mods:originInfo>\n <mods:dateIssued encoding="iso8061">2009-02-09</mods:dateIssued>\n </mods:originInfo>\n <mods:genre>Other</mods:genre>\n </mets:xmlData>\n </mets:mdWrap>\n </mets:dmdSec>\n <mets:amdSec ID="TMD_oai:eprints.rclis.org:15680">\n <mets:rightsMD ID="rights_oai:eprints.rclis.org:15680_mods">\n <mets:mdWrap MDTYPE="mods">\n <mets:xmlData>\n <mods:useAndReproduction>\n <p><strong>For work being deposited by its own author:</strong> \nIn self-archiving this collection of files and associated bibliographic \nmetadata, I grant E-LIS the right to store \nthem and to make them permanently available publicly for free on-line. \nI declare that this material is my own intellectual property and I \nunderstand that E-LIS does not assume any \nresponsibility if there is any breach of copyright in distributing these \nfiles or metadata. (All authors are urged to prominently assert their \ncopyright on the title page of their work.)</p>\n <p><strong>For work being deposited by someone other than its \nauthor:</strong> I hereby declare that the collection of files and \nassociated bibliographic metadata that I am archiving at \nE-LIS) is in the public domain. If this is \nnot the case, I accept full responsibility for any breach of copyright \nthat distributing these files or metadata may entail.</p>\n <p>Clicking on the deposit button indicates your agreement to these \nterms.</p>\n </mods:useAndReproduction>\n </mets:xmlData>\n </mets:mdWrap>\n </mets:rightsMD>\n </mets:amdSec>\n <mets:fileSec>\n <mets:fileGrp USE="reference">\n <mets:file SIZE="21408105" ID="oai:eprints.rclis.org:15680_11144_1" MIMETYPE="application/octet-stream" OWNERID="http://eprints.rclis.org/15680/1/Stevan_Harnad_Interview.mp3">\n <mets:FLocat LOCTYPE="URL" xlink:href="http://eprints.rclis.org/15680/1/Stevan_Harnad_Interview.mp3" xlink:type="simple"/>\n </mets:file>\n </mets:fileGrp>\n </mets:fileSec>\n <mets:structMap>\n <mets:div DMDID="DMD_oai:eprints.rclis.org:15680_mods" AMDID="TMD_oai:eprints.rclis.org:15680">\n <mets:fptr FILEID="oai:eprints.rclis.org:15680_11144_1"/>\n </mets:div>\n </mets:structMap>\n</mets:mets>\n}}}
Cyber infrastructure\n[img[/filestore/uploads/repositories/escidoc.png]]\n\n!!!Architecture\n* The Basic Layer implements a set of resource handlers. \n* Each resource handler is responsible for handling of a specific type of a resource. Each resource handler service implements the four basic operations create, retrieve, update, and delete (CRUD). Additionally, filter methods and task-oriented methods (e.g., for changing the status of an object within a content repository) are provided.\n* The most important resources are Items, Containers, and Contexts. \n\nItems are basic objects that represent content entities within the repository, e.g. articles, \nimages, or videos. \n\nContainers are aggregation objects that allow for arbitrary \ngrouping of items and other containers. Whereas the general layout of Item \nand Container resources remains the same, they can be further specialized by \ncontent types. Content types impose constraints on objects (e.g. allowed \nmetadata schemas, required metadata, allowed file types and mime types for \nthe binary content and specify a set of content type specific properties).\n\nContexts represent units of administration for a set of Items and Containers. They \nare associated with an institutional body responsible for the management of \nthe content. \n\n\n[[API's and Schemas|https://escidoc.org/JSPWiki/en/ObjectManager#section-ObjectManager-Item]]\n\n[[Metadata Schemas|http://metadata.mpdl.mpg.de/escidoc/metadata/schemas/0.1/]]
config.options.chkTopOfPageMode=true;\nconfig.options.chkSinglePageMode=true;\nchkSinglePagePermalink=true;\n
/***\n|Name|SinglePageModePlugin|\n|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|\n|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|\n|Version|2.9.6|\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|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|\n|Options|##Configuration|\n|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|\nThis plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.\n!!!!!Documentation\n>see [[SinglePageModePluginInfo]]\n!!!!!Configuration\n<<<\n<<option chkSinglePageMode>> Display one tiddler at a time\n><<option chkSinglePagePermalink>> Automatically permalink current tiddler\n><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded\n><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited\n<<option chkTopOfPageMode>> Open tiddlers at the top of the page\n<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page\n<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)\n\nNotes:\n* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.\n* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.\n* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.\n<<<\n!!!!!Revisions\n<<<\n2008.10.17 [2.9.6] changed chkSinglePageAutoScroll default to false\n| Please see [[SinglePageModePluginInfo]] for previous revision details |\n2005.08.15 [1.0.0] Initial Release. Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 6, date: new Date(2008,10,17)};\n//}}}\n//{{{\nconfig.paramifiers.SPM = { onstart: function(v) {\n config.options.chkSinglePageMode=eval(v);\n if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {\n config.lastURL = window.location.hash;\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n} };\n//}}}\n//{{{\nif (config.options.chkSinglePageMode==undefined)\n config.options.chkSinglePageMode=false;\nif (config.options.chkSinglePagePermalink==undefined)\n config.options.chkSinglePagePermalink=true;\nif (config.options.chkSinglePageKeepFoldedTiddlers==undefined)\n config.options.chkSinglePageKeepFoldedTiddlers=false;\nif (config.options.chkSinglePageKeepEditedTiddlers==undefined)\n config.options.chkSinglePageKeepEditedTiddlers=false;\nif (config.options.chkTopOfPageMode==undefined)\n config.options.chkTopOfPageMode=false;\nif (config.options.chkBottomOfPageMode==undefined)\n config.options.chkBottomOfPageMode=false;\nif (config.options.chkSinglePageAutoScroll==undefined)\n config.options.chkSinglePageAutoScroll=false;\n//}}}\n//{{{\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash) return; // no change in hash\n var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();\n if (tids.length==1) // permalink (single tiddler in URL)\n story.displayTiddler(null,tids[0]);\n else { // restore permaview or default view\n config.lastURL = window.location.hash;\n if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();\n story.closeAllTiddlers();\n story.displayTiddlers(null,tids);\n }\n}\n\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined)\n Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)\n{\n var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;\n var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already displayed\n var opt=config.options;\n var single=opt.chkSinglePageMode && !startingUp;\n var top=opt.chkTopOfPageMode && !startingUp;\n var bottom=opt.chkBottomOfPageMode && !startingUp;\n if (single) {\n story.forEachTiddler(function(tid,elem) {\n // skip current tiddler and, optionally, tiddlers that are folded.\n if ( tid==title\n || (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))\n return;\n // if a tiddler is being edited, ask before closing\n if (elem.getAttribute("dirty")=="true") {\n if (opt.chkSinglePageKeepEditedTiddlers) return;\n // if tiddler to be displayed is already shown, then leave active tiddler editor as is\n // (occurs when switching between view and edit modes)\n if (tiddlerElem) return;\n // otherwise, ask for permission\n var msg="'"+tid+"' is currently being edited.\sn\sn";\n msg+="Press OK to save and close this tiddler\snor press Cancel to leave it opened";\n if (!confirm(msg)) return; else story.saveTiddler(tid);\n }\n story.closeTiddler(tid);\n });\n }\n else if (top)\n arguments[0]=null;\n else if (bottom)\n arguments[0]="bottom";\n if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering\n var isTopTiddler=(tiddlerElem.previousSibling==null);\n if (!isTopTiddler && (single || top))\n tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);\n else if (bottom)\n tiddlerElem.parentNode.insertBefore(tiddlerElem,null);\n else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler\n } else\n this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler\n var tiddlerElem=document.getElementById(story.idPrefix+title);\n if (tiddlerElem&&opt.chkSinglePageAutoScroll) {\n // scroll to top of page or top of tiddler\n var isTopTiddler=(tiddlerElem.previousSibling==null);\n var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);\n // if animating, defer scroll until after animation completes\n var delay=opt.chkAnimate?config.animDuration+10:0;\n setTimeout("window.scrollTo(0,"+yPos+")",delay); \n }\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined)\n Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function() {\n // suspend single/top/bottom modes when showing multiple tiddlers\n var opt=config.options;\n var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;\n var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;\n var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;\n this.SPM_coreDisplayTiddlers.apply(this,arguments);\n opt.chkBottomOfPageMode=saveBPM;\n opt.chkTopOfPageMode=saveTPM;\n opt.chkSinglePageMode=saveSPM;\n}\n//}}}
/***\n|Name|ImportTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#ImportTiddlersPlugin|\n|Documentation|http://www.TiddlyTools.com/#ImportTiddlersPluginInfo|\n|Version|4.5.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|config.macros.importTiddlers.handler|\n|Description|interactive controls for import/export with filtering.|\nCombine tiddlers from any two TiddlyWiki documents. An interactive control panel lets you pick a source document and import selected tiddlers, with prompting for skip, rename, merge or replace actions when importing tiddlers that match existing titles. Generates a detailed report of import 'history' in ImportedTiddlers.\n!!!!!Documentation\n<<<\nsee [[ImportTiddlersPluginInfo]] for details\n<<<\n!!!!!interactive control panel:\n<<<\n<<importTiddlers inline>>\n{{clear{\n^^(see also: [[ImportTiddlers]] shadow tiddler)^^}}}\n<<<\n!!!!!Revisions\n<<<\n2009.05.04 [4.5.0] import from CSV-formatted files\n|please see [[ImportTiddlersPluginInfo]] for additional revision details|\n2005.07.20 [1.0.0] Initial Release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.ImportTiddlersPlugin= {major: 4, minor: 5, revision: 0, date: new Date(2009,5,4)};\n\n// IE needs explicit global scoping for functions/vars called from browser events\nwindow.onClickImportButton=onClickImportButton;\nwindow.refreshImportList=refreshImportList;\n\n// default cookie/option values\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n\n// default shadow definition\nconfig.shadowTiddlers.ImportTiddlers='<<importTiddlers inline>>';\n\n// use shadow tiddler content in backstage panel\nif (config.tasks) config.tasks.importTask.content='<<tiddler ImportTiddlers>>' // TW2.2 or above\n//}}}\n//{{{\n// backward-compatiblity for TW2.0.x and TW1.2.x\nif (config.macros.importTiddlers==undefined) config.macros.importTiddlers={};\nif (typeof merge=='undefined') {\n function merge(dst,src,preserveExisting) {\n for(var i in src) { if(!preserveExisting || dst[i] === undefined) dst[i] = src[i]; }\n return dst;\n }\n}\nif (config.browser.isGecko===undefined)\n config.browser.isGecko=(config.userAgent.indexOf('gecko')!=-1);\n//}}}\n//{{{\nmerge(config.macros.importTiddlers,{\n $: function(id) { return document.getElementById(id); }, // abbreviation\n label: 'import tiddlers',\n prompt: 'Copy tiddlers from another document',\n openMsg: 'Opening %0',\n openErrMsg: 'Could not open %0 - error=%1',\n readMsg: 'Read %0 bytes from %1',\n foundMsg: 'Found %0 tiddlers in %1',\n filterMsg: "Filtered %0 tiddlers matching '%1'",\n summaryMsg: '%0 tiddler%1 in the list',\n summaryFilteredMsg: '%0 of %1 tiddler%2 in the list',\n plural: 's are',\n single: ' is',\n countMsg: '%0 tiddlers selected for import',\n processedMsg: 'Processed %0 tiddlers',\n importedMsg: 'Imported %0 of %1 tiddlers from %2',\n loadText: 'please load a document...',\n closeText: 'close',\n doneText: 'done',\n startText: 'import',\n stopText: 'stop',\n local: true, // default to import from local file\n src: '', // path/filename or URL of document to import (retrieved from SiteUrl)\n proxy: '', // URL for remote proxy script (retrieved from SiteProxy)\n useProxy: false, // use specific proxy script in front of remote URL\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: '', // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 10, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n sync: false, // add 'server' fields to imported tiddlers (for sync function)\n lastFilter: '', // most recent filter (URL hash) applied\n lastAction: null, // most recent collision button performed\n index: 0, // current processing index in import list\n sort: '' // sort order for imported tiddler listbox\n});\n//}}}\n//{{{\n// hijack core macro handler\nif (config.macros.importTiddlers.coreHandler==undefined)\n config.macros.importTiddlers.coreHandler=config.macros.importTiddlers.handler;\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!params[0] || params[0].toLowerCase()=='core') { // default to built in\n if (config.macros.importTiddlers.coreHandler)\n config.macros.importTiddlers.coreHandler.apply(this,arguments);\n else \n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n } else if (params[0]=='link') { // show link to floating panel\n createTiddlyButton(place,params[1]||this.label,params[2]||this.prompt,onClickImportMenu);\n } else if (params[0]=='inline') {// show panel as INLINE tiddler content\n createImportPanel(place);\n this.$('importPanel').style.position='static';\n this.$('importPanel').style.display='block';\n } else if (config.macros.loadTiddlers)\n config.macros.loadTiddlers.handler(place,macroName,params); // any other params: loadtiddlers\n}\n//}}}\n//{{{\n// Handle link click to create/show/hide control panel\nfunction onClickImportMenu(e) { var e=e||window.event;\n var parent=resolveTarget(e).parentNode;\n var panel=document.getElementById('importPanel');\n if (panel==undefined || panel.parentNode!=parent) panel=createImportPanel(parent);\n var isOpen=panel.style.display=='block';\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,false,'none'));\n else\n panel.style.display=isOpen?'none':'block';\n e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); return(false);\n}\n//}}}\n//{{{\n// Create control panel: HTML, CSS\nfunction createImportPanel(place) {\n var cmi=config.macros.importTiddlers; // abbrev\n var panel=cmi.$('importPanel');\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(cmi.css,'importTiddlers');\n panel=createTiddlyElement(place,'span','importPanel',null,null)\n panel.innerHTML=cmi.html;\n refreshImportList();\n var siteURL=store.getTiddlerText('SiteUrl'); if (!siteURL) siteURL='';\n cmi.$('importSourceURL').value=siteURL;\n cmi.src=siteURL;\n var siteProxy=store.getTiddlerText('SiteProxy'); if (!siteProxy) siteProxy='SiteProxy';\n cmi.$('importSiteProxy').value=siteProxy;\n cmi.proxy=siteProxy;\n if (config.browser.isGecko) { // FF3 FIXUP\n cmi.$('fileImportSource').style.display='none';\n cmi.$('importLocalPanelFix').style.display='block';\n }\n cmi.$('chkSync').checked=cmi.sync;\n cmi.$('chkImportTags').checked=cmi.importTags;\n cmi.$('chkKeepTags').checked=cmi.keepTags;\n cmi.$('chkAddTags').checked=cmi.addTags;\n cmi.$('txtNewTags').value=cmi.newTags;\n cmi.$('txtNewTags').style.display=cmi.addTags?'block':'none';\n cmi.$('chkSync').checked=cmi.sync;\n cmi.$('chkImportReport').checked=config.options.chkImportReport;\n return panel;\n}\n//}}}\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em;\s\n}\s\n#importPanel a, #importPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#importPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#importPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#importPanel select { width:100%;margin:0px;font-size:8pt;line-height:110%;}\s\n#importPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\s\n#importPanel .box { border:1px solid #000; background-color:#eee; padding:3px 5px; margin-bottom:5px; -moz-border-radius:5px;-webkit-border-radius:5px;}\s\n#importPanel .topline { border-top:1px solid #999; padding-top:2px; margin-top:2px; }\s\n#importPanel .rad { width:auto; }\s\n#importPanel .chk { width:auto; margin:1px;border:0; }\s\n#importPanel .btn { width:auto; }\s\n#importPanel .btn1 { width:98%; }\s\n#importPanel .btn2 { width:48%; }\s\n#importPanel .btn3 { width:32%; }\s\n#importPanel .btn4 { width:23%; }\s\n#importPanel .btn5 { width:19%; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#backstagePanel #importPanel { left:10%; right:auto; }\s\n';\n//}}}\n//{{{\nconfig.macros.importTiddlers.html = '\s\n<!-- source and report -->\s\n<table><tr><td align=left>\s\n import from\s\n <input type="radio" class="rad" name="importFrom" id="importFromFile" value="file" CHECKED\s\n onclick="onClickImportButton(this,event)" title="show file controls"> local file\s\n <input type="radio" class="rad" name="importFrom" id="importFromWeb" value="http"\s\n onclick="onClickImportButton(this,event)" title="show web controls"> web server\s\n</td><td align=right>\s\n <input type=checkbox class="chk" id="chkImportReport"\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;"> create report\s\n</td></tr></table>\s\n\s\n<div class="box" id="importSourcePanel" style="margin:.5em">\s\n<div id="importLocalPanel" style="display:block;margin-bottom:2px;"><!-- import from local file -->\s\nenter or browse for source path/filename<br>\s\n<input type="file" id="fileImportSource" size=57 style="width:100%"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;document.getElementById(\s'importLoad\s').onclick()">\s\n<div id="importLocalPanelFix" style="display:none"><!-- FF3 FIXUP -->\s\n <input type="text" id="fileImportSourceFix" style="width:90%"\s\n title="Enter a path/file to import"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;document.getElementById(\s'importLoad\s').onclick()">\s\n <input type="button" id="fileImportSourceFixButton" style="width:7%" value="..."\s\n title="Select a path/file to import"\s\n onClick="var r=config.macros.importTiddlers.askForFilename(this); if (!r||!r.length) return;\s\n document.getElementById(\s'fileImportSourceFix\s').value=r;\s\n config.macros.importTiddlers.src=r;\s\n document.getElementById(\s'importLoad\s').onclick()">\s\n</div><!--end FF3 FIXUP-->\s\n</div><!--end local-->\s\n<div id="importHTTPPanel" style="display:none;margin-bottom:2px;"><!-- import from http server -->\s\n<table><tr><td align=left>\s\n enter a URL or <a href="javascript:;" id="importSelectFeed"\s\n onclick="onClickImportButton(this,event)" title="select a pre-defined \s'systemServer\s' URL">\s\n select a server</a><br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="importUsePassword"\s\n onClick="config.macros.importTiddlers.usePassword=this.checked;\s\n config.macros.importTiddlers.showPanel(\s'importIDPWPanel\s',this.checked,true);">password\s\n <input type="checkbox" class="chk" id="importUseProxy"\s\n onClick="config.macros.importTiddlers.useProxy=this.checked;\s\n config.macros.importTiddlers.showPanel(\s'importSiteProxy\s',this.checked,true);">proxy\s\n</td></tr></table>\s\n<input type="text" id="importSiteProxy" style="display:none;margin-bottom:1px" onfocus="this.select()" value="SiteProxy"\s\n onKeyUp="config.macros.importTiddlers.proxy=this.value"\s\n onChange="config.macros.importTiddlers.proxy=this.value;">\s\n<input type="text" id="importSourceURL" onfocus="this.select()" value="SiteUrl"\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n<div id="importIDPWPanel" style="text-align:center;margin-top:2px;display:none";>\s\nusername: <input type=text id="txtImportID" style="width:25%" \s\n onChange="config.options.txtRemoteUsername=this.value;">\s\n password: <input type=password id="txtImportPW" style="width:25%" \s\n onChange="config.options.txtRemotePassword=this.value;">\s\n</div><!--end idpw-->\s\n</div><!--end http-->\s\n</div><!--end source-->\s\n\s\n<div class="box" id="importSelectPanel" style="display:none;margin:.5em;">\s\n<table><tr><td align=left>\s\nselect:\s\n<a href="javascript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this);return false;" title="SELECT all tiddlers">\s\n all</a>\s\n <a href="javascript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this);return false;" title="SELECT tiddlers not already in destination document">\s\n added</a>\s\n <a href="javascript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this);return false;" title="SELECT tiddlers that have been updated in source document">\s\n changes</a>\s\n <a href="javascript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this);return false;" title="SELECT tiddlers that have been added or are different from existing tiddlers">\s\n differences</a>\s\n</td><td align=right>\s\n<a href="javascript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this);return false;" title="SHRINK list size">\s\n – </a>\s\n<a href="javascript:;" id="importListLarger"\s\n onclick="onClickImportButton(this);return false;" title="GROW list size">\s\n + </a>\s\n<a href="javascript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this);return false;" title="MAXIMIZE/RESTORE list size">\s\n = </a>\s\n</td></tr></table>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<div style="text-align:center">\s\n <a href="javascript:;"\s\n title="click for help using filters..."\s\n onclick="alert(\s'A filter consists of one or more space-separated combinations of:\s\sn\s\sntiddler titles\s\sntag:[[tagvalue]]\s\sntag:[[tag expression]] (requires MatchTagsPlugin)\s\snstory:[[TiddlerName]]\s\snsearch:[[searchtext]]\s\sn\s\snUse a blank filter for all tiddlers.\s')"\s\n >filter</a>\s\n <input type="text" id="importLastFilter" style="margin-bottom:1px; width:65%"\s\n title="Enter a combination of one or more filters. Use a blank filter for all tiddlers."\s\n onfocus="this.select()" value=""\s\n onKeyUp="config.macros.importTiddlers.lastFilter=this.value"\s\n onChange="config.macros.importTiddlers.lastFilter=this.value;">\s\n <input type="button" id="importApplyFilter" style="width:20%" value="apply"\s\n title="filter list of tiddlers to include only those that match certain criteria"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div><!--end select-->\s\n\s\n<div class="box" id="importOptionsPanel" style="text-align:center;margin:.5em;display:none;">\s\n apply tags: <input type=checkbox class="chk" id="chkImportTags" checked\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">from source \s\n <input type=checkbox class="chk" id="chkKeepTags" checked\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing \s\n <input type=checkbox class="chk" id="chkAddTags" \s\n onClick="config.macros.importTiddlers.addTags=this.checked;\s\n config.macros.importTiddlers.showPanel(\s'txtNewTags\s',this.checked,false);\s\n if (this.checked) document.getElementById(\s'txtNewTags\s').focus();">add tags<br>\s\n <input type=text id="txtNewTags" style="margin-top:4px;display:none;" size=15\s onfocus="this.select()" \s\n title="enter tags to be added to imported tiddlers" \s\n onKeyUp="config.macros.importTiddlers.newTags=this.value;\s\n document.getElementById(\s'chkAddTags\s').checked=this.value.length>0;" autocomplete=off>\s\n <nobr><input type=checkbox class="chk" id="chkSync" \s\n onClick="config.macros.importTiddlers.sync=this.checked;">\s\n link tiddlers to source document (for sync later)</nobr>\s\n</div><!--end options-->\s\n\s\n<div id="importButtonPanel" style="text-align:center">\s\n <input type=button id="importLoad" class="importButton btn3" value="open"\s\n title="load listbox with tiddlers from source document"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importOptions" class="importButton btn3" value="options..."\s\n title="set options for tags, sync, etc."\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton btn3" value="import"\s\n title="start/stop import of selected source tiddlers into current document"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton btn3" value="done"\s\n title="clear listbox or hide control panel"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n\s\n<div class="none" id="importCollisionPanel" style="display:none;margin:.5em 0 .5em .5em;">\s\n <table><tr><td style="width:65%" align="left">\s\n <table><tr><td align=left>\s\n tiddler already exists:\s\n </td><td align=right>\s\n <input type=checkbox class="chk" id="importApplyToAll" \s\n onclick="document.getElementById(\s'importRename\s').disabled=this.checked;"\s\n checked>apply to all\s\n </td></tr></table>\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n </td><td style="width:34%" align="center">\s\n <input type=button id="importMerge"\s\n class="importButton" style="width:47%" value="merge"\s\n title="append the incoming tiddler to the existing tiddler"\s\n onclick="onClickImportButton(this)"><!--\s\n --><input type=button id="importSkip"\s\n class="importButton" style="width:47%" value="skip"\s\n title="do not import this tiddler"\s\n onclick="onClickImportButton(this)"><!--\s\n --><br><input type=button id="importRename"\s\n class="importButton" style="width:47%" value="rename"\s\n title="rename the incoming tiddler"\s\n onclick="onClickImportButton(this)"><!--\s\n --><input type=button id="importReplace"\s\n class="importButton" style="width:47%" value="replace"\s\n title="discard the existing tiddler"\s\n onclick="onClickImportButton(this)">\s\n </td></tr></table>\s\n</div><!--end collision-->\s\n';\n//}}}\n//{{{\n// process control interactions\nfunction onClickImportButton(which,event) {\n var cmi=config.macros.importTiddlers; // abbreviation\n var list=cmi.$('importList'); if (!list) return;\n var thePanel=cmi.$('importPanel');\n var theCollisionPanel=cmi.$('importCollisionPanel');\n var theNewTitle=cmi.$('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'importFromFile': // show local panel\n case 'importFromWeb': // show HTTP panel\n cmi.local=(which.id=='importFromFile');\n cmi.showPanel('importLocalPanel',cmi.local);\n cmi.showPanel('importHTTPPanel',!cmi.local);\n break;\n case 'importOptions': // show/hide options panel\n cmi.showPanel('importOptionsPanel',cmi.$('importOptionsPanel').style.display=='none');\n break;\n case 'fileImportSource':\n case 'importLoad': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n cmi.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (cmi.src=='') break;\n // Load document, read it's DOM and fill the list\n cmi.loadRemoteFile(cmi.src,cmi.filterTiddlerList);\n break;\n case 'importSelectFeed': // select a pre-defined systemServer feed URL\n var p=Popup.create(which); if (!p) return;\n var tids=store.getTaggedTiddlers('systemServer');\n if (!tids.length)\n createTiddlyText(createTiddlyElement(p,'li'),'no pre-defined server feeds');\n for (var t=0; t<tids.length; t++) {\n var u=store.getTiddlerSlice(tids[t].title,'URL');\n var d=store.getTiddlerSlice(tids[t].title,'Description');\n if (!d||!d.length) d=store.getTiddlerSlice(tids[t].title,'description');\n if (!d||!d.length) d=u;\n createTiddlyButton(createTiddlyElement(p,'li'),tids[t].title,d,\n function(){\n var u=this.getAttribute('url');\n document.getElementById('importSourceURL').value=u;\n config.macros.importTiddlers.src=u;\n document.getElementById('importLoad').onclick();\n },\n null,null,null,{url:u});\n }\n Popup.show(p,false);\n event.cancelBubble = true;\n if (event.stopPropagation) event.stopPropagation();\n return(false);\n // create popup with feed list\n // onselect, insert feed URL into input field.\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n if (list.options[t].value=='') continue;\n list.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value=='') continue;\n list.options[t].selected=!store.tiddlerExists(list.options[t].value);\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value==''||!store.tiddlerExists(list.options[t].value)) continue;\n for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler\n { var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }\n list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified>0); // updated tiddler\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < list.options.length; t++) {\n list.options[t].selected=false;\n if (list.options[t].value=='') continue;\n if (!store.tiddlerExists(list.options[t].value)) { list.options[t].selected=true; count++; continue; }\n for (var i=0; i<cmi.inbound.length; i++) // find matching inbound tiddler\n { var inbound=cmi.inbound[i]; if (inbound.title==list.options[t].value) break; }\n list.options[t].selected=(inbound.modified-store.getTiddler(list.options[t].value).modified!=0); // changed tiddler\n count+=list.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n cmi.$('importStart').disabled=!count;\n break;\n case 'importApplyFilter': // filter list to include only matching tiddlers\n importReport(); // if an import was in progress, generate a report\n clearMessage();\n if (!cmi.all) // no tiddlers loaded = '0 selected'\n { displayMessage(cmi.countMsg.format([0])); return false; }\n var hash=cmi.$('importLastFilter').value;\n cmi.inbound=cmi.filterByHash('#'+hash,cmi.all);\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n cmi.$('importApplyToAll').checked=false;\n cmi.$('importStart').value=cmi.stopText;\n if (cmi.index>0) cmi.index=-1; // stop processing\n else cmi.index=importTiddlers(0); // or begin processing\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!cmi.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n cmi.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: ';\n theText +='[['+cmi.src+'#'+theItem.value+'|'+cmi.src+'#'+theItem.value+']]^^\sn';\n theText +='^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString('MM/DD/YYYY 0hh:0mm:0ss');\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n cmi.lastAction=which;\n var theItem = list.options[cmi.index];\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==theItem.value) break;\n var theImported = cmi.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString('MM/DD/YYYY 0hh:0mm:0ss');\n theImported.status += ' by '+theExisting.modifier;\n theCollisionPanel.style.display='none';\n cmi.index=importTiddlers(cmi.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (list.options.length==1) break;\n list.size-=(list.size>5)?1:0;\n cmi.listsize=list.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (list.options.length==1) break;\n list.size+=(list.size<list.options.length)?1:0;\n cmi.listsize=list.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (list.options.length==1) break;\n list.size=(list.size==list.options.length)?cmi.listsize:list.options.length;\n break;\n }\n}\n//}}}\n//{{{\nconfig.macros.importTiddlers.showPanel=function(place,show,skipAnim) {\n if (typeof place=='string') var place=document.getElementById(place);\n if (!place||!place.style) return;\n if(!skipAnim && anim && config.options.chkAnimate) anim.startAnimating(new Slider(place,show,false,'none'));\n else place.style.display=show?'block':'none';\n}\n//}}}\n//{{{\nfunction refreshImportList(selectedIndex) {\n var cmi=config.macros.importTiddlers; // abbrev\n var list=cmi.$('importList'); if (!list) return;\n // if nothing to show, reset list content and size\n if (!cmi.inbound) {\n while (list.length > 0) { list.options[0] = null; }\n list.options[0]=new Option(cmi.loadText,'',false,false);\n list.size=cmi.listsize;\n cmi.$('importLoad').disabled=false;\n cmi.$('importLoad').style.display='inline';\n cmi.$('importStart').disabled=true;\n cmi.$('importOptions').disabled=true;\n cmi.$('importOptions').style.display='none';\n cmi.$('fileImportSource').disabled=false;\n cmi.$('importFromFile').disabled=false;\n cmi.$('importFromWeb').disabled=false;\n cmi.$('importStart').value=cmi.startText;\n cmi.$('importClose').value=cmi.doneText;\n cmi.$('importSelectPanel').style.display='none';\n cmi.$('importOptionsPanel').style.display='none';\n return;\n }\n // there are inbound tiddlers loaded...\n cmi.$('importLoad').disabled=true;\n cmi.$('importLoad').style.display='none';\n cmi.$('importOptions').style.display='inline';\n cmi.$('importOptions').disabled=false;\n cmi.$('fileImportSource').disabled=true;\n cmi.$('importFromFile').disabled=true;\n cmi.$('importFromWeb').disabled=true;\n cmi.$('importClose').value=cmi.closeText;\n if (cmi.$('importSelectPanel').style.display=='none')\n cmi.showPanel('importSelectPanel',true);\n\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) cmi.sort='title'; // heading\n if (selectedIndex==1) cmi.sort='title';\n if (selectedIndex==2) cmi.sort='modified';\n if (selectedIndex==3) cmi.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < list.options.length; t++) {\n if (!list.options[t].selected) continue;\n if (list.options[t].value!='')\n count+=1;\n else { // if heading is selected, deselect it, and then select and count all in section\n list.options[t].selected=false;\n for ( t++; t<list.options.length && list.options[t].value!=''; t++) {\n list.options[t].selected=true;\n count++;\n }\n }\n }\n clearMessage(); displayMessage(cmi.countMsg.format([count]));\n }\n cmi.$('importStart').disabled=!count;\n if (selectedIndex>3) return; // no refresh needed\n\n // get the alphasorted list of tiddlers\n var tiddlers=cmi.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (list.length > 0) { list.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n if (cmi.all.length==tiddlers.length)\n var summary=cmi.summaryMsg.format([tiddlers.length,(tiddlers.length!=1)?cmi.plural:cmi.single]);\n else\n var summary=cmi.summaryFilteredMsg.format([tiddlers.length,cmi.all.length,(cmi.all.length!=1)?cmi.plural:cmi.single]);\n list.options[i++]=new Option(summary,'',false,false);\n list.options[i++]=new Option(((cmi.sort=='title' )?'>':indent)+' [by title]','',false,false);\n list.options[i++]=new Option(((cmi.sort=='modified')?'>':indent)+' [by date]','',false,false);\n list.options[i++]=new Option(((cmi.sort=='tags')?'>':indent)+' [by tags]','',false,false);\n // output the tiddler list\n switch(cmi.sort) {\n case 'title':\n for(var t = 0; t < tiddlers.length; t++)\n list.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case 'modified':\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = '';\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n list.options[i++] = new Option(theSection,'',false,false);\n lastSection = theSection;\n }\n list.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case 'tags':\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n if (!tags || !tags.length) {\n if (theTitles['untagged']==undefined) { theTags.push('untagged'); theTitles['untagged']=new Array(); }\n theTitles['untagged'].push(title);\n }\n else for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n list.options[i++]=new Option(theTag,'',false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n list.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n list.selectedIndex=selectedIndex; // select current control item\n if (list.size<cmi.listsize) list.size=cmi.listsize;\n if (list.size>list.options.length) list.size=list.options.length;\n}\n//}}}\n//{{{\n// re-entrant processing for handling import with interactive collision prompting\nfunction importTiddlers(startIndex) {\n var cmi=config.macros.importTiddlers; // abbrev\n if (!cmi.inbound) return -1;\n var list=cmi.$('importList'); if (!list) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<cmi.inbound.length;t++)\n cmi.inbound[t].status='';\n for (var i=startIndex; i<list.options.length; i++) {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!list.options[i].selected) || ((t=list.options[i].value)==''))\n continue;\n for (var j=0;j<cmi.inbound.length;j++)\n if (cmi.inbound[j].title==t) break;\n var inbound = cmi.inbound[j];\n var theExisting = store.getTiddler(inbound.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (inbound.status=='added')\n continue;\n // don't import the 'ImportedTiddlers' history from the other document...\n if (inbound.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (inbound.status.substr(0,7)!='replace') && (inbound.status.substr(0,5)!='merge'))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = '';\n if (cmi.importTags)\n newTags+=inbound.getTags() // import remote tags\n if (cmi.keepTags && theExisting)\n newTags+=' '+theExisting.getTags(); // keep existing tags\n if (cmi.addTags && cmi.newTags.trim().length)\n newTags+=' '+cmi.newTags; // add new tags\n inbound.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n inbound.status=(inbound.status=='')?'added':inbound.status;\n // set sync fields\n if (cmi.sync) {\n if (!inbound.fields) inbound.fields={}; // for TW2.1.x backward-compatibility\n inbound.fields['server.page.revision']=inbound.modified.convertToYYYYMMDDHHMM();\n inbound.fields['server.type']='file';\n inbound.fields['server.host']=(cmi.local?'file://':'')+cmi.src;\n }\n // do the import!\n store.suspendNotifications();\n store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags, inbound.fields, true, inbound.created);\n store.fetchTiddler(inbound.title).created = inbound.created; // force creation date to imported value (needed for TW2.1.x and earlier)\n store.resumeNotifications();\n }\n return(-1); // signals that we really finished the entire list\n}\nfunction importStopped() {\n var cmi=config.macros.importTiddlers; // abbrev\n var list=cmi.$('importList'); if (!list) return;\n var theNewTitle=cmi.$('importNewTitle');\n if (cmi.index==-1){ \n cmi.$('importStart').value=cmi.startText;\n importReport(); // import finished... generate the report\n } else {\n // import collision...\n // show the collision panel and set the title edit field\n cmi.$('importStart').value=cmi.stopText;\n cmi.showPanel('importCollisionPanel',true);\n theNewTitle.value=list.options[cmi.index].value;\n if (cmi.$('importApplyToAll').checked && cmi.lastAction && cmi.lastAction.id!='importRename')\n onClickImportButton(cmi.lastAction);\n }\n}\n//}}}\n//{{{\nfunction importReport() {\n var cmi=config.macros.importTiddlers; // abbrev\n if (!cmi.inbound) return;\n // if import was not completed, the collision panel will still be open... close it now.\n var panel=cmi.$('importCollisionPanel'); if (panel) panel.style.display='none';\n // get the alphasorted list of tiddlers\n var tiddlers = cmi.inbound;\n // gather the statistics\n var count=0; var total=0;\n for (var t=0; t<tiddlers.length; t++) {\n if (!tiddlers[t].status || !tiddlers[t].status.trim().length) continue;\n if (tiddlers[t].status.substr(0,7)!='skipped') count++;\n total++;\n }\n // generate a report\n if (total) displayMessage(cmi.processedMsg.format([total]));\n if (count && config.options.chkImportReport) {\n // get/create the report tiddler\n var theReport = store.getTiddler('ImportedTiddlers');\n if (!theReport) { theReport=new Tiddler(); theReport.title='ImportedTiddlers'; theReport.text=''; }\n // format the report content\n var now = new Date();\n var newText = 'On '+now.toLocaleString()+', '+config.options.txtUserName\n newText +=' imported '+count+' tiddler'+(count==1?'':'s')+' from\sn[['+cmi.src+'|'+cmi.src+']]:\sn';\n if (cmi.addTags && cmi.newTags.trim().length)\n newText += 'imported tiddlers were tagged with: "'+cmi.newTags+'"\sn';\n newText += '<<<\sn';\n for (var t=0; t<tiddlers.length; t++) if (tiddlers[t].status)\n newText += '#[['+tiddlers[t].title+']] - '+tiddlers[t].status+'\sn';\n newText += '<<<\sn';\n // update the ImportedTiddlers content and show the tiddler\n theReport.text = newText+((theReport.text!='')?'\sn----\sn':'')+theReport.text;\n theReport.modifier = config.options.txtUserName;\n theReport.modified = new Date();\n store.saveTiddler(theReport.title, theReport.title, theReport.text, theReport.modifier, theReport.modified, theReport.tags, theReport.fields);\n story.displayTiddler(null,theReport.title,1,null,null,false);\n story.refreshTiddler(theReport.title,1,true);\n }\n // reset status flags\n for (var t=0; t<cmi.inbound.length; t++) cmi.inbound[t].status='';\n // mark document as dirty and let display update as needed\n if (count) { store.setDirty(true); store.notifyAll(); }\n // always show final message when tiddlers were actually loaded\n if (count) displayMessage(cmi.importedMsg.format([count,tiddlers.length,cmi.src.replace(/%20/g,' ')]));\n}\n//}}}\n//{{{\n// // File and XMLHttpRequest I/O\nconfig.macros.importTiddlers.askForFilename=function(here) {\n var msg=here.title; // use tooltip as dialog box message\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf('/'); if (slashpos==-1) slashpos=path.lastIndexOf('\s\s'); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n var file='';\n var result='';\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeOpen);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XPSP2 IE only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { // fallback\n var result=prompt(msg,path+file);\n }\n }\n return result;\n}\n\nconfig.macros.importTiddlers.loadRemoteFile = function(src,callback) {\n if (src==undefined || !src.length) return null; // filename is required\n var original=src; // URL as specified\n var hashpos=src.indexOf('#'); if (hashpos!=-1) src=src.substr(0,hashpos); // URL with #... suffix removed (needed for IE)\n clearMessage();\n displayMessage(this.openMsg.format([src.replace(/%20/g,' ')]));\n if (src.substr(0,5)!='http:' && src.substr(0,5)!='file:') { // if not a URL, read from local filesystem\n var txt=loadFile(src);\n if (!txt) { // file didn't load, might be relative path.. try fixup\n var pathPrefix=document.location.href; // get current document path and trim off filename\n var slashpos=pathPrefix.lastIndexOf('/'); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf('\s\s'); \n if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);\n src=pathPrefix+src;\n if (pathPrefix.substr(0,5)!='http:') src=getLocalPath(src);\n var txt=loadFile(src);\n }\n if (!txt) { // file still didn't load, report error\n displayMessage(config.macros.importTiddlers.openErrMsg.format([src.replace(/%20/g,' '),'(filesystem error)']));\n } else {\n displayMessage(config.macros.importTiddlers.readMsg.format([txt.length,src.replace(/%20/g,' ')]));\n if (callback) callback(true,original,convertUTF8ToUnicode(txt),src,null);\n }\n } else {\n var name=config.options.txtRemoteUsername; var pass=config.options.txtRemotePassword;\n var xhr=doHttp('GET',src,null,null,name,pass,callback,original,null)\n if (!xhr) displayMessage(config.macros.importTiddlers.openErrMsg.format([src,'(XMLHTTPRequest error)']));\n }\n}\n\nconfig.macros.importTiddlers.readTiddlersFromHTML=function(html)\n{\n var remoteStore=new TiddlyWiki();\n remoteStore.importTiddlyWiki(html);\n return remoteStore.getTiddlers('title'); \n}\n\nconfig.macros.importTiddlers.readTiddlersFromCSV=function(CSV) {\n var remoteStore=new TiddlyWiki();\n var lines=CSV.split('\sn'); var names=lines[0].split(','); CSV=lines.join('\sn')\n // ENCODE commas and newlines within quoted values\n var comma='!~comma~!'; var commaRE=new RegExp(comma,'g');\n var newline='!~newline~!'; var newlineRE=new RegExp(newline,'g');\n CSV=CSV.replace(/\sx22((?:[^\sx22]|\sx22\sx22)*?)\sx22/g,\n function(x){ return x.substr(1,x.length-2).replace(/\s,/g,comma).replace(/\sn/g,newline); });\n // PARSE lines\n var lines=CSV.split('\sn');\n for (var i=1; i<lines.length; i++) { if (!lines[i].length) continue;\n var values=lines[i].split(',');\n // DECODE commas, newlines and doubled-quotes within quoted values\n for (var v=0; v<values.length; v++)\n values[v]=values[v].replace(commaRE,',').replace(newlineRE,'\sn').replace(/\sx22\sx22/g,'\sx22');\n // EXTRACT tiddler values\n var title=''; var text=''; var tags=[]; var fields={};\n var created=null; var when=new Date(); var who=config.options.txtUserName;\n for (var v=0; v<values.length; v++) { var val=values[v];\n if (names[v]) switch(names[v].toLowerCase()) {\n case 'title': title=val.replace(/\s[\s]\s|/g,'_'); break;\n case 'created': created=new Date(val); break;\n case 'modified':when=new Date(val); break;\n case 'modifier':who=val; break;\n case 'text': text=val; break;\n case 'tags': tags=val.readBracketedList(); break;\n default: fields[names[v].toLowerCase()]=val; break;\n }\n }\n // CREATE tiddler in temporary store\n if (title.length) remoteStore.saveTiddler(title,title,text,who,when,tags,fields,true,created||when);\n }\n return remoteStore.getTiddlers('title'); \n}\n\nconfig.macros.importTiddlers.filterTiddlerList=function(success,params,txt,src,xhr) {\n var cmi=config.macros.importTiddlers; // abbreviation\n var src=src.replace(/%20/g,' ');\n if (!success) { displayMessage(cmi.openErrMsg.format([src,xhr.status])); return; }\n cmi.all=cmi.readTiddlersFromHTML(txt);\n if (!cmi.all||!cmi.all.length) cmi.all=cmi.readTiddlersFromCSV(txt)\n var count=cmi.all?cmi.all.length:0;\n var querypos=src.lastIndexOf('?'); if (querypos!=-1) src=src.substr(0,querypos);\n displayMessage(cmi.foundMsg.format([count,src]));\n cmi.inbound=cmi.filterByHash(params,cmi.all); // use full URL including hash (if any)\n cmi.$('importLastFilter').value=cmi.lastFilter;\n window.refreshImportList(0);\n}\n\nconfig.macros.importTiddlers.filterByHash=function(src,tiddlers)\n{\n var hashpos=src.lastIndexOf('#'); if (hashpos==-1) return tiddlers;\n var hash=src.substr(hashpos+1); if (!hash.length) return tiddlers;\n var tids=[];\n var params=hash.parseParams('anon',null,true,false,false);\n for (var p=1; p<params.length; p++) {\n switch (params[p].name) {\n case 'anon':\n case 'open':\n tids.pushUnique(params[p].value);\n break;\n case 'tag':\n if (store.getMatchingTiddlers) { // for boolean expressions - see MatchTagsPlugin\n var r=store.getMatchingTiddlers(params[p].value,null,tiddlers);\n for (var t=0; t<r.length; t++) tids.pushUnique(r[t].title);\n } else for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].isTagged(params[p].value))\n tids.pushUnique(tiddlers[t].title);\n break;\n case 'story':\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].title==params[p].value) {\n tiddlers[t].changed();\n for (var s=0; s<tiddlers[t].links.length; s++)\n tids.pushUnique(tiddlers[t].links[s]);\n break;\n }\n break;\n case 'search':\n for (var t=0; t<tiddlers.length; t++)\n if (tiddlers[t].text.indexOf(params[p].value)!=-1)\n tids.pushUnique(tiddlers[t].title);\n break;\n }\n }\n var matches=[];\n for (var t=0; t<tiddlers.length; t++)\n if (tids.contains(tiddlers[t].title))\n matches.push(tiddlers[t]);\n displayMessage(config.macros.importTiddlers.filterMsg.format([matches.length,hash]));\n config.macros.importTiddlers.lastFilter=hash;\n return matches;\n}\n//}}}
Formats: [[XML|?format=xml]] | [[YAML|?format=yaml]]\n
• Clarion University (PA) \n• Framingham State College (MA) \n• Indiana University at South Bend (IN) \n• Rutgers University at Camden (NJ) \n• Shippensburg University (PA) \n• SUNY-Fredonia (NY) \n• SUNY-Plattsburgh (NY) \n• Univeristy of Michigan at Flint (MI) \n• University of Wisconsin at River Falls (WI) \n• Worcester State College (MA)
//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) (.*?)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart )\n {\n var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\su00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = "none";\n wikify(lookaheadMatch[2],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e)\n {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n})\n//}}}
http://www.colorcombos.com/\n\n00457a Dark Blue\n5985a8 Light Blue\na37c5f Brown\nf3f3f3 Grey\n333333 Dark\nfdfdfd different grey
[[Review of the literature|http://www.irrodl.org/index.php/irrodl/article/view/741/1433]]\n[[Distributed Learning Environment|http://wiki.cetis.ac.uk/images/6/6c/Distributed_Learning.pdf]]\n\n "Online education exists because of the ability to financialize products, cutting costs on expensive face to face course content, and to de-skill or re-skill the profession of their old teaching epistemologies... " -- Quote from Chronicle\n\n!!!Macro level: Distance education systems and theories.\n\n# Access, equity, and ethics: The democratization of access to distance education afforded by new media and by finding ways to deliver high-quality education to those who have limited resources and poor infrastructure; issues that refer to the (sustainable) provision of distance education in developing areas. What is the impact of distance education (e.g., via mobile learning) on narrowing the digital divide and what is the role of ICT (information and communication technologies) and/or OER (open educational resources) in terms of access to education?\n# Globalization of education and cross-cultural aspects: Aspects that refer to the global external environment and drivers, the development of the global distance education market, teaching and learning in mediated global environments, and the implications for professional development.\n# Distance teaching systems and institutions: Distance education delivery systems, the role of institutional partnerships in developing transnational programmes, and the impact of ICT on the convergence of conventional education and distance education institutions (hybrid or mixed-mode).\n# Theories and models: Theoretical frameworks for and foundations of distance education, e.g., the theoretical basis of instructional models, knowledge construction, interaction between learners, or the impact of social constructivism learning theories on distance education practice.\n# Research methods in distance education and knowledge transfer: Methodological considerations, the impact of distance education research and writing on practice, and the role of professional associations in improving practice. Literature reviews and works on the history of distance education are also subsumed within this area.\n\n!!!Meso level: Management, organization, and technology.\n\n# Management and organization: Strategies, administration, and organizational infrastructures and frameworks for the development, implementation, and sustainable delivery of distance education programmes. What is required for successful leadership in distance education? Distance education and policies relating to continuing education, lifelong learning, and the impact of online learning on institutional policies, as well as legal issues (copyright and intellectual property).\n# Costs and benefits: Aspects that refer to financial management, costing, pricing, and business models in distance education. Efficiency: What is the return on investment or impact of distance education programmes? What is the impact of ICT on the costing models and the scalability of distance education delivery? How can cost effective but meaningful learner support be provided?\n# Educational technology: New trends in educational technology for distance education (e.g., Web 2.0 applications or mobile learning) and the benefits and challenges of using OERs, media selection (e.g., synchronous vs. asynchronous media), technical infrastructure and equipment for online learning environments, and their opportunities for teaching and learning.\n# Innovation and change: Issues that refer to educational innovation with new media and measures to support and facilitate change in institutions (e.g., incentive systems for faculty, aspects referring to staff workloads, promotion, and tenure).\n# Professional development and faculty support: Professional development and faculty support services as a prerequisite for innovation and change. What are the competencies of online teachers and how can they be developed?\n# Learner support services: The infrastructure for and organisation of learner support systems (from information and counselling for prospective students about library services and technical support to career services and alumni networks).\n# Quality assurance: Issues that refer to accreditation and quality standards in distance education. The impact of quality assurance and high quality learner support on enrolments and drop-out/retention, as well as reputation and acceptance of distance education as a valid form of educational provision.\n\n\n!!!Micro level: Teaching and learning in distance education.\n\n# Instructional design: Issues that refer to the stages of the instructional design process for curriculum and course development. Special emphasis is placed on pedagogical approaches for tutoring online (scaffolding), the design of (culturally appropriate) study material, opportunities provided by new developments in educational technology for teaching and learning (e.g. Web 2.0 applications and mobile devices), as well as assessment practices in distance education.\n# Interaction and communication in learning communities: Closely related to instructional design considerations is course design that fosters (online) articulation, interaction, reflection, and collaboration throughout the learning and teaching process. Special areas include the development of online communities, gender differences, and cross-cultural aspects in online communication.\n#. Learner characteristics: The aims and goals of adult learners, the socio-economic background of distance education students, their different learning styles, critical thinking dispositions, and special needs. How do students learn online (learner behavior patterns, learning styles) and what competencies are needed for distance learning (e.g., digital literacy)?
[[Presentation at Stanford by the CDL people|/filestore/uploads/repositories/pasig-2009-pods.pdf
/***\n|Name|SearchOptionsPlugin|\n|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|\n|Version|2.6.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|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|\n|Description|extend core search function with additional user-configurable options|\n\nThe TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text'). However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases. In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.\n\n!!!!!Usage\n<<<\nThis plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags. It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers. You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.\n<<<\n!!!!!Configuration\n<<<\nIn additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:\n<<option chkSearchTitles>> Search in titles\n<<option chkSearchText>> Search in tiddler text\n<<option chkSearchTags>> Search in tags\n<<option chkSearchFields>> Search in data fields\n<<option chkSearchShadows>> Search shadow tiddlers\n<<option chkSearchTitlesFirst>> Show title matches first\n<<option chkSearchByDate>> Sort matching tiddlers by date\n<<option chkSearchList>> Show list of matches in [[SearchResults]]\n<<option chkSearchIncremental>> Incremental searching\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SearchOptionsPlugin handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior. However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}}, {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}} (with suitable prompt text) to your customized tiddler.\n<<<\n!!!!!Revision History\n<<<\n''2007.02.17 [2.6.1]'' added redefinition of config.macros.search.onKeyPress() to restore check to bypass key-by-key searching (i.e., when chkSearchIncremental==false), which had been unintentionally removed with v2.6.0\n''2007.02.13 [2.6.0]'' remove redefinition of config.macros.search.handler since core now includes handling for ENTER key.\n''2007.02.08 [2.5.1]'' include 'temporary' tag when creating SearchResults (for use with TemporaryTiddlersPlugin)\n''2007.01.29 [2.5.0]'' added support for "sort results by date". Default is to sort alphabetically (standard). When sorted by dates, most recent changes are shown first\n''2006.10.10 [2.4.0]'' added support for "search in tiddler data" (tiddler.fields) Default is to search extended data.\n''2006.04.06 [2.3.0]'' added support for "search in shadow tiddlers". Default is *not* to search in the shadows (i.e. standard TW behavior). Note: if a shadow tiddler has a 'real' counterpart, only the real tiddler is searched, since the shadow is inaccessible for viewing/editing.\n''2006.02.03 [2.2.1]'' rewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes. note that core no longer permits "blank=all" searches, so neither does this plugin. To search for all, use "." with text patterns enabled.\n''2006.02.02 [2.2.0]'' in search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars. Prevents searching on shorter text when shortened by rapid backspaces (<500msec)\n''2006.02.01 [2.1.9]'' in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching\nalso, blank search text now presents "No search text. Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.\n''2006.02.01 [2.1.8]'' in doSearch(), added alert/return if search text is blank\n''2006.01.20 [2.1.7]'' fixed setting of config.macros.search.reportTitle so that Tweaks can override it.\n''2006.01.19 [2.1.6]'' improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)\ndefine results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title\n''2006.01.18 [2.1.5]'' Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.\n''2006.01.17 [2.1.4]'' Use regExp.search() instead of regExp.test() to scan for matches. Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.\n''2006.01.15 [2.1.3]'' Added information (date/time, username, search options used) to SearchResults output\n''2006.01.10 [2.1.2]'' use displayTiddlers() to render matched tiddlers. This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.\n''2006.01.08 [2.1.1]'' corrected invalid variable reference, "txt.value" to "text" in story.search()\n''2006.01.08 [2.1.0]'' re-write to match new store.search(), store.search.handler() and story.search() functions.\n''2005.12.30 [2.0.0]'' Upgraded to TW2.0\nwhen rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.\n''2005.12.26 [1.4.0]'' added option to search for matching text in tiddler tags\n''2005.12.21 [1.3.7]'' use \s\s to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link. Also, added access key: "O", to trigger "open all" link.\nBased on a suggestion by UdoBorkowski.\n''2005.12.18 [1.3.6]'' call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon\n''2005.12.17 [1.3.5]'' if no matches found, just display message and delete any existing SearchResults tiddler.\n''2005.12.17 [1.3.4]'' use {/%%/{/%%/{ and }/%%/}/%%/} to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered \nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.3]'' tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches\nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.2]'' added "open all matching tiddlers..." link to search results output.\nBased on a suggestion by UdoBorkowski.\n''2005.12.10 [1.3.1]'' added "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.\n''2005.12.01 [1.3.0]'' added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).\nadded handling for Enter key so it can be used to start a search.\nBased on a suggestion by LyallPearce\n''2005.11.25 [1.2.1]'' renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin\n''2005.11.25 [1.2.0]'' added chkSearchList option\nBased on a suggestion by RodneyGomes\n''2005.10.19 [1.1.0]'' added chkSearchTitlesFirst option.\nBased on a suggestion by ChristianHauck\n''2005.10.18 [1.0.0]'' Initial Release\nBased on a suggestion by LyallPearce.\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.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};\n//}}}\n\n//{{{\nif (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;\nif (config.options.chkSearchText==undefined) config.options.chkSearchText=true;\nif (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;\nif (config.options.chkSearchFields==undefined) config.options.chkSearchFields=true;\nif (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;\nif (config.options.chkSearchList==undefined) config.options.chkSearchList=false;\nif (config.options.chkSearchByDate==undefined) config.options.chkSearchByDate=false;\nif (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;\nif (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;\n\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitles>> Search in tiddler titles";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchText>> Search in tiddler text";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTags>> Search in tiddler tags";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchFields>> Search in tiddler data fields";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchShadows>> Search in shadow tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitlesFirst>> Search results show title matches first";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchList>> Search results show list of matching tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchByDate>> Search results sorted by modification date ";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchIncremental>> Incremental searching";\n\nif (config.macros.search.reportTitle==undefined) config.macros.search.reportTitle="SearchResults";\n//}}}\n\n//{{{\nconfig.macros.search.onKeyPress = function(e)\n{\n if(!e) var e = window.event;\n switch(e.keyCode)\n {\n case 13: // Ctrl-Enter\n case 10: // Ctrl-Enter on IE PC\n config.macros.search.doSearch(this);\n break;\n case 27: // Escape\n this.value = "";\n clearMessage();\n break;\n }\n if (config.options.chkSearchIncremental) {\n if(this.value.length > 2)\n {\n if(this.value != this.getAttribute("lastSearchText"))\n {\n if(config.macros.search.timeout)\n clearTimeout(config.macros.search.timeout);\n var txt = this;\n config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);\n }\n }\n else\n {\n if(config.macros.search.timeout)\n clearTimeout(config.macros.search.timeout);\n }\n }\n}\n//}}}\n\n//{{{\nStory.prototype.search = function(text,useCaseSensitive,useRegExp)\n{\n highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");\n var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");\n if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first\n var q = useRegExp ? "/" : "'";\n clearMessage();\n if (!matches.length) {\n if (config.options.chkSearchList) discardSearchResults();\n displayMessage(config.macros.search.failureMsg.format([q+text+q]));\n } else {\n if (config.options.chkSearchList) \n reportSearchResults(text,matches);\n else {\n var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);\n this.closeAllTiddlers(); story.displayTiddlers(null,titles);\n displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));\n }\n }\n highlightHack = null;\n}\n//}}}\n\n//{{{\nTiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)\n{\n var candidates = this.reverseLookup("tags",excludeTag,false,sortField);\n\n // scan for matching titles first...\n var results = [];\n if (config.options.chkSearchTitles) {\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].title.search(searchRegExp)!=-1)\n results.push(candidates[t]);\n if (config.options.chkSearchShadows)\n for (var t in config.shadowTiddlers)\n if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))\n results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));\n }\n // then scan for matching text, tags, or field data\n for(var t=0; t<candidates.length; t++) {\n if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)\n results.pushUnique(candidates[t]);\n if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)\n results.pushUnique(candidates[t]);\n if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above\n store.forEachField(candidates[t],\n function(tid,field,val) { if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]); },\n true); // extended fields only\n }\n // then check for matching text in shadows\n if (config.options.chkSearchShadows)\n for (var t in config.shadowTiddlers)\n if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))\n results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));\n\n // if not 'titles first', or sorting by modification date, re-sort results to so titles, text, tag and field matches are mixed together\n if(!sortField) sortField = "title";\n var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }\n if (!config.options.chkSearchTitlesFirst || config.options.chkSearchByDate) results.sort(bySortField);\n\n return results;\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nif (!window.reportSearchResults) window.reportSearchResults=function(text,matches)\n{\n var title=config.macros.search.reportTitle\n var q = config.options.chkRegExpSearch ? "/" : "'";\n var body="\sn";\n\n // summary: nn tiddlers found matching '...', options used\n body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\sn";\n body+="^^//searched in:// ";\n body+=(config.options.chkSearchTitles?"''titles'' ":"");\n body+=(config.options.chkSearchText?"''text'' ":"");\n body+=(config.options.chkSearchTags?"''tags'' ":"");\n body+=(config.options.chkSearchFields?"''fields'' ":"");\n body+=(config.options.chkSearchShadows?"''shadows'' ":"");\n if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {\n body+=" //with options:// ";\n body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");\n body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");\n }\n body+="^^";\n\n // numbered list of links to matching tiddlers\n body+="\sn<<<";\n for(var t=0;t<matches.length;t++) {\n var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";\n body+="\sn# "+date+"[["+matches[t].title+"]]";\n }\n body+="\sn<<<\sn";\n\n // open all matches button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.displayTiddlers(null,["\n for(var t=0;t<matches.length;t++)\n body+="'"+matches[t].title.replace(/\s'/mg,"\s\s'")+"'"+((t<matches.length-1)?", ":"");\n body+="],1);\s" ";\n body+="accesskey=\s"O\s" ";\n body+="value=\s"open all matching tiddlers\s"></html> ";\n\n // discard search results button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\s" ";\n body+="value=\s"discard "+title+"\s"></html>";\n\n // search again\n body+="\sn\sn----\sn";\n body+="<<search \s""+text+"\s">>\sn";\n body+="<<option chkSearchTitles>>titles ";\n body+="<<option chkSearchText>>text ";\n body+="<<option chkSearchTags>>tags";\n body+="<<option chkSearchFields>>fields";\n body+="<<option chkSearchShadows>>shadows";\n body+="<<option chkCaseSensitiveSearch>>case-sensitive ";\n body+="<<option chkRegExpSearch>>text patterns";\n body+="<<option chkSearchByDate>>sort by date";\n\n // create/update the tiddler\n var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();\n tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");\n store.addTiddler(tiddler); story.closeTiddler(title);\n\n // use alternate "search again" label in <<search>> macro\n var oldprompt=config.macros.search.label;\n config.macros.search.label="search again";\n\n // render/refresh tiddler\n story.displayTiddler(null,title,1);\n store.notify(title,true);\n\n // restore standard search label\n config.macros.search.label=oldprompt;\n\n}\n\nif (!window.discardSearchResults) window.discardSearchResults=function()\n{\n // remove the tiddler\n story.closeTiddler(config.macros.search.reportTitle);\n store.deleteTiddler(config.macros.search.reportTitle);\n}\n//}}}
from ben o'steen\n\nfrom oaipmhscraper import OAIPMHScraper\noaipmh = OAIPMHScraper("dspace","http://library.wcsu.edu/dspace-oai/request", "oai:library.wcsu.edu:")\n
<<tagCloud protected systemConfig excludeSearch excludeLists excludeTimeline>>\n\n{{floatLeft{[[Contents By Creation Date]] }}} {{floatLeft{[[Contents By Title]]}}}
http://www.hawksworx.com/journal/ \n\nGood idea about how to use Jquery plugin
/***\n|''Name:''|abego.IncludePlugin|\n|''Version:''|1.0.1 (2007-04-30)|\n|''Type:''|plugin|\n|''Source:''|http://tiddlywiki.abego-software.de/#IncludePlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IncludePlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]]|\n|''Community:''|([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin]]) ([[Support|http://groups.google.com/group/TiddlyWiki]])|\n|''Copyright:''|© 2007 [[abego Software|http://www.abego-software.de]]|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''~CoreVersion:''|2.1.3|\n|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|\n***/\n/***\nThis plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js]] to get the readable source code.\n***/\n///%\nif(!window.abego){window.abego={};}var invokeLater=function(_1,_2,_3){return abego.invokeLater?abego.invokeLater(_1,_2,_3):setTimeout(_1,_2);};abego.loadFile=function(_4,_5,_6){var _7=function(_8,_9,_a,_b,_c){return _8?_5(_a,_b,_9):_5(undefined,_b,_9,"Error loading %0".format([_b]));};if(_4.search(/^((http(s)?)|(file)):/)!=0){if(_4.search(/^((.\s:\s\s)|(\s\s\s\s)|(\s/))/)==0){_4="file://"+_4;}else{var _d=document.location.toString();var i=_d.lastIndexOf("/");_4=_d.substr(0,i+1)+_4;}_4=_4.replace(/\s\s/mg,"/");}loadRemoteFile(_4,_7,_6);};abego.loadTiddlyWikiStore=function(_f,_10,_11,_12){var _13=function(_14,_15){if(_12){_12(_14,"abego.loadTiddlyWikiStore",_15,_f,_11);}};var _16=function(_17,_18){var _19=_18.indexOf(startSaveArea);var _1a=_18.indexOf("<!--POST-BODY-END--"+">");var _1b=_18.lastIndexOf(endSaveArea,_1a==-1?_18.length:_1a);if((_19==-1)||(_1b==-1)){return config.messages.invalidFileError.format([_f]);}var _1c="<html><body>"+_18.substring(_19,_1b+endSaveArea.length)+"</body></html>";var _1d=document.createElement("iframe");_1d.style.display="none";document.body.appendChild(_1d);var doc=_1d.document;if(_1d.contentDocument){doc=_1d.contentDocument;}else{if(_1d.contentWindow){doc=_1d.contentWindow.document;}}doc.open();doc.writeln(_1c);doc.close();var _1f=doc.getElementById("storeArea");_17.loadFromDiv(_1f,"store");_1d.parentNode.removeChild(_1d);return null;};var _20=function(_21){_13("Error when loading %0".format([_f]),"Failed");_10(undefined,_f,_11,_21);return _21;};var _22=function(_23){_13("Loaded %0".format([_f]),"Done");_10(_23,_f,_11);return null;};var _24=function(_25,_26,_27,_28){if(_25===undefined){_20(_28);return;}_13("Processing %0".format([_f]),"Processing");var _29=config.messages.invalidFileError;config.messages.invalidFileError="The file '%0' does not appear to be a valid TiddlyWiki file";try{var _2a=new TiddlyWiki();var _2b=_16(_2a,_25);if(_2b){_20(_2b);}else{_22(_2a);}}catch(ex){_20(exceptionText(ex));}finally{config.messages.invalidFileError=_29;}};_13("Start loading %0".format([_f]),"Started");abego.loadFile(_f,_24,_11);};(function(){if(abego.TiddlyWikiIncluder){return;}var _2c="waiting";var _2d="loading";var _2e=1000;var _2f=-200;var _30=-100;var _31=-300;var _32;var _33=[];var _34={};var _35=[];var _36;var _37=[];var _38;var _39=function(){if(_32===undefined){_32=config.options.chkUseInclude===undefined||config.options.chkUseInclude;}return _32;};var _3a=function(url){return "No include specified for %0".format([url]);};var _3c=function(){var _3d=_35;_35=[];if(_3d.length){for(var i=0;i<_37.length;i++){_37[i](_3d);}}};var _3f;var _40=function(){if(_36!==undefined){clearInterval(_36);}_3f=0;var _41=function(){abego.TiddlyWikiIncluder.sendProgress("","","Done");};_36=setInterval(function(){_3f++;if(_3f<=10){return;}clearInterval(_36);_36=undefined;abego.TiddlyWikiIncluder.sendProgress("Refreshing...","","");refreshDisplay();invokeLater(_41,0,_2f);},1);};var _42=function(_43){var _44;for(var i=0;i<_33.length;i++){var _46=abego.TiddlyWikiIncluder.getStore(_33[i]);if(_46&&(_44=_43(_46,_33[i]))){return _44;}}};var _47=function(){if(!window.store){return invokeLater(_47,100);}var _48=store.fetchTiddler;store.fetchTiddler=function(_49){var t=_48.apply(this,arguments);if(t){return t;}if(config.shadowTiddlers[_49]!==undefined){return undefined;}if(_49==config.macros.newTiddler.title){return undefined;}return _42(function(_4b,url){var t=_4b.fetchTiddler(_49);if(t){t.includeURL=url;}return t;});};if(_33.length){_40();}};var _4e=function(){if(!window.store){return invokeLater(_4e,100);}var _4f=store.getTiddlerText("IncludeList");if(_4f){wikify(_4f,document.createElement("div"));}};var _50=function(_51){var _52=function(){var _53=store.forEachTiddler;var _54=function(_55){var _56={};var _57;var _58=function(_59,_5a){if(_56[_59]){return;}_56[_59]=1;if(_57){_5a.includeURL=_57;}_55.apply(this,arguments);};_53.call(store,_58);for(var n in config.shadowTiddlers){_56[n]=1;}_56[config.macros.newTiddler.title]=1;_42(function(_5c,url){_57=url;_5c.forEachTiddler(_58);});};store.forEachTiddler=_54;try{return _51.apply(this,arguments);}finally{store.forEachTiddler=_53;}};return _52;};var _5e=function(_5f,_60){return _5f[_60]=_50(_5f[_60]);};abego.TiddlyWikiIncluder={};abego.TiddlyWikiIncluder.setProgressFunction=function(_61){_38=_61;};abego.TiddlyWikiIncluder.getProgressFunction=function(_62){return _38;};abego.TiddlyWikiIncluder.sendProgress=function(_63,_64,_65){if(_38){_38.apply(this,arguments);}};abego.TiddlyWikiIncluder.onError=function(url,_67){displayMessage("Error when including '%0':\sn%1".format([url,_67]));};abego.TiddlyWikiIncluder.hasPendingIncludes=function(){for(var i=0;i<_33.length;i++){var _69=abego.TiddlyWikiIncluder.getState(_33[i]);if(_69==_2c||_69==_2d){return true;}}return false;};abego.TiddlyWikiIncluder.getIncludes=function(){return _33.slice();};abego.TiddlyWikiIncluder.getState=function(url){var s=_34[url];if(!s){return _3a(url);}return typeof s=="string"?s:null;};abego.TiddlyWikiIncluder.getStore=function(url){var s=_34[url];if(!s){return _3a(url);}return s instanceof TiddlyWiki?s:null;};abego.TiddlyWikiIncluder.include=function(url,_6f){if(!_39()||_34[url]){return;}var _70=this;_33.push(url);_34[url]=_2c;var _71=function(_72,_73,_74,_75){if(_72===undefined){_34[url]=_75;_70.onError(url,_75);return;}_34[url]=_72;_35.push(url);invokeLater(_3c);};var _76=function(){_34[url]=_2d;abego.loadTiddlyWikiStore(url,_71,null,_38);};if(_6f){invokeLater(_76,_6f);}else{_76();}};abego.TiddlyWikiIncluder.forReallyEachTiddler=function(_77){var _78=function(){store.forEachTiddler(_77);};_50(_78).call(store);};abego.TiddlyWikiIncluder.getFunctionUsingForReallyEachTiddler=_50;abego.TiddlyWikiIncluder.useForReallyEachTiddler=_5e;abego.TiddlyWikiIncluder.addListener=function(_79){_37.push(_79);};abego.TiddlyWikiIncluder.addListener(_40);if(config.options.chkUseInclude===undefined){config.options.chkUseInclude=true;}config.shadowTiddlers.AdvancedOptions+="\sn<<option chkUseInclude>> Include ~TiddlyWikis (IncludeList | IncludeState | [[help|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]])\sn^^(Reload this ~TiddlyWiki to make changes become effective)^^";config.shadowTiddlers.IncludeState="<<includeState>>";var _7a=function(e,_7c,_7d){if(!anim||!abego.ShowAnimation){e.style.display=_7c?"block":"none";return;}anim.startAnimating(new abego.ShowAnimation(e,_7c,_7d));};abego.TiddlyWikiIncluder.getDefaultProgressFunction=function(){setStylesheet(".includeProgressState{\sn"+"background-color:#FFCC00;\sn"+"position:absolute;\sn"+"right:0.2em;\sn"+"top:0.2em;\sn"+"width:7em;\sn"+"padding-left:0.2em;\sn"+"padding-right:0.2em\sn"+"}\sn","abegoInclude");var _7e=function(){var e=document.createElement("div");e.className="includeProgressState";e.style.display="none";document.body.appendChild(e);return e;};var _80=_7e();var _81=function(_82){removeChildren(_80);createTiddlyText(_80,_82);_7a(_80,true,0);};var _83=function(){invokeLater(function(){_7a(_80,false,_2e);},100,_30);};var _84=function(_85,_86,_87,url,_89){if(_87=="Done"||_87=="Failed"){_83();return;}if(_86=="abego.loadTiddlyWikiStore"){_3f=0;if(_87=="Processing"){_81("Including...");}}else{_81(_85);}};return _84;};abego.TiddlyWikiIncluder.setProgressFunction(abego.TiddlyWikiIncluder.getDefaultProgressFunction());config.macros.include={};config.macros.include.handler=function(_8a,_8b,_8c,_8d,_8e,_8f){_8c=_8e.parseParams("url",null,true,false,true);var _90=parseInt(getParam(_8c,"delay","0"));var _91=_8c[0]["url"];var _92=getFlag(_8c,"hide",false);if(!_92){createTiddlyText(createTiddlyElement(_8a,"code"),_8d.source.substring(_8d.matchStart,_8d.nextMatch));}for(var i=0;_91&&i<_91.length;i++){abego.TiddlyWikiIncluder.include(_91[i],_90);}};config.macros.includeState={};config.macros.includeState.handler=function(_94,_95,_96,_97,_98,_99){var _9a=function(){var s="";var _9c=abego.TiddlyWikiIncluder.getIncludes();if(!_9c.length){return "{{noIncludes{\snNo includes or 'include' is disabled (see AdvancedOptions)\sn}}}\sn";}s+="|!Address|!State|\sn";for(var i=0;i<_9c.length;i++){var inc=_9c[i];s+="|{{{"+inc+"}}}|";var t=abego.TiddlyWikiIncluder.getState(inc);s+=t?"{{{"+t+"}}}":"included";s+="|\sn";}s+="|includeState|k\sn";return s;};var _a0=function(){removeChildren(div);wikify(_9a(),div);if(abego.TiddlyWikiIncluder.hasPendingIncludes()){invokeLater(_a0,500,_31);}};var div=createTiddlyElement(_94,"div");invokeLater(_a0,0,_31);};var _a2=Tiddler.prototype.isReadOnly;Tiddler.prototype.isReadOnly=function(){return _a2.apply(this,arguments)||this.isIncluded();};Tiddler.prototype.isIncluded=function(){return this.includeURL!=undefined;};Tiddler.prototype.getIncludeURL=function(){return this.includeURL;};var _a3={getMissingLinks:1,getOrphans:1,getTags:1,reverseLookup:1,updateTiddlers:1};for(var n in _a3){_5e(TiddlyWiki.prototype,n);}var _a5=function(){if(abego.IntelliTagger){_5e(abego.IntelliTagger,"assistTagging");}};var _a6=function(){if(config.macros.forEachTiddler){_5e(config.macros.forEachTiddler,"findTiddlers");}};_47();invokeLater(_4e,100);invokeLater(_a5,100);invokeLater(_a6,100);})();\n//%/\n
<!--{{{-->\n\n<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references revisions jump fullscreen'></div>\n\n<div class='title' macro='view title'></div>\n\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>) <span macro='view renamedSubTitle'></span> <span macro='view historicalSubTitle'></span></div>\n\n<div class='tagging' macro='tagging'></div>\n\n<div class='tagged' macro='tags'></div>\n\n<div class='viewer' macro='view text wikified'></div>\n\n<div class='tagClear'></div>\n\n<!--}}}-->\n\n
[img[filestore/uploads/datamodels/pearce-annex1fig.png]]
<<tagCloud>>
http://rob.opendot.cl/index.php/useful-stuff/ffmpeg-x264-encoding-guide/\n\nstreaming server hinting: http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2006-December/005942.html\n\nffmpeg -pass 1 -passlogfile bh.VOB -threads 0 -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51 -i bh.VOB -vcodec libx264 -b 614400 -s 320x240 -aspect 4:3 -an -y bh.mp4\n\nffmpeg -i bh.VOB -pass 2 -passlogfile bh.VOB -threads 0 -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51-vcodec libx264 -b 614400 -s 320x240 -aspect 4:3 -acodec libfaac -y bh.mp4\n\n(from Mark Pilgrim)
''Saturday 2/28/2009''\n[[Take a look at this website|http://www.bohemiancoding.com/]] This site has some good ideas and a cool look in regard to Web Design. \n\n[[Some ideas for a Omeka site|http://www.learner.org/resources/series13.html]]\n \n\n[[Interface dot com|http://www.interfaceglobal.com/]]\n\n[[Boston University|http://www.bu.edu/]] Simple clean design\n\nhttp://JoshuaBradley.co.uk/\n\nhttp://divitodesign.com/css/960-css-framework-learn-basics/\nBasic typeography and such
http://www.ad.jyu.fi/users/a/ankarjal/ITKD50/Dublin%20Core%20Metadata%20Template.htm\n\nhttp://alimanfoo.wordpress.com/2008/01/30/on-the-oais-information-model-as-a-platform-independent-model-pim-in-a-model-driven-software-architecture/\n\nhttp://www.webarchiv.cz/generator/dc.php?lang=en\n\nhttp://sourceforge.net/projects/dcmetatoolkit\n\n\n\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Open options panel'>><<exportTiddlers>><<exportLink>><<importLink>><<login>>\n
[[Home|/]] <<newTiddler label: "Add Tiddler">><<newJournal label: "Add Dated Entry">>\n[[Contents]]\n\n
<html>\n<body bgcolor="#ffffff" text="#000000"><font face="monospace">\n<font color="#8080ff"># video.awk</font><br>\n<font color="#8080ff"># 2009-08-27</font><br>\n<font color="#8080ff"># Takes dumped item data from III and formats it for the web</font><br>\n<font color="#8080ff"># Part of a pipeline that starts with the data sorted by using sort command</font><br>\n<br>\n<br>\n<font color="#ff40ff">BEGIN</font> { <font color="#ff40ff">FS</font> = <font color="#ff6060">"</font><font color="#ff40ff">\st</font><font color="#ff6060">"</font><br>\n <font color="#ff40ff">OFS</font> = <font color="#ff6060">"</font><font color="#ff40ff">\st</font><font color="#ff6060">"</font><font color="#ff40ff">;</font><br>\n indexes = <font color="#ff6060">"count,circs,uses"</font><br>\n <font color="#00ffff">split</font>(indexes<font color="#ff40ff">,</font> cd<font color="#ff40ff">,</font> <font color="#ff6060">","</font>)<br>\n <font color="#00ffff">split</font>(indexes<font color="#ff40ff">,</font> dvd<font color="#ff40ff">,</font> <font color="#ff6060">","</font>)<br>\n <font color="#00ffff">split</font>(indexes<font color="#ff40ff">,</font> video<font color="#ff40ff">,</font> <font color="#ff6060">","</font>)<br>\n <font color="#ff6060"><b>print</b></font> startDtml() > <font color="#ff6060">"c_cds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> startTable() > <font color="#ff6060">"c_cds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> startDtml() > <font color="#ff6060">"c_dvds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> startTable() > <font color="#ff6060">"c_dvds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> startDtml() > <font color="#ff6060">"c_videos.html"</font><br>\n <font color="#ff6060"><b>print</b></font> startTable() > <font color="#ff6060">"c_videos.html"</font><br>\n<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> startHtml(title) {<br>\n s = <font color="#ff6060">"<html></font><font color="#ff40ff">\sn</font><font color="#ff6060"><head></font><font color="#ff40ff">\sn</font><font color="#ff6060"><title>"</font> title <font color="#ff6060">"</title></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n s = s <font color="#ff6060">"<link rel=</font><font color="#ff40ff">\s"</font><font color="#ff6060">stylesheet</font><font color="#ff40ff">\s"</font><font color="#ff6060"> type=</font><font color="#ff40ff">\s"</font><font color="#ff6060">text/css</font><font color="#ff40ff">\s"</font><font color="#ff6060"> href=</font><font color="#ff40ff">\s"</font><font color="#ff6060">/bk.css</font><font color="#ff40ff">\s"</font><font color="#ff6060"> /></font><font color="#ff40ff">\sn</font><font color="#ff6060"><link rel=</font><font color="#ff40ff">\s"</font><font color="#ff6060">stylesheet</font><font color="#ff40ff">\s"</font><font color="#ff6060"> type=</font><font color="#ff40ff">\s"</font><font color="#ff6060">text/css</font><font color="#ff40ff">\s"</font><font color="#ff6060"> href=</font><font color="#ff40ff">\s"</font><font color="#ff6060">style_sheet</font><font color="#ff40ff">\s"</font><font color="#ff6060"> />"</font> <br>\n s = s <font color="#ff6060">"</head></font><font color="#ff40ff">\sn</font><font color="#ff6060"><body></font><font color="#ff40ff">\sn</font><font color="#ff6060"><img src=</font><font color="#ff40ff">\s"</font><font color="#ff6060">/images/2rf.gif</font><font color="#ff40ff">\s"</font><font color="#ff6060"> align=</font><font color="#ff40ff">\s"</font><font color="#ff6060">middle</font><font color="#ff40ff">\s"</font><font color="#ff6060"> hspace=</font><font color="#ff40ff">\s"</font><font color="#ff6060">10</font><font color="#ff40ff">\s"</font><font color="#ff6060"> ><h1>"</font> title <font color="#ff6060">"</h1></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> endHtml() {<br>\n s = <font color="#ff6060">"</body></font><font color="#ff40ff">\sn</font><font color="#ff6060"></html>"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> startDtml(title) {<br>\n s = <font color="#ff6060">"<dtml-var standard_html_header></font><font color="#ff40ff">\sn</font><font color="#ff6060"><img src=</font><font color="#ff40ff">\s"</font><font color="#ff6060">/images/2rf.gif</font><font color="#ff40ff">\s"</font><font color="#ff6060"> align=</font><font color="#ff40ff">\s"</font><font color="#ff6060">middle</font><font color="#ff40ff">\s"</font><font color="#ff6060"> hspace=</font><font color="#ff40ff">\s"</font><font color="#ff6060">10</font><font color="#ff40ff">\s"</font><font color="#ff6060"> ><h1>"</font>title<font color="#ff6060">"</h1>"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> endDtml() {<br>\n s = <font color="#ff6060">"<dtml-var standard_html_footer>"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> startTable() {<br>\n s = <font color="#ff6060">"<table></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> endTable() {<br>\n s = <font color="#ff6060">"</table></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> printRow(count<font color="#ff40ff">,</font> title) {<br>\n s = <font color="#ff6060">"<tr><td>"</font>count<font color="#ff6060">"</td><td>"</font>title<font color="#ff6060">"</td></tr>"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> commas(n) {<br>\n <font color="#00ffff">gsub</font>(<font color="#ff6060">/,/</font><font color="#ff40ff">,</font><font color="#ff6060">""</font><font color="#ff40ff">,</font>n)<br>\n point = <font color="#00ffff">index</font>(n<font color="#ff40ff">,</font><font color="#ff6060">"."</font>) - <font color="#ff6060">1</font><br>\n <font color="#ff6060"><b>if</b></font> (point < <font color="#ff6060">0</font>) point = <font color="#00ffff">length</font>(n)<br>\n <font color="#ff6060"><b>while</b></font> (point > <font color="#ff6060">3</font>) {<br>\n point -= <font color="#ff6060">3</font><br>\n n = <font color="#00ffff">substr</font>(n<font color="#ff40ff">,</font><font color="#ff6060">1</font><font color="#ff40ff">,</font>point)<font color="#ff6060">","</font><font color="#00ffff">substr</font>(n<font color="#ff40ff">,</font>point + <font color="#ff6060">1</font>)<br>\n }<br>\n <font color="#ff6060"><b>return</b></font> n<br>\n}<br>\n<br>\n<font color="#ff6060"><b>function</b></font> outputResults(type<font color="#ff40ff">,</font> counter) {<br>\n totalcnt = counter[<font color="#ff40ff">"count"</font>]<br>\n tc = commas(totalcnt)<br>\n circs = counter[<font color="#ff40ff">"circs"</font>]<br>\n noncirccount = counter[<font color="#ff40ff">"count"</font>] - counter[<font color="#ff40ff">"uses"</font>]<br>\n noncircpercent = (noncirccount / totalcnt) * <font color="#ff6060">100</font><br>\n s = <font color="#ff6060">"<h1>Report for "</font> type <font color="#ff6060">"</h1></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n s = s <font color="#ff6060">"<h3>Total Item Count: "</font> commas(totalcnt) <font color="#ff6060">" </h3></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n s = s <font color="#ff6060">"<h3>Count of Non Circulating Items: "</font> commas(noncirccount) <font color="#ff6060">"</h3></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n s = s <font color="#ff6060">"<h3>Percent Non Circulating Items: "</font> noncircpercent <font color="#ff6060">"</h3></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n s = s <font color="#ff6060">"<h3>Total Circs: "</font> commas(circs) <font color="#ff6060">"</h3></font><font color="#ff40ff">\sn</font><font color="#ff6060">"</font><br>\n <font color="#ff6060"><b>return</b></font> s<br>\n}<br>\n<br>\n<br>\n<font color="#ff40ff">$3</font> ~ <font color="#ff6060">/whcd/</font> {<br>\n cd[<font color="#ff40ff">"count"</font>]++<br>\n cd[<font color="#ff40ff">"circs"</font>]+=<font color="#ff40ff">$2</font><br>\n <font color="#ff6060"><b>if</b></font> (<font color="#ff40ff">$2</font> > <font color="#ff6060">0</font>) <br>\n cd[<font color="#ff40ff">"uses"</font>]++ <br>\n <font color="#ff6060"><b>print</b></font> printRow(<font color="#ff40ff">$2</font><font color="#ff40ff">,</font><font color="#ff40ff">$1</font>) > <font color="#ff6060">"c_cds.html"</font><br>\n}<br>\n<br>\n<br>\n<font color="#ff40ff">$3</font> ~ <font color="#ff6060">/whdvd/</font> {<br>\n dvd[<font color="#ff40ff">"count"</font>]++<br>\n dvd[<font color="#ff40ff">"circs"</font>]+=<font color="#ff40ff">$2</font><br>\n <font color="#ff6060"><b>if</b></font> (<font color="#ff40ff">$2</font> > <font color="#ff6060">0</font>) <br>\n dvd[<font color="#ff40ff">"uses"</font>]++ <br>\n <font color="#ff6060"><b>print</b></font> printRow(<font color="#ff40ff">$2</font><font color="#ff40ff">,</font><font color="#ff40ff">$1</font>) > <font color="#ff6060">"c_dvds.html"</font><br>\n}<br>\n<br>\n<font color="#ff40ff">$3</font> ~ <font color="#ff6060">/whv/</font> {<br>\n video[<font color="#ff40ff">"count"</font>]++<br>\n video[<font color="#ff40ff">"circs"</font>]+=<font color="#ff40ff">$2</font><br>\n <font color="#ff6060"><b>if</b></font> (<font color="#ff40ff">$2</font> > <font color="#ff6060">0</font>) <br>\n video[<font color="#ff40ff">"uses"</font>]++ <br>\n <font color="#ff6060"><b>print</b></font> printRow(<font color="#ff40ff">$2</font><font color="#ff40ff">,</font><font color="#ff40ff">$1</font>) > <font color="#ff6060">"c_videos.html"</font><br>\n}<br>\n<br>\n<br>\n<font color="#ff40ff">END</font> { <br>\n <font color="#ff6060"><b>print</b></font> startDtml() > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> outputResults(<font color="#ff6060">"CDs"</font><font color="#ff40ff">,</font> cd) > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> <font color="#ff6060">"<a href=</font><font color="#ff40ff">\s"</font><font color="#ff6060">c_cds.html</font><font color="#ff40ff">\s"</font><font color="#ff6060">>View CD Data</a> (in decending order)</font><font color="#ff40ff">\sn\sn</font><font color="#ff6060">"</font> > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> outputResults(<font color="#ff6060">"DVDs"</font><font color="#ff40ff">,</font> dvd) > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> <font color="#ff6060">"<a href=</font><font color="#ff40ff">\s"</font><font color="#ff6060">c_dvds.html</font><font color="#ff40ff">\s"</font><font color="#ff6060">>View DVD Data</a> (in decending order)</font><font color="#ff40ff">\sn\sn</font><font color="#ff6060">"</font> > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> outputResults(<font color="#ff6060">"Videos"</font><font color="#ff40ff">,</font> video) > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> <font color="#ff6060">"<a href=</font><font color="#ff40ff">\s"</font><font color="#ff6060">c_videos.html</font><font color="#ff40ff">\s"</font><font color="#ff6060">>View Video Tape Data</a> (in decending order)</font><font color="#ff40ff">\sn\sn</font><font color="#ff6060">"</font> > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> endDtml() > <font color="#ff6060">"c_summary.html"</font><br>\n <font color="#ff6060"><b>print</b></font> endTable() > <font color="#ff6060">"c_cds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> endDtml() > <font color="#ff6060">"c_cds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> endTable() > <font color="#ff6060">"c_dvds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> endDtml() > <font color="#ff6060">"c_dvds.html"</font><br>\n <font color="#ff6060"><b>print</b></font> endTable() > <font color="#ff6060">"c_videos.html"</font><br>\n <font color="#ff6060"><b>print</b></font> endDtml() > <font color="#ff6060">"c_videos.html"</font><br>\n}<br>\n <br>\n<br>\n</font></body></html>
/***\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//}}}
"Becoming an expert in data structures is... not of much value if the thoughts you want to express are all muddled"
You need to get information into the "records" about stuff that \n1. isrelevant to the container, and \n2. relevant to its contents, and \n3. relevant to its surroundings (the context and task of the reader)
[img[filestore/uploads/webservices/repository_OSID_interfaceDiagram.png]]
/***\n\n|Name|ToggleSideBarMacro|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#ToggleSideBarMacro|\n|Version|1.0|\n|Requires|~TW2.x|\n!Description:\nProvides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.\n\n!Demo\n<<toggleSideBar "Toggle Sidebar">>\n\n!Usage:\n{{{<<toggleSideBar>>}}} <<toggleSideBar>>\nadditional options:\n{{{<<toggleSideBar label tooltip show/hide>>}}} where:\nlabel = custom label for the button,\ntooltip = custom tooltip for the button,\nshow/hide = use one or the other, determines whether the sidebar is shown at first or not.\n(default is to show the sidebar)\n\nYou can add it to your tiddler toolbar, your MainMenu, or where you like really.\nIf you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:\n{{{ .HideSideBarButton {float:right;} }}}\n\n!History\n*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour. \n*20-07-06: version 0.11\n*27-04-06: version 0.1: working.\n\n!Code\n***/\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em;}\sn"+"",\n styleShow : " ",\n arrow1: "ë",\n arrow2: "û"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n\n//}}}
/*\n QuizPlugin\n\n*/\n\n/***\n|Name|QuizPlugin|\n|Description|A macro to generate an interactive quiz|\n|Source||\n|Documentation||\n|Version|0.1|\n|Author|Michael Mahemoff, Osmosoft|\n|''License:''|[[BSD open source license]]|\n|~CoreVersion|2.2|\n\nUsage:\n< < quiz > > (without any of the spaces)\nThe macro will look for all tiddlers tagged "Question". It will generate a question for each of them. The example question tiddlers in the demo self-document how to author question tiddlers.\n\nOf course, anyone can cheat by viewing source. But then, they'd be cheaters with their pants on fire.\n\nMore options in the future and a reset quiz button. Maybe even a secure tiddlyweb based server-side to save cheaters from themselves.\n***/\n\n/*{{{*/\nif(!version.extensions.QuizPlugin) {\n\n version.extensions.QuizPlugin = {installed:true};\n\n (function() {\n\n var $ = jQuery;\n jQuery.fn.attach = function(html) { return this.append(html).children(":last"); };\n\n config.macros.quiz = {\n\n init: function() {\n var stylesheet = store.getTiddlerText(tiddler.title + "##StyleSheet");\n config.shadowTiddlers["StyleSheetQuizPlugin"] = stylesheet;\n store.addNotification("StyleSheetQuizPlugin", refreshStyles);\n },\n\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n $(place).parents(".tiddler").find(".defaultCommand").removeClass("defaultCommand");\n var quizEl = $(createTiddlyElement(place, "div", null, "quiz"));\n $.each(shuffle(store.getTaggedTiddlers("question")), function(i, questionTiddler) {\n quizEl.append(buildQuestionEl(parseQuestion(questionTiddler.text)));\n });\n quizEl\n .append($("<button>check</button>").click(function() { checkQuiz(quizEl); }))\n .append($("<div class='quizStatus finale' />"));\n }\n\n };\n\n function parseQuestion(questionText) {\n var question = {\n challenge: wikifyStatic(trim(questionText.replace(/^\s*.*/mg, ""))),\n wrongOptions: questionText.match(/^\s* .*$/mg),\n rightOptions: questionText.match(/^\s*\s* .*$/mg),\n };\n for (i=0; i<question.wrongOptions.length; i++) {\n question.wrongOptions[i] = question.wrongOptions[i].replace(/^\s*+ /,"");\n }\n for (i=0; i<question.rightOptions.length; i++) {\n question.rightOptions[i] = question.rightOptions[i].replace(/^\s*+ /,"");\n }\n question.options = shuffle(question.wrongOptions.concat(question.rightOptions));\n return question;\n }\n\n function buildQuestionEl(question) {\n var questionEl = $("<div class='question'/>")\n // .append("<div class='challenge'>"+question.challenge+"</div>")\n // .append("<div class='choose'>Choose " + question.rightOptions.length + "</div>");\n .append("<div class='challenge'>"+question.challenge + " " +\n "<span class='choose'>(choose " + question.rightOptions.length + ")</span></div>");\n for (i=0; i<question.options.length; i++) {\n var isRight = (question.rightOptions.indexOf(question.options[i])!=-1);\n $("<div class='option'/>")\n .attach("<input type='checkbox' />")\n /*\n .click(function() {\n // console.log($(this).parent().siblings(".option"));\n if (! $(this).is(":checked")) return;\n var checksRemaining = question.rightOptions.length-1;\n $(this).parent().siblings(".option").find(":checkbox").each(function() {\n console.log(this);\n if ($(this).is(":checked")) {\n if (checksRemaining-- <= 0) $(this).attr("checked", false);\n }\n });\n })\n */\n .end()\n .addClass(isRight ? "right" : "wrong")\n .attach("<span>"+question.options[i]+"</span>")\n .click(function() { $(this).prev().click(); })\n .end()\n .appendTo(questionEl);\n }\n questionEl.append("<div class='status'></div>");\n return questionEl;\n }\n\n function checkQuiz(quizEl) {\n console.log("check");\n var tally = 0;\n quizEl.find(".question").each(function() {\n var isCorrect = true;\n var $question = $(this);\n $question.find(".option").each(function() {\n var optionIsRight = $(this).hasClass("right");\n var userSaysItsRight = $(this).find(":checkbox").is(":checked");\n if (optionIsRight!=userSaysItsRight) isCorrect = false;\n });\n if (isCorrect) tally++;\n $question.find(".status")\n .html(isCorrect ? "<span class='correct finale'>Correct</span>" :\n "<span class='incorrect finale'>Incorrect</span>");\n });\n var total = quizEl.find(".question").length;\n quizEl.find(".quizStatus")\n .empty()\n .append(tally + " of " + total + " correct. ")\n .append((tally==total) ? " Well done!" : "")\n .attach("<span class='pseudolink'>Reset</span>")\n .click(function() {\n $(quizEl).find(".finale").fadeOut(function() { $(this).empty(); });\n $(quizEl).find(":checkbox").attr("checked", false);\n })\n .end();\n console.log("*** reveal finale");\n revealFinale();\n }\n\n function revealFinale() {\n console.log("reveal finale");\n $(".right span").addClass("rightFinale");\n $(".finale").fadeIn();\n }\n\n function clearFinale() {\n $(".right span").removeClass("rightFinale");\n $(".finale").hide();\n }\n\n // adapted fro mhttp://jsfromhell.com/array/shuffle\n function shuffle(o) {\n for (var j, x, i = o.length; i;\n j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x)\n ;\n return o;\n }\n\n config.macros.quiz.init();\n\n function trim(s) { return s.replace(/^[ \sn\st]*/, "").replace(/[ \sn\st]*$/, ""); }\n\n })();\n\n\n/***\n!StyleSheet\n\n.quiz .finale { display: none; }\n.quiz .pseudolink { text-decoration: underline; color:[[ColorPalette::SecondaryDark]]; cursor: pointer; }\n.quizStatus { margin: 1em 0; font-weight: bold; }\n\n.question { margin: 1em 0; }\n.question .choose { font-style: italic; }\n.question .correct { color: #080; }\n.question .incorrect { color: #b00; }\n\n.option .rightness { margin-left: 0.5em; }\n.option span { cursor: pointer; }\n\n.rightFinale { font-weight: bold; text-decoration: underline; }\n\n!(end of StyleSheet)\n\n***/\n\n} // end of 'install only once'\n/*}}}*/\n
/***\n|Name|AutoOpenTiddlersPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#AutoOpenTiddlersPlugin|\n|Version|0.21|\n|Requires|~TW2.x|\n!!!Description:\nOpen a user defined number of recent tiddlers automatically when the TW loads.\nYou can also specify a tag and only load tiddlers that have that tag.\nTo change the number of tiddlers automatically opened, or define a tag to use, ed the config.autoOpenTiddlers part of the code below.\n\n!!!To Do\n*add an option to exclude tiddlers with a particular tag\n\n!!!Code\n***/\n//{{{\n//edit this section to change the default settings\nconfig.autoOpenTiddlers = \n{\n count: 1, //number of tiddlers opened.\n tag: undefined //change if you want to open tiddlers with a specific tag, eg: 'DefaultTiddlers'\n}\n\n\nconfig.autoOpenTiddlers.handler = function()\n{\n if (this.tag == undefined)\n var newTiddlers = store.getTiddlers("modified");\n else\n var newTiddlers = store.getTaggedTiddlers(this.tag,"modified");\n var newTiddlers = newTiddlers.reverse();\n var max = Math.min(this.count,newTiddlers.length-1);\n for (var i=max; i>=0; i--)\n { story.displayTiddler(null,newTiddlers[i].title);} \n}\n\nwindow.old_lewcid_autoOpenTiddlers_restart = restart;\nrestart = function ()\n{\n window.old_lewcid_autoOpenTiddlers_restart();\n config.autoOpenTiddlers.handler();\n}\n//}}}
http://www.cdlib.org/cdlinfo/2010/05/21/webinar-of-merritt-repository-development/
<html>\n<p>The following are some examples of what the user interface for our system displays: (download and zoom in on the files for closer viewing, if you like)</p>\n<p style="padding-left: 30px;"><a href="http://www.chrisfrymann.com/image/mods/triples.jpg">RDF triples</a><br />\n<a href="http://www.chrisfrymann.com/image/mods/json.jpg">JSON view of data</a><br />\n<a href="http://www.chrisfrymann.com/image/mods/json.txt">JSON manifestation of data for processessing by client-side JavaScript</a><br />\n<a href="http://www.chrisfrymann.com/image/mods/rdf.xml">RDF XML file</a><br />\n<a href="http://www.chrisfrymann.com/image/mods/rdf_graph.png">RDF graph</a></p></html>
http://annotation.lanl.gov/premis/
/***\n|''Name:''|BreadCrumbsPlugin|\n|''Version:''|2.2.1 (05-July-2007)|\n|''Author:''|AlanHecht|\n|''Adapted By:''|[[Jack]]|\n|''Type:''|Plugin|\n!Description\nThis plugin creates an area at the top of the tiddler area that displays "breadcrumbs" of where you've been. This is especially useful for ~TWs using SinglePageMode by Eric Schulman.\n!Usage\nJust install the plugin and tag with systemConfig. Optionally position the following div in your PageTemplate to control the positioning of the breadcrumbs menu:\n{{{\n<div id='breadCrumbs'></div>\n}}}\n!Revision History\n* Original by AlanHecht\n* 2.0 Made 2.0.x compatible by [[Jack]]\n* Made 2.0.10 compatible (onstart paramifier)\n* Bugfix -> return false in onClickTiddlerLink()\n* 2.2 Made 2.2.x compatible\n!Code\n***/\n\n// // Use the following line to set the number of breadcrumbs to display before rotating them off the list.\n//{{{\nversion.extensions.breadCrumbs = {major: 2, minor: 2, revision: 1, date: new Date("Jul 5, 2007")};\nvar crumbsToShow = 7;\nvar breadCrumbs = [];\n\nonClickTiddlerLink_orig_breadCrumbs = onClickTiddlerLink;\nonClickTiddlerLink = function(e){\n onClickTiddlerLink_orig_breadCrumbs(e);\n breadcrumbsAdd(e);\n return false;\n}\n\nrestart_orig_breadCrumbs = restart;\nfunction restart() {\n invokeParamifier(params,"onstart");\n var defaultParams = store.getTiddlerText("DefaultTiddlers").parseParams("open",null,false);\n invokeParamifier(defaultParams,"onstart");\n breadCrumbs = [];\n breadcrumbsRefresh();\n window.scrollTo(0,0);\n return false;\n}\n\nfunction breadcrumbsAdd(e) {\n var uniqueCrumb = true;\n var crumbIndex = 0;\n if (!e) var e = window.event;\n var target = resolveTarget(e);\n var thisCrumb="[["+resolveTarget(e).getAttribute("tiddlyLink")+"]]";\n var lastInactiveCrumb = breadCrumbs.length -(breadCrumbs.length < crumbsToShow ? breadCrumbs.length : crumbsToShow);\n for(t=lastInactiveCrumb; t<breadCrumbs.length; t++)\n if(breadCrumbs[t] == thisCrumb) {\n uniqueCrumb = false;\n crumbIndex = t+1;\n }\n if(uniqueCrumb)\n breadCrumbs.push(thisCrumb);\n else\n breadCrumbs = breadCrumbs.slice(0,crumbIndex);\n breadcrumbsRefresh(); \n}\n\nfunction breadcrumbsRefresh() {\n \n if (!document.getElementById("breadCrumbs")) {\n // Create breadCrumbs div\n var ca = document.createElement("div");\n ca.id = "breadCrumbs";\n ca.style.visibility= "hidden";\n var targetArea = document.getElementById("tiddlerDisplay")||document.getElementById("storyDisplay");\n targetArea.parentNode.insertBefore(ca,targetArea);\n }\n\n var crumbArea = document.getElementById("breadCrumbs");\n crumbArea.style.visibility = "visible";\n removeChildren(crumbArea);\n createTiddlyButton(crumbArea,"Home",null,restart);\n crumbArea.appendChild(document.createTextNode(" > "));\n \n var crumbLine = "";\n var crumbCount = breadCrumbs.length;\n var firstCrumb = crumbCount -(crumbCount < crumbsToShow ? crumbCount : crumbsToShow);\n for(t=firstCrumb; t<crumbCount; t++) {\n if(t != firstCrumb)\n crumbLine += " > ";\n crumbLine += breadCrumbs[t];\n }\n wikify(crumbLine,crumbArea)\n}\n\n\n//}}}
http://svn.zope.org/Zope/tags/2.11.3/doc/ZOPE3.txt?rev=99667&view=auto\n\n{{{\n/srv/Zope/Products/CookieCrumbler/CookieCrumbler.py:27: DeprecationWarning: \nHTMLFile is deprecated. import from App.special_dtml instead from Globals import HTMLFile\n\n/srv/Zope/Products/CookieCrumbler/CookieCrumbler.py:374: DeprecationWarning: \nInitializeClass is deprecated. import from App.class_init instead Globals.InitializeClass(CookieCrumbler)\n\n/srv/Zope/Products/Formulator/__init__.py:1: DeprecationWarning: \nDTMLFile is deprecated. import from App.special_dtml instead from Globals import DTMLFile\n\n/srv/Zope/Products/Formulator/Form.py:4: DeprecationWarning: \nPersistent is deprecated. import from Persistence instead from Globals import DTMLFile, Persistent\n\n/srv/Zope/Products/Formulator/FieldRegistry.py:3: DeprecationWarning: \nImageFile is deprecated. import from App.ImageFile instead from Globals import ImageFile\n\n/srv/Zope/lib/python/Products.OAICore-2.3-py2.6.egg/Products/OAICore/core.py:7: DeprecationWarning: \nPersistentMapping is deprecated. import from Persistence instead from Globals import PersistentMapping\n\n/srv/Zope/Products/ParsedXML/DOM/Core.py:59: DeprecationWarning: \nThe sre module is deprecated, please import re. import sre # Note that Python 1.5.2's re module chokes. Require sre.\n\n/srv/Zope/Products/ZWiki/__init__.py:12: DeprecationWarning: \npackage_home is deprecated. import from App.Common instead from Globals import package_home, MessageDialog, ImageFile\n\n/srv/Zope/Products/ZWiki/__init__.py:12: DeprecationWarning: \nMessageDialog is deprecated. import from App.Dialogs instead from Globals import package_home, MessageDialog, ImageFile\n\n/srv/Zope/Products/ZWiki/OutlineSupport.py:54: DeprecationWarning: \nREPLACEABLE is deprecated. import from OFS.ObjectManager instead from Globals import InitializeClass, REPLACEABLE\n\n/srv/Zope/Products/ParsedXML/DOM/Core.py:59: DeprecationWarning: \nThe sre module is deprecated, please import re.\n\n/opt/Zope2-2.12.3/src/OFS/Application.py:697: DeprecationWarning: \n__init__.py of Products.ExternalFile has a long deprecated 'methods' attribute. 'methods' support might be removed in Zope 2.11 or a later feature release. Please use the 'legacy' argument of registerClass instead if the methods are constructors. Or refactor the product using adapters.\n\n2010-02-09 17:04:14 WARNING \nInit Class Products.ZopeXMLMethods.DTDValidateMethod.DTDValidateMethod has a security declaration for nonexistent method 'dtdValidationResultsString'\n\n2010-02-09 17:04:14 WARNING \nInit Class Products.ZopeXMLMethods.DTDValidateMethod.DTDValidateMethod has a security declaration for nonexistent method 'dtdValidationResultsString'\n\n/srv/Zope/Products/ZopeXMLMethods/CacheManager.py:34: DeprecationWarning: \nHTML is deprecated. import from App.special_dtml instead\n from Globals import MessageDialog, HTML\n\n\n\n}}}
<!--{{{-->\n<div id='header' class='header roundedCorners'>\n<div class='headerShadow'>\n<span class='searchBar roundedCorners' macro='search'></span>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='displayArea' class="roundedCorners">\n<div id='messageArea' class="roundedCorners"></div>\n<div id='tiddlerDisplay' class="roundedCorners"></div>\n</div>\n<div id='contentFooter' refresh='content' tiddler='contentFooter' class="roundedCorners"></div>\n<!--}}}-->\n
/***\n<<checkForDataTiddlerPlugin>>\n|''Name:''|FormTiddlerPlugin|\n|''Version:''|1.0.6 (2007-06-24)|\n|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|\n|''Requires:''|DataTiddlerPlugin|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nUse form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).\n\n''Syntax:'' \n|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|\n|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|\n\n|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|\n|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|\n|//buttonLabel//|The label of the button|\n|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|\n|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nFor details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].\n\n!Revision history\n* v1.0.6 (2007-06-24)\n** Fixed problem when using SELECT component in Internet Explorer (thanks to MaikBoenig for reporting)\n* v1.0.5 (2006-02-24)\n** Removed "debugger;" instruction\n* v1.0.4 (2006-02-07)\n** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)\n* v1.0.3 (2006-02-05)\n** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)\n* v1.0.2 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.1 (2005-12-22)\n** Features: \n*** Support InternetExplorer\n*** Added newTiddlerWithForm Macro\n* v1.0.0 (2005-12-14)\n** initial version\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// FormTiddlerPlugin\n//============================================================================\n//============================================================================\n\nif (!window.abego) window.abego = {};\n\nabego.getOptionsValue = function(element,i) {\n var v = element.options[i].value;\n if (!v && element.options[i].text)\n v = element.options[i].text;\n return v;\n};\n\nversion.extensions.FormTiddlerPlugin = {\n major: 1, minor: 0, revision: 5,\n date: new Date(2006, 2, 24), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } \n\n//============================================================================\n// formTiddler Macro\n//============================================================================\n\n// -------------------------------------------------------------------------------\n// Configurations and constants \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler = {\n // Standard Properties\n label: "formTiddler",\n version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},\n prompt: "Edit tiddler data using forms",\n\n // Define the "setters" that set the values of INPUT elements of a given type\n // (must match the corresponding "getter")\n setter: { \n button: function(e, value) {/*contains no data */ },\n checkbox: function(e, value) {e.checked = value;},\n file: function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},\n hidden: function(e, value) {e.value = value;},\n password: function(e, value) {e.value = value;},\n radio: function(e, value) {e.checked = (e.value == value);},\n reset: function(e, value) {/*contains no data */ },\n "select-one": function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},\n "select-multiple": function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},\n submit: function(e, value) {/*contains no data */},\n text: function(e, value) {e.value = value;},\n textarea: function(e, value) {e.value = value;}\n },\n\n // Define the "getters" that return the value of INPUT elements of a given type\n // Return undefined to not store any data.\n getter: { \n button: function(e, value) {return undefined;},\n checkbox: function(e, value) {return e.checked;},\n file: function(e, value) {return e.value;},\n hidden: function(e, value) {return e.value;},\n password: function(e, value) {return e.value;},\n radio: function(e, value) {return e.checked ? e.value : undefined;},\n reset: function(e, value) {return undefined;},\n "select-one": function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},\n "select-multiple": function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},\n submit: function(e, value) {return undefined;},\n text: function(e, value) {return e.value;},\n textarea: function(e, value) {return e.value;}\n }\n};\n\n\n// -------------------------------------------------------------------------------\n// The formTiddler Macro Handler \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {\n return;\n }\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n\n // --- Processing ------------------------------------------\n\n // Get the form template text. \n // (This contains the INPUT elements for the form.)\n var formTemplateTiddler = store.getTiddler(formTemplateName);\n if (!formTemplateTiddler) {\n config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");\n return;\n }\n var templateText = formTemplateTiddler.text;\n if(!templateText) {\n // Shortcut: when template text is empty we do nothing.\n return;\n }\n\n // Get the name of the tiddler containing this "formTiddler" macro\n // (i.e. the tiddler, that will be edited and that contains the data)\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);\n\n // Append a "form" element. \n var formName = "form"+formTemplateName+"__"+tiddlerName;\n var e = document.createElement("form");\n e.setAttribute("name", formName);\n place.appendChild(e);\n\n // "Embed" the elements defined by the templateText (i.e. the INPUT elements) \n // into the "form" element we just created\n wikify(templateText, e);\n\n // Initialize the INPUT elements.\n config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));\n}\n\n\n// -------------------------------------------------------------------------------\n// Form Data Access \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\n// Initialize the INPUT elements of the form with the values of their "matching"\n// data fields in the tiddler. Also setup the onChange handler to ensure that\n// changes in the INPUT elements are stored in the tiddler's data.\n//\nconfig.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {\n // config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");\n\n // find the form\n var form = config.macros.formTiddler.findForm(formName);\n if (!form) {\n return;\n }\n\n try {\n var elems = form.elements;\n for (var i = 0; i < elems.length; i++) {\n var c = elems[i];\n \n var setter = config.macros.formTiddler.setter[c.type];\n if (setter) {\n var value = data[c.name];\n if (value != null) {\n setter(c, value);\n }\n c.onchange = onFormTiddlerChange;\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");\n }\n }\n } catch(e) {\n config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);\n }\n}\n\n\n// Internal.\n//\n// @return [may be null]\n//\nconfig.macros.formTiddler.findForm = function(formName) {\n // We must manually iterate through the document's forms, since\n // IE does not support the "document[formName]" approach\n\n var forms = window.document.forms;\n for (var i = 0; i < forms.length; i++) {\n var form = forms[i];\n if (form.name == formName) {\n return form;\n }\n }\n\n return null;\n}\n\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectOneValue = function(element,value) {\n var n = element.options.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = abego.getOptionsValue(element,i) == value;\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectMultipleValue = function(element,value) {\n var values = {};\n for (var i = 0; i < value.length; i++) {\n values[value[i]] = true;\n }\n \n var n = element.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = !(!values[abego.getOptionsValue(element,i)]);\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectOneValue = function(element) {\n var i = element.selectedIndex;\n return (i >= 0) ? abego.getOptionsValue(element,i) : null;\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectMultipleValue = function(element) {\n var values = [];\n var n = element.length;\n for (var i = 0; i < n; i++) {\n if (element.options[i].selected) {\n values.push(abego.getOptionsValue(element,i));\n }\n }\n return values;\n}\n\n\n\n// -------------------------------------------------------------------------------\n// Helpers \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.formTiddler.checkForExtensions = function(place,macroName) {\n if (!version.extensions.DataTiddlerPlugin) {\n config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");\n return false;\n }\n return true;\n}\n\n// Internal.\n//\n// Displays a trace message in the "TiddlyWiki" message pane.\n// (used for debugging)\n//\nconfig.macros.formTiddler.trace = function(s) {\n displayMessage("Trace: "+s);\n}\n\n// Internal.\n//\n// Display some error message in the "TiddlyWiki" message pane.\n//\nconfig.macros.formTiddler.displayFormTiddlerError = function(s) {\n alert("FormTiddlerPlugin Error: "+s);\n}\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.formTiddler.createErrorElement = function(place, message) {\n return createTiddlyElement(place,"span",null,"formTiddlerError",message);\n}\n\n// Internal.\n//\n// Returns the name of the tiddler containing the given element.\n// \nconfig.macros.formTiddler.getContainingTiddlerName = function(element) {\n return story.findContainingTiddler(element).id.substr(7);\n}\n\n// -------------------------------------------------------------------------------\n// Event Handlers \n// -------------------------------------------------------------------------------\n\n// This function must be called by the INPUT elements whenever their\n// data changes. Typically this is done through an "onChange" handler.\n//\nfunction onFormTiddlerChange (e) {\n // config.macros.formTiddler.trace("onFormTiddlerChange "+e);\n\n if (!e) var e = window.event;\n\n var target = resolveTarget(e);\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);\n var getter = config.macros.formTiddler.getter[target.type];\n if (getter) {\n var value = getter(target);\n DataTiddler.setData(tiddlerName, target.name, value);\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");\n }\n}\n\n// ensure that the function can be used in HTML event handler\nwindow.onFormTiddlerChange = onFormTiddlerChange;\n\n\n// -------------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// -------------------------------------------------------------------------------\n\nsetStylesheet(\n ".formTiddlerError{color: #ffffff;background-color: #880000;}",\n "formTiddler");\n\n\n//============================================================================\n// checkForDataTiddlerPlugin Macro\n//============================================================================\n\nconfig.macros.checkForDataTiddlerPlugin = {\n // Standard Properties\n label: "checkForDataTiddlerPlugin",\n version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},\n prompt: "Check if the DataTiddlerPlugin exists"\n}\n\nconfig.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {\n config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);\n}\n\n\n\n//============================================================================\n// newTiddlerWithForm Macro\n//============================================================================\n\nconfig.macros.newTiddlerWithForm = {\n // Standard Properties\n label: "newTiddlerWithForm",\n version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},\n prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"\n}\n\nconfig.macros.newTiddlerWithForm.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the button label\n var buttonLabel = undefined;\n if (i < params.length) {\n buttonLabel = params[i];\n i++;\n }\n\n if (!buttonLabel) {\n config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the (optional) tiddlerName script and "askUser"\n var tiddlerNameScript = undefined;\n var askUser = false;\n if (i < params.length) {\n tiddlerNameScript = params[i];\n i++;\n\n if (i < params.length && params[i] == "askUser") {\n askUser = true;\n i++;\n }\n }\n\n // --- Processing ------------------------------------------\n\n if(!readOnly) {\n var onClick = function() {\n var tiddlerName;\n if (tiddlerNameScript) {\n try {\n tiddlerName = eval(tiddlerNameScript);\n } catch (ex) {\n }\n }\n if (!tiddlerName || askUser) {\n tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");\n }\n while (tiddlerName && store.getTiddler(tiddlerName)) {\n tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\sn\sn"+"Please specify a tiddler name.", tiddlerName);\n }\n\n // tiddlerName is either null (user canceled) or a name that is not yet in the store.\n if (tiddlerName) {\n var body = "<<formTiddler [["+formTemplateName+"]]>>";\n var tags = [];\n store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);\n story.displayTiddler(null,tiddlerName,1);\n }\n }\n\n createTiddlyButton(place,buttonLabel,buttonLabel,onClick);\n }\n}\n\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
1. url for the item itself\n2. url for the web page that displays the item\n3 url for what the item is about
[[The new type of learner and why the university must change|http://www.edge.org/3rd_culture/tapscott09/tapscott09_index.html]]\n\nThe International Journal of Digital Curation \n\nFrom Duke about a metadata editor\nhttp://library.duke.edu/blogs/digital-collections/2008/10/10/a-metadata-tool-that-scales/#more-111\n\nhttp://www.extensiblecatalog.org/files/XCSchemaProperties20090107.pdf\n\nhttp://halfanhour.blogspot.com/2010/03/three-models-of-knowledge-production.html
>Engaging the broader library community in implementing leading-edge advances such as those described above and others re-sulting from programs offered by IMLS and private funders such as the Mellon Foundation. More than just a matter of disseminating information about these advances, this broader engagement will require systematic and systemic effort to help different audiences learn a new language, with faculty needing to understand issues of librarianship and librarians growing to appreciate faculty roles. Of particular interest is the challenge these changing roles will place on the future structure and content of graduate and professional school programs.\n\nThis is a interesting take on the subject
/***\n|Name|InlineJavascriptPlugin|\n|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|\n|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|\n|Version|1.9.4|\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''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!!!!!Documentation\n>see [[InlineJavascriptPluginInfo]]\n!!!!!Revisions\n<<<\n2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax\n|please see [[InlineJavascriptPluginInfo]] for additional revision details|\n2005.11.08 [1.0.0] initial release\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 3, date: new Date(2008,6,11)};\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")?(?: key=\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 var src=lookaheadMatch[1];\n var label=lookaheadMatch[2];\n var tip=lookaheadMatch[3];\n var key=lookaheadMatch[4];\n var show=lookaheadMatch[5];\n var code=lookaheadMatch[6];\n if (src) { // 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 = src;\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (code) { // there is script code\n if (show) // show inline script code in tiddler output\n wikify("{{{\sn"+lookaheadMatch[0]+"\sn}}}\sn",w.output);\n if (label) { // 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",wikifyPlainText(label));\n var fixup=code.replace(/document.write\ss*\s(/gi,'place.bufferedHTML+=(');\n link.code="function _out(place){"+fixup+"\sn};_out(this);"\n link.tiddler=w.tiddler;\n link.onclick=function(){\n this.bufferedHTML="";\n try{ var r=eval(this.code);\n if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)\n var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);\n if(this.bufferedHTML.length)\n s.innerHTML=this.bufferedHTML;\n if((typeof(r)==="string")&&r.length) {\n wikify(r,s,null,this.tiddler);\n return false;\n } else return r!==undefined?r:false;\n } catch(e){alert(e.description||e.toString());return false;}\n };\n link.setAttribute("title",tip||"");\n var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';\n URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\sn/g,' ')));\n URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';\n link.setAttribute("href",URIcode);\n link.style.cursor="pointer";\n if (key) link.accessKey=key.substr(0,1); // single character only\n }\n else { // run inline script code\n var fixup=code.replace(/document.write\ss*\s(/gi,'place.innerHTML+=(');\n var c="function _out(place){"+fixup+"\sn};_out(w.output);";\n try { var out=eval(c); }\n 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\n// // Backward-compatibility for TW2.1.x and earlier\n//{{{\nif (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {\n if(limit > 0) text = text.substr(0,limit);\n var wikifier = new Wikifier(text,formatter,null,tiddler);\n return wikifier.wikifyPlain();\n}\n//}}}\n\n// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()\n//{{{\nif (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }\n//}}}
LMS have been used primarily to provide access to "courseware" (e.g. syllabi, lecture notes, supporting slides, reading lists and links). The reasons behind this are, on the one hand, the reluctance of teachers to experiment with organising and moderating Web-based learning processes and, on the other hand, the lack of capability of LMS to handle didactically more complex learning designs."
/***\n|''Name:''|AccordionMenuPlugin|\n|''Description:''|Turn an unordered list into an accordion style menu|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#AccordionMenuPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.0|\n|''Date:''|03/11/2007|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.5|\n!!Usage:\n* put {{{<<accordion>>}}} on the line after your unordered list\n\n!!Customizing:\n* customize the css via the shadow tiddler StyleSheetAccordionMenuPlugin\n* or give the list a custom class by passing the classes as parameters to the macro.\n** Eg: {{{<<accordion ClassName1 ClassName2>>}}}\n\n!!Examples:\n*[[AccordionMenuPluginDemo]]\n\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\nconfig.macros.accordion={\n dropchar : " \su00BB",\n handler : function(place,macroName,params,wikifier,paramString,tiddler){\n list = findRelated(place.lastChild,"UL","tagName","previousSibling");\n if (!list)\n return;\n addClass(list,"accordion");\n if (params.length){\n addClass(list,paramString);\n }\n this.fixLinks(list.childNodes); \n },\n\n fixLinks : function(els){\n for (var i=0; i<els.length; i++){\n if(els[i].tagName.toLowerCase()=="li"){\n var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");\n if(!link){\n var ih = els[i].firstChild.data;\n els[i].removeChild(els[i].firstChild);\n link = createTiddlyElement(null,"a",null,null,ih+this.dropchar,{href:"javascript:;"});\n els[i].insertBefore(link,els[i].firstChild);\n }\n else{\n link.firstChild.data = link.firstChild.data + this.dropchar;\n removeClass(link,"tiddlyLinkNonExisting");\n }\n link.onclick = this.show;\n }\n }\n },\n \n show : function(e){\n var list = this.parentNode.parentNode;\n var els = list.childNodes;\n for (var i=0; i<els.length; i++){\n removeClass(els[i],"accordion-active");\n }\n addClass(this.parentNode,"accordion-active");\n } \n};\n\nconfig.shadowTiddlers["StyleSheetAccordionMenuPlugin"] = "/*{{{*/\sn"+\n "ul.accordion, ul.accordion li, ul.accordion li ul {margin:0; padding:0; list-style-type:none;text-align:left;}\sn"+\n "ul.accordion li ul {display:none;}\sn"+\n "ul.accordion li.accordion-active ul {display:block;}\sn"+\n "\sn"+\n "ul.accordion li.accordion-active a {cursor:default;}\sn"+\n "ul.accordion li.accordion-active ul li a{cursor:pointer;}\sn"+\n "\sn"+\n "ul.accordion a {display:block; padding:0.5em;}\sn"+\n "ul.accordion li a.tiddlyLink, ul.accordion li a.tiddlyLinkNonExisting, ul.accordion li a {font-weight:bold;}\sn"+\n "ul.accordion li a {background:#0066aa; color:#FFF; border-bottom:1px solid #fff;}\sn"+\n "ul.accordion li.accordion-active a, ul.accordion li a:hover {background:#00558F;color:#FFF;}\sn"+\n "\sn"+\n "ul.accordion li ul li{display:inline-block;overflow:hidden;}\sn"+\n "ul.accordion li.accordion-active ul li {background:#eff3fa; color:#000; padding:0em;}\sn"+\n "ul.accordion li.accordion-active ul li div {padding:1em 1.5em; background:#eff3fa;}\sn"+\n "ul.accordion li.accordion-active ul a{background:#eff3fa; color:#000; padding:0.5em 0.5em 0.5em 1.0em;border:none;}\sn"+\n "ul.accordion li.accordion-active ul a:hover {background:#e0e8f5; color:#000;}\sn" +\n "/*}}}*/";\n \n store.addNotification("StyleSheetAccordionMenuPlugin",refreshStyles);\n //!END-PLUGIN-CODE\n// %/
{{{\n> blockquote, level 1\n>> blockquote, level 2\n>>> blockquote, level 3\n\n<<<\nblockquote\n<<<\n}}}\n<<<\n> blockquote, level 1\n>> blockquote, level 2\n>>> blockquote, level 3\n\n> blockquote\n<<<
{{{\n<?xml version="1.0" encoding="UTF-8"?>\n<rdf:RDF\n xml:base="http://chroniclingamerica.loc.gov/lccn/sn83030214/1909-12-26/ed-1/seq-13"\n xmlns:dc="http://purl.org/dc/elements/1.1/"\n xmlns:dcterms="http://purl.org/dc/terms/"\n xmlns:exif="http://www.w3.org/2003/12/exif/ns#"\n xmlns:foaf="http://xmlns.com/foaf/0.1/"\n xmlns:ndnp="http://chroniclingamerica.loc.gov/terms#"\n xmlns:ore="http://www.openarchives.org/ore/terms/"\n xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\n>\n <rdf:Description rdf:about="/lccn/sn83030214/1909-12-26/ed-1/seq-13.rdf">\n <dcterms:created rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2009-07-10T12:19:24-04:00</dcterms:created>\n <rdf:type rdf:resource="http://www.openarchives.org/ore/terms/ResourceMap"/>\n <dcterms:creator rdf:resource="http://chroniclingamerica.loc.gov/awardees/dlc#awardee"/>\n <ore:describes rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13#page"/>\n <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2009-07-10T12:19:24-04:00</dcterms:modified>\n </rdf:Description>\n <rdf:Description rdf:about="/lccn/sn83030214/1909-12-26/ed-1/seq-13.pdf">\n <dc:format>application/pdf</dc:format>\n </rdf:Description>\n <rdf:Description rdf:about="/lccn/sn83030214/1909-12-26/ed-1/seq-13#page">\n <rdf:type rdf:resource="http://chroniclingamerica.loc.gov/terms#Page"/>\n <foaf:depiction rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13/thumbnail.jpg"/>\n <ndnp:sequence rdf:datatype="http://www.w3.org/2001/XMLSchema#long">13</ndnp:sequence>\n <ore:isDescribedBy rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13.rdf"/>\n <ore:isAggregatedBy rdf:resource="/lccn/sn83030214/1909-12-26/ed-1#issue"/>\n <dcterms:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">1909-12-26</dcterms:issued>\n <ore:aggregates rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13/ocr.xml"/>\n <ore:aggregates rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13/thumbnail.jpg"/>\n <ore:aggregates rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13/ocr.txt"/>\n <ore:aggregates rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13.jp2"/>\n <ore:aggregates rdf:resource="/lccn/sn83030214/1909-12-26/ed-1/seq-13.pdf"/>\n <dcterms:title>New-York tribune. - 1909-12-26 - 13</dcterms:title>\n </rdf:Description>\n <rdf:Description rdf:about="/lccn/sn83030214/1909-12-26/ed-1/seq-13/ocr.txt">\n <dc:format>text/plain</dc:format>\n </rdf:Description>\n <rdf:Description rdf:about="/lccn/sn83030214/1909-12-26/ed-1/seq-13.jp2">\n <exif:height rdf:datatype="http://www.w3.org/2001/XMLSchema#long">6347</exif:height>\n <dc:format>image/jp2</dc:format>\n <exif:width rdf:datatype="http://www.w3.org/2001/XMLSchema#long">4190</exif:width>\n </rdf:Description>\n <rdf:Description rdf:about="/lccn/sn83030214/1909-12-26/ed-1/seq-13/ocr.xml">\n <dc:format>text/xml</dc:format>\n </rdf:Description>\n <rdf:Description rdf:about="/lccn/sn83030214/1909-12-26/ed-1/seq-13/thumbnail.jpg">\n <dc:format>image/jpeg</dc:format>\n </rdf:Description>\n</rdf:RDF>\n}}}
[img[/files/zopestore/documents/regular_expressions_cheat_sheet.png]]
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.8 (2007-04-12)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|\n|''Copyright:''|© 2005-2007 [[abego Software|http://www.abego-software.de]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.8 (2007-04-12)\n** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)\n* v1.0.7 (2007-03-28)\n** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)\n* v1.0.6 (2006-09-16)\n** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.\n** Support "begin", "end" and "none" expressions in "write" action\n* v1.0.5 (2006-02-05)\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nif (!window.abego) window.abego = {};\n\nversion.extensions.ForEachTiddlerPlugin = {\n major: 1, minor: 0, revision: 8, \n date: new Date(2007,3,12), \n source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",\n licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",\n copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"\n};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {\n major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\nabego.parseNamedParameter = function(name, parameter, i) {\n var beginExpression = null;\n if ((i < parameter.length) && parameter[i] == name) {\n i++;\n if (i >= parameter.length) {\n throw "Missing text behind '%0'".format([name]);\n }\n \n return config.macros.forEachTiddler.paramEncode(parameter[i]);\n }\n return null;\n}\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "begin" option\n var beginExpression = abego.parseNamedParameter("begin", parameter, p);\n if (beginExpression !== null) \n p += 2;\n var endExpression = abego.parseNamedParameter("end", parameter, p);\n if (endExpression !== null) \n p += 2;\n var noneExpression = abego.parseNamedParameter("none", parameter, p);\n if (noneExpression !== null) \n p += 2;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n if (count > 0 && beginExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);\n \n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (count > 0 && endExpression)\n text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);\n\n if (count == 0 && noneExpression) \n text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);\n \n\n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.\n viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n var tiddlyWiki = new TiddlyWiki();\n\n // Starting with TW 2.2 there is a helper function to import the tiddlers\n if (tiddlyWiki.importTiddlyWiki) {\n if (!tiddlyWiki.importTiddlyWiki(content))\n throw "File '"+path+"' is not a TiddlyWiki.";\n tiddlyWiki.dirty = false;\n return tiddlyWiki;\n }\n \n // The legacy code, for TW < 2.2\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s"); \n return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
<<list shadowed>>
The classic definition of the purpose of a library catalog is that of C. A. Cutter, who stated that the "objects" of a catalog were:\n\nTo enable a person to find a book of which either\n* the author )\n* the title ) is known\n* the subject )\n* To show what the library has\n** by a given author\n**on a given subject\n**in a given kind of literature [poetry, drama, fiction].\n*To assist in the choice of a work\n**as to its edition (bibliographically)\n**as to its character (literary or topical) (Endnote 5).
<<list all>>
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}\n\na {color:[[ColorPalette::PrimaryMid]];}\na:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}\na img {border:0;}\n\nh1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}\nh1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}\nh2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}\n\n.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}\n.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}\n.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}\n\n.header {background:[[ColorPalette::PrimaryMid]];}\n.headerShadow {color:[[ColorPalette::Foreground]];}\n.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}\n.headerForeground {color:[[ColorPalette::Background]];}\n.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}\n\n.tabSelected{color:[[ColorPalette::PrimaryDark]];\n background:[[ColorPalette::TertiaryPale]];\n border-left:1px solid [[ColorPalette::TertiaryLight]];\n border-top:1px solid [[ColorPalette::TertiaryLight]];\n border-right:1px solid [[ColorPalette::TertiaryLight]];\n}\n.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}\n.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}\n.tabContents .button {border:0;}\n\n#sidebar {}\n#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}\n#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}\n#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}\n#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}\n#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}\n\n.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}\n.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}\n.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}\n.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];\n border:1px solid [[ColorPalette::PrimaryMid]];}\n.wizardStep.wizardStepDone {background::[[ColorPalette::TertiaryLight]];}\n.wizardFooter {background:[[ColorPalette::PrimaryPale]];}\n.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}\n.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;\n border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}\n.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}\n.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;\n border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}\n\n#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}\n#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}\n\n.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}\n\n.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}\n.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}\n.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}\n.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}\n.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}\n.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}\n.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}\n.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}\n\n.tiddler .defaultCommand {font-weight:bold;}\n\n.shadow .title {color:[[ColorPalette::TertiaryDark]];}\n\n.title {color:[[ColorPalette::SecondaryDark]];}\n.subtitle {color:[[ColorPalette::TertiaryDark]];}\n\n.toolbar {color:[[ColorPalette::PrimaryMid]];}\n.toolbar a {color:[[ColorPalette::TertiaryLight]];}\n.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}\n.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}\n\n.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}\n.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}\n.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}\n.tagging .button, .tagged .button {border:none;}\n\n.footer {color:[[ColorPalette::TertiaryLight]];}\n.selected .footer {color:[[ColorPalette::TertiaryMid]];}\n\n.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}\n.sparktick {background:[[ColorPalette::PrimaryDark]];}\n\n.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}\n.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}\n.lowlight {background:[[ColorPalette::TertiaryLight]];}\n\n.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}\n\n.imageLink, #displayArea .imageLink {background:transparent;}\n\n.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}\n\n.viewer .listTitle {list-style-type:none; margin-left:-2em;}\n.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}\n.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}\n\n.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}\n.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}\n.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}\n\n.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}\n.viewer code {color:[[ColorPalette::SecondaryDark]];}\n.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}\n\n.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}\n\n.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}\n.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}\n.editorFooter {color:[[ColorPalette::TertiaryMid]];}\n\n#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}\n#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}\n#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }\n#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}\n#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}\n#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}\n#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}\n.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}\n.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}\n#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';\n#ZiddlyFormats,#ZiddlyPowered,#ZiddlyFormats a,#ZiddlyPowered a{color:#fff};}\n
/***\n|''Name:''|TiddlyLightBox|\n|''Date:''|Jan 1, 2006|\n|''Version:''|1.0 beta|\n|''Author:''|Saq Imtiaz|\n|''Location:''|http://tw.lewcid.org/#TiddlyLightBoxPlugin|\n|''Documentation:''|http://tw.lewcid.org/#TiddlyLightBoxDocs|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''Based on:''|DC3.LightBox<br>Light Box Gone Wild <br>Ibox|\n\n!!Code\n***/\n//{{{\nconfig.macros.imagebox ={};\nconfig.macros.imagebox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var e = place.lastChild;\n e.onclick = function(){TiddlyLightBox.initBox('image',this,params[1],params[2],params[0]);return false;};\n}\n\nconfig.macros.divbox ={};\nconfig.macros.divbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n if (params[0]!=".")\n createTiddlyButton(place,params[0],params[0],function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;});\n else\n {\n var e = place.lastChild;\n e.onclick = function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;};\n }\n}\n\nconfig.macros.tiddlerbox ={}\nconfig.macros.tiddlerbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n config.macros.divbox.handler(place,macroName,[params[0],"tiddler:"+params[1],params[2],params[3],params[4]]);\n return false;\n}\n\nstore.addNotification("TiddlyLightBoxStyles",refreshStyles);\n\nif (!window.TiddlyLightBox)\n window.TiddlyLightBox = {};\n var loadingImage = "indicator.gif";\n window.TiddlyLightBox =\n {\n _curBox: null, // [sentinel]\n\n lightBoxHtml : '<div id="lightBoxOverlay" onclick="TiddlyLightBox.hideBox()" style="display:none"></div><div id="lightboxprogress" style="display:none;"><img src=\s''+loadingImage+'\s' alt=\s'loading\s' style="width:128px;height:128px;"></div><div class="lightBox" id="lightBox" style="display:none"><div id="lightBoxContent"></div><div id="lightBoxTitle">This is a title</div><div id="lightBoxClose"><a href:"#" onclick="TiddlyLightBox.hideBox();return false;">Click to close</a></div></div>',\n\n createBoxWrapper : function()\n {\n var wrapper = createTiddlyElement(document.getElementsByTagName("body")[0],"div","tiddlyLightBoxWrapper");\n wrapper.innerHTML = this.lightBoxHtml;\n },\n\n initBox : function(contentType,url,w,h,text)\n {\n if (this._curBox)\n return;\n this.showProgress();\n this.hideSelects("hidden");\n this.showBg();\n this._curBox = true;\n this.sizeTheBox(contentType,w,h);\n if (contentType == 'image')\n this.showImage(url,text);\n else if (contentType == 'html')\n this.showHtml(url,text);\n return false;\n },\n \n sizeTheBox : function(contentType,w,h)\n {\n var box = document.getElementById("lightBoxContent");\n if (w && isNaN(parseInt(w)))\n {\n addClass(box,w);\n }\n else if (w ||h || contentType == 'html')\n {\n box.style.width = w? w+ "px" : "450px";\n box.style.height = h? h+ "px" : "280px";\n if (contentType=='image')\n setStylesheet("#lightBoxContent img{height:100%;width:100%;}","lightBoxImageSizeHack");\n }\n },\n\n showProgress : function()\n {\n var progress = document.getElementById("lightboxprogress");\n progress.style.display='';\n this._center(progress);\n },\n \n hideProgress: function()\n {\n var progress = document.getElementById("lightboxprogress");\n progress.style.display='none';\n },\n\n //this function lifted from Lightbox Gone Wild\n hideSelects: function(visibility)\n {\n var selects = document.getElementsByTagName('select');\n for(i = 0; i < selects.length; i++)\n {\n selects[i].style.visibility = visibility;\n }\n },\n\n showBg: function()\n {\n var overlay = document.getElementById('lightBoxOverlay');\n if (config.browser.isIE)\n {\n overlay.style.height = Math.max(document.documentElement.scrollHeight,document.documentElement.offsetHeight);\n overlay.style.width = document.documentElement.scrollWidth;\n }\n overlay.style.display = 'block';\n },\n\n showImage: function (url,text)\n {\n imgPreloader = new Image();\n imgPreloader.onload = function ()\n {\n var lb = document.getElementById("lightBoxContent");\n lb.innerHTML = "<img src="+url+">";\n lb.onclick = function(){TiddlyLightBox.hideBox();return false;};\n TiddlyLightBox.posBox(text);\n };\n imgPreloader.src = url;\n },\n \n showHtml : function(theID,text)\n {\n var lb = document.getElementById("lightBoxContent");\n if (theID.indexOf("tiddler:")==-1)\n lb.innerHTML = document.getElementById(theID).innerHTML;\n else\n { \n wikify(store.getTiddlerText(theID.replace("tiddler:","")),lb);\n lb.className='tiddler';\n }\n lb.style.overflow = "auto";\n this.posBox(text);\n },\n\n posBox: function(text)\n {\n this.setTitle(text);\n this.hideProgress();\n var lb = document.getElementById("lightBox");\n lb.style.display = "";\n lb.style.visibilty = "hidden";\n lb.style.position = "absolute";\n this._center(lb);\n if(!TiddlyLightBox._curBox) return;\n lb.style.visibility = "visible";\n lb.style.display = "block";\n },\n\n setTitle: function(text)\n {\n document.getElementById("lightBoxTitle").innerHTML= (text==undefined)? '': text;\n },\n\n _center: function(lb)\n {\n var lbSize = new TiddlyLightBox.getElementSize(lb);\n lb.style.left = (Math.round(findWindowWidth()/2) - (lbSize.width /2) + findScrollX())+'px';\n lb.style.top = (Math.round(findWindowHeight()/2) - (lbSize.height /2) + findScrollY())+'px';\n },\n\n //this function lifted from Ibox\n getElementSize : function(elem)\n {\n this.width = elem.offsetWidth || elem.style.pixelWidth;\n this.height = elem.offsetHeight || elem.style.pixelHeight;\n },\n\n hideBox: function()\n {\n if(!this._curBox)\n return;\n document.getElementById("tiddlyLightBoxWrapper").innerHTML= this.lightBoxHtml;\n setStylesheet("","lightBoxImageSizeHack");\n this._curBox = null;\n return false;\n }\n}\n\nTiddlyLightBox.createBoxWrapper();\n\nStory.prototype.findContainingTiddler = function(e)\n{\n while(e && (!hasClass(e,"tiddler") || !e.getAttribute("tiddler")))\n e = e.parentNode;\n return(e);\n}\n\nconfig.shadowTiddlers.TiddlyLightBoxStyles="/*{{{*/\sn#lightBoxOverlay {\sn position:absolute;\sn top: 0;\sn left: 0;\sn width: 100%;\sn height: 100%;\sn z-index: 90; \sn background-color: #000;\sn -moz-opacity: 0.75;\sn opacity: .75;\sn filter: alpha(opacity=75);\sn}\sn#lightBoxOverlay[id]{ \sn position: fixed;\sn}\sn\sn#lightboxprogress { \sn margin:0;padding:0;\sn position: absolute;\sn z-index:95;\sn}\sn\sndiv.lightBox {\sn background: #fff;\sn color: #fff;\sn border: 4px solid #525252;\snpadding:20px 20px 25px 20px; position:absolute; z-index:99;\sn}\sn\sn#lightBoxClose {text-align:right; color:#000; font-size:1.0em; position:absolute; bottom:6px; right:20px;}\sn#lightBoxClose a{color:#666; border-bottom:1px solid #666;cursor:pointer;}\sn#lightBoxClose a:hover {color:#111; border-bottom:1px solid #666; cursor:pointer; background:transparent;}\sn\sn#lightBoxContent {border:1px solid #525252;color:#000; background:#fff;}\sn#lightBox .tiddler {background:#fff;}\sn\sn#lightBoxContent img {border:0;margin:0;padding:0;display:block;cursor:pointer;}\sn\sn#lightBoxTitle {padding:0px; font-weight:bold; position:absolute; left:20px;bottom:6px; font-size:1.1em; color:#000;}\sn\sn/*}}}*/";\n//}}}
* {{{@@CssProperty:value;CssProperty:value;...@@}}}<br>''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.\n* {{{{{customCssClass{...}}}}}} /% DEBUG: buggy %/\n* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{<html> ... </html>}}}
>a clear scientific story (e.g. this is the problem, this how we approached it, this is what we found and why it is important
<<tabs tabsClass\nLayout "Layout Templates" SystemLayout\nSystem "System Tiddlers" SystemTiddlers\nStyle "StyleSheets" StyleSheet\nOptions "Personal Preferences" SystemOptions\nPlugins "Installed Plugins" PluginManager\nShadows "Hidden System Pages" ShadowedPages\n>>
{{{\n* unordered list, level 1\n** unordered list, level 2\n*** unordered list, level 3\n\n# ordered list, level 1\n## ordered list, level 2\n### unordered list, level 3\n\n; definition list, term\n: definition list, description\n}}}\n<<<\n* unordered list, level 1\n** unordered list, level 2\n*** unordered list, level 3\n\n# ordered list, level 1\n## ordered list, level 2\n### unordered list, level 3\n\n; definition list, term\n: definition list, description\n
*Menu1\n**MenuItem1\n**MenuItem2\n* Menu2\n** Menu2Item1\n** Menu2Item2\n<<accordion>>
My Tiddly Wiki Notes Site
/***\n|Name|DatePlugin|\n|Source|http://www.TiddlyTools.com/#DatePlugin|\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||\n|Description|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|\n\nThere are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.\n\nThis plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.\n!!!!!Usage\n<<<\nWhen installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.\n\nHowever, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:\n* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.\n* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values. \n* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"\n>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^\n>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^\n>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^\n>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^\n* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format\n\nIn addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:\n\n''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}'' \n\nNote that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:\n* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.\n* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.\n<<<\n!!!!!Examples\n<<<\nThe current date: <<date>>\nThe current time: <<date today "0hh:0mm:0ss">>\nToday's blog: <<date link today "DDD, MMM DDth, YYYY">>\nRecent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>\nThe first day of next month will be a <<date Y M+1 1 "DDD">>\nThis tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>\nThe SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>\nThis document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>\n<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''DatePlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2007.06.20 [2.3.1]'' in onClickDatePopup(), use Popup.show() instead of deprecated ScrollToTiddlerPopup(). Fixes fatal error that prevents popups from being properly displayed\n''2007.05.31 [2.3.0]'' list "created" tiddlers in date popup. Also, force re-cache of created/modified indices when displaying current date and store.isDirty(), so that popup is kept in sync with tiddler changes.\n''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.\n''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.\n''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.\n''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").\n''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.\n''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables\n''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.\n''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()\n''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)\nadded flag param to showDate() API to override internal weekend[] array\n''2005.12.27 [2.0.0]'' Update for TW2.0\nAdded parameter handling for 'linkformat'\n''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.\n''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter\n''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter\n''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.\n''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).\n''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...\n''2005.10.31 [1.0.1]'' documentation and code cleanup\n''2005.10.31 [1.0.0]'' initial public release\n''2005.10.30 [0.9.0]'' pre-release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.date = {major: 2, minor: 3, revision: 1, date: new Date(2007,6,20)};\n//}}}\n\n//{{{\nconfig.macros.date = {\n format: "YYYY.0MM.0DD", // default date display format\n linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format\n linkedbg: "#babb1e", // "babble"\n todaybg: "#ffab1e", // "fable"\n weekendbg: "#c0c0c0", // "cocoa"\n holidaybg: "#ffaace", // "face"\n createdbg: "#bbeeff", // "beef"\n modifiedsbg: "#bbeeff", // "beef"\n remindersbg: "#c0ffee", // "coffee"\n holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)\n weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]\n};\n//}}}\n\n//{{{\nconfig.macros.date.handler = function(place,macroName,params)\n{\n // do we want to see a link, a popup, or just a formatted date?\n var mode="display";\n if (params[0]=="display") { mode=params[0]; params.shift(); }\n if (params[0]=="popup") { mode=params[0]; params.shift(); }\n if (params[0]=="link") { mode=params[0]; params.shift(); }\n // get the date\n var now = new Date();\n var date = now;\n if (!params[0] || params[0]=="today")\n { params.shift(); }\n else if (params[0]=="filedate")\n { date=new Date(document.lastModified); params.shift(); }\n else if (params[0]=="tiddler")\n { date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }\n else if (params[0].substr(0,8)=="tiddler:")\n { var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }\n else {\n var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));\n var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));\n var d = eval(params.shift().replace(/D/ig,now.getDate()+0));\n date = new Date(y,m-1,d);\n }\n // date format with optional custom override\n var format=this.format; if (params[0]) format=params.shift();\n var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();\n showDate(place,date,mode,format,linkformat);\n}\n//}}}\n\n//{{{\nwindow.showDate=showDate;\nfunction showDate(place,date,mode,format,linkformat,autostyle,weekend)\n{\n if (!mode) mode="display";\n if (!format) format=config.macros.date.format;\n if (!linkformat) linkformat=config.macros.date.linkformat;\n if (!autostyle) autostyle=false;\n\n // format the date output\n var title = date.formatString(format);\n var linkto = date.formatString(linkformat);\n\n // just show the formatted output\n if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }\n\n // link to a 'dated tiddler'\n var link = createTiddlyLink(place, linkto, false);\n link.appendChild(document.createTextNode(title));\n link.title = linkto;\n link.date = date;\n link.format = format;\n link.linkformat = linkformat;\n\n // if using a popup menu, replace click handler for dated tiddler link\n // with handler for popup and make link text non-italic (i.e., an 'existing link' look)\n if (mode=="popup") {\n link.onclick = onClickDatePopup;\n link.style.fontStyle="normal";\n }\n\n // format the popup link to show what kind of info it contains (for use with calendar generators)\n if (!autostyle) return;\n if (hasModifieds(date)||hasCreateds(date))\n { link.style.fontStyle="normal"; link.style.fontWeight="bold"; }\n if (hasReminders(date))\n { link.style.textDecoration="underline"; }\n if(isToday(date))\n { link.style.border="1px solid black"; }\n\n if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )\n { place.style.background = config.macros.date.weekendbg; }\n if(isHoliday(date)&&(config.macros.date.holidaybg!=""))\n { place.style.background = config.macros.date.holidaybg; }\n if (hasCreateds(date)&&(config.macros.date.createdbg!=""))\n { place.style.background = config.macros.date.createdbg; }\n if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))\n { place.style.background = config.macros.date.modifiedsbg; }\n if (store.tiddlerExists(linkto)&&(config.macros.date.linkedbg!=""))\n { place.style.background = config.macros.date.linkedbg; }\n if (hasReminders(date)&&(config.macros.date.remindersbg!=""))\n { place.style.background = config.macros.date.remindersbg; }\n if(isToday(date)&&(config.macros.date.todaybg!=""))\n { place.style.background = config.macros.date.todaybg; }\n}\n//}}}\n\n//{{{\nfunction isToday(date) // returns true if date is today\n { var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }\n\nfunction isWeekend(date) // returns true if date is a weekend\n { return (config.macros.date.weekend[date.getDay()]); }\n\nfunction isHoliday(date) // returns true if date is a holiday\n{\n var longHoliday = date.formatString("0MM/0DD/YYYY");\n var shortHoliday = date.formatString("0MM/0DD");\n for(var i = 0; i < config.macros.date.holidays.length; i++) {\n var holiday=config.macros.date.holidays[i];\n if (holiday==longHoliday||holiday==shortHoliday) return true;\n }\n return false;\n}\n//}}}\n\n//{{{\n// Event handler for clicking on a day popup\nfunction onClickDatePopup(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var popup = Popup.create(this);\n if(popup) {\n // always show dated tiddler link (or just date, if readOnly) at the top...\n if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))\n createTiddlyLink(popup,this.date.formatString(this.linkformat),true);\n else\n createTiddlyText(popup,this.date.formatString(this.linkformat));\n addCreatedsToPopup(popup,this.date,this.format);\n addModifiedsToPopup(popup,this.date,this.format);\n addRemindersToPopup(popup,this.date,this.linkformat);\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nfunction indexCreateds() // build list of tiddlers, hash indexed by creation date\n{\n var createds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].created.formatString("YYYY0MM0DD")\n if (!createds[date])\n createds[date]=new Array();\n createds[date].push(tiddlers[t].title);\n }\n return createds;\n}\nfunction hasCreateds(date) // returns true if date has created tiddlers\n{\n if (!config.macros.date.createds) config.macros.date.createds=indexCreateds();\n return (config.macros.date.createds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addCreatedsToPopup(popup,when,format)\n{\n var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));\n if (force || !config.macros.date.createds) config.macros.date.createds=indexCreateds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var createds = config.macros.date.createds[when.formatString("YYYY0MM0DD")];\n if (createds) {\n createds.sort();\n var e=createTiddlyElement(popup,"div",null,null,"created:");\n for(var t=0; t<createds.length; t++) {\n var link=createTiddlyLink(popup,createds[t],false);\n link.appendChild(document.createTextNode(indent+createds[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexModifieds() // build list of tiddlers, hash indexed by modification date\n{\n var modifieds= { };\n var tiddlers = store.getTiddlers("title","excludeLists");\n for (var t = 0; t < tiddlers.length; t++) {\n var date = tiddlers[t].modified.formatString("YYYY0MM0DD")\n if (!modifieds[date])\n modifieds[date]=new Array();\n modifieds[date].push(tiddlers[t].title);\n }\n return modifieds;\n}\nfunction hasModifieds(date) // returns true if date has modified tiddlers\n{\n if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();\n return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);\n}\n\nfunction addModifiedsToPopup(popup,when,format)\n{\n var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));\n if (force || !config.macros.date.modifieds) config.macros.date.modifieds=indexModifieds();\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];\n if (mods) {\n mods.sort();\n var e=createTiddlyElement(popup,"div",null,null,"changed:");\n for(var t=0; t<mods.length; t++) {\n var link=createTiddlyLink(popup,mods[t],false);\n link.appendChild(document.createTextNode(indent+mods[t]));\n createTiddlyElement(popup,"br",null,null,null);\n }\n }\n}\n//}}}\n\n//{{{\nfunction indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date\n{\n var reminders = { };\n if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed\n // DEBUG var starttime=new Date();\n var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);\n for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;\n // DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\sn";\n // DEBUG out+="startdate: "+date.toLocaleDateString()+"\sn"+"leadtime: "+leadtime+" days\sn\sn";\n // DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\sn"; }\n // DEBUG alert(out);\n }\n return reminders;\n}\n\nfunction hasReminders(date) // returns true if date has reminders\n{\n if (window.reminderCacheForCalendar)\n return window.reminderCacheForCalendar[date]; // use calendar cache\n if (!config.macros.date.reminders)\n config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache\n return (config.macros.date.reminders[date]);\n}\n\nfunction addRemindersToPopup(popup,when,format)\n{\n if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed\n\n var indent = String.fromCharCode(160)+String.fromCharCode(160);\n var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);\n var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));\n for(var t=0; t<reminders.length; t++) {\n link = createTiddlyLink(popup,reminders[t].tiddler,false);\n var diff=reminders[t].diff;\n diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");\n var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;\n link.appendChild(document.createTextNode(indent+diff+" - "+txt));\n createTiddlyElement(popup,"br",null,null,null);\n }\n if (readOnly) return; // omit "new reminder..." link\n var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");\n var title = when.formatString(format);\n link.title="add a reminder to '"+title+"'";\n link.onclick = function() {\n // show tiddler editor\n story.displayTiddler(null, title, 2, null, null, false, false);\n // find body 'textarea'\n var c =document.getElementById("tiddler" + title).getElementsByTagName("*");\n for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;\n // append reminder macro to tiddler content\n if (i<c.length) {\n if (store.tiddlerExists(title)) c[i].value+="\sn"; else c[i].value="";\n c[i].value += "<<reminder";\n c[i].value += " day:"+when.getDate();\n c[i].value += " month:"+(when.getMonth()+1);\n c[i].value += " year:"+when.getFullYear();\n c[i].value += ' title:"Enter a title" >>';\n }\n };\n}\n//}}}\n
[[Reference|http://dublincore.org/documents/dc-ds-xml/]]\n\nAccording to the "Description Set Model" of the DCMI Abstract Model [ABSTRACT-MODEL], a DC description set has the following structure:\n\n* a description set is made up of one or more descriptions\n* a description is made up of\n** zero or one described resource URI and\n** one or more statements\n* a statement is made up of\n** exactly one property URI and\n** exactly one value surrogate\n* a value surrogate is either a literal value surrogate or a non-literal value surrogate\n** a literal value surrogate is made up of\n** exactly one value string\n* a non-literal value surrogate is made up of\n** zero or one value URIs\n** zero or one vocabulary encoding scheme URIs\n** zero or more value strings\n* a value string is either a plain value string or a typed value string\n** a plain value string may be associated with a value string language\n** a typed value string is associated with a syntax encoding scheme URI\n** a non-literal value may be described by another description
* Book \n* Book Item \n* Book Review \n* Conference Item \n* Conference Paper \n* Conference Poster \n* Journal Article \n* Journal Item \n* News Item \n* Patent \n* Report \n* Scholarly Text \n* Submitted Journal Article \n* Thesis or Dissertation \n* Working or Discussion Paper
[[What a LMS should provide|http://wiki.sakaiproject.org/display/PED/Sakai+Learning+Capabilities+v+1.0]]
http://www.rexx.com/~dkuhlman/#generateds-py-generate-python-data-bindings-from-xml-schema
2 | JUPR: Journal of Undergraduate Psychological Research, Vol. 1\n 9 | JUPR: Journal of Undergraduate Psychological Research, Vol. 2\n 18 | The American Hatter\n 23 | 1955 Danbury Flood Scrapbook\n 24 | David B. Stevens Cyphering Book\n 25 | Miscellaneous Photographs\n 3 | Immigration & Memory \n 27 | Pinkerton Detective Agency Danbury Fires Investigation Collection\n 28 | Ruth Alice Haas Papers \n 29 | Danbury Map (Westchester County), ca. 1860\n 30 | 1880s Danbury Bird's Eye Map\n 26 | George B. Hawley Collection\n 21 | 1856 Map of Danbury\n 42 | 1840s? Map of Danbury\n 43 | WCSU Centennial Interview Segments\n 44 | Stambler, Leah\n 46 | Veterans of Korea Oral Histories \n 47 | Veterans of Iraq War II Oral Histories \n 39 | Veterans of World War II Oral Histories\n 67 | 1858 Map of Danbury\n 69 | Plan of Danbury, 1867\n 38 | Cohort 1\n 70 | Stetson Hat, ca. 1910s\n 71 | Charles D. Garlick Letters\n 72 | Miscellaneous\n 73 | Furman selections from: New American Choral Music--Vol. III\n 74 | Furman Compilation\n 75 | 78 rpm Audiodisc\n 76 | Choir Festival 1967, 1967\n 78 | June Goodman Papers\n 77 | I Have a Dream - Microfilmed Scores\n 79 | Marjorie Echols Local Artists Collection, MS 035\n 82 | Stevens, Brian\n 83 | 2008 History and Non-Western Cultures\n 81 | Senior Writing Theses (2008-2)\n 20 | Senior Writing Theses (2007-1)\n 45 | Senior Writing Theses (2008-1)\n 84 | Walter Gordon Merritt Papers (MS 014)\n 16 | Henry L. Pike Locomotive Sketchbook, 1866\n 86 | Warner World War II Interviews\n 91 | Senior Writing Theses (2009-1)\n 88 | JUPR: Journal of Undergraduate Psychological Research, Vol. 3\n 89 | Howard Barlow Collection\n 90 | 2008 Social Sciences Journal\n 92 | Masters Thesis\n 12 | WCSU Photographs and Miscellanea, RG 008\n 93 | Senior Writing Theses (2009-2)\n
<script label="click here" title="mouseover tooltip text" key="X">\n /* javascript code goes here... */\n alert('you clicked on the link!');\n</script>
/*{{{*/\n/*Resources Theme for TiddlyWiki*/\n/*edited by Brian Kennison*/\n/*}}}*/\n/*{{{*/\n\n/* HTML Elements */\nbody { \n background: #FFF url(images/top.jpg) repeat-x top; \n color: #454545; \n font: .94em Arial, sans-serif; \n line-height: 1.5em; \n margin: 0; \n padding: 0; \n border-radius: 1em;\n}\na { \n background: inherit; \n color: #933b39; \n}\na:hover { \n color: #933b39; background: inherit; \n text-decoration: underline\n}\np { \n margin: 5px 0; \n}\nh1 {\n font: bold 1.8em Arial, Sans-Serif; \n letter-spacing: -1px; \n margin: 0; \n padding: 8px 0 4px 0; \n}\nh2 { \n font: bold 1.6em Arial, Sans-Serif; \n letter-spacing: -1px; \n}\nh3 { \n margin: 0; \n padding: 4px 0; \n}\nul { \n list-style: square; \n margin: 0; \n padding : 0; \n}\nimg { \n border: 0; \n}\nhr { \n background-color: #C0C0C0; \n border-style: none; \n color: #D0D0D0; \n height: 1px; \n margin: 10px 0; \n}\n\npre {\n white-space: pre; /* CSS 2.0 */\n white-space: pre-wrap; /* CSS 2.1 */\n white-space: pre-line; /* CSS 3.0 */\n white-space: -pre-wrap; /* Opera 4-6 */\n white-space: -o-pre-wrap; /* Opera 7 */\n white-space: -moz-pre-wrap; /* Mozilla */\n white-space: -hp-pre-wrap; /* HP Printers */\n word-wrap: break-word; /* IE 5+ */\n }\n\n/* Helpers */\n.clearAll { clear: both }\n.floatLeft { \n border: thin dotted black;\n color: #5E8412;\n float:left;\n margin-right; 5px;\n padding: 5px\n}\n.floatLeft .tiddlyLink {\n color: #5E8412;\n -webkit-border-radius: 10px;\n -khtml-border-radius: 10px; \n -moz-border-radius: 10px;\n border-radius: 10px;\n}\n\n/* Content Sections in Document Order */\n#contentWrapper { \n margin: 0px auto; \n width: 90%; \n}\n#header { \n background: transparent; \n color: #FFF;\n height: 101px; \n padding-top: 20px; \n}\n#header #icons { \n float: right; \n margin:20px 0; \n padding:0 \n}\n#header #icons img { \n padding-right: 2px; \n border: 0; \n}\n.headerShadow { \n padding: 1.4em 0 0.5em 1em;\n}\n.searchBar { \n float: right; \n font-size: 1em; \n margin-top: 1.3e;m \n position: relative; \n}\n.searchBar .button { \n color: #FFF; \n display: block \n}\n.searchBar .searchButton { \n color: #FFF; \n display: block \n}\n.searchBar .button:hover { \n border: 1px solid #fefefe; color: #4F4B45 \n}\n.searchBar .searchButton:hover { \n border: 1px solid #fefefe; color: #4F4B45 \n}\n.searchBar input { \n background-color: #fefefe; \n border: 1px solid #CCC; \n color: #830200; \n margin-right: 3px \n}\n\n.siteTitle { \n color: #FFF; \n font: bold 2em Arial, Sans-Serif; \n letter-spacing: 1px; \n margin: 0; \n padding: 8px 0 4px 0; \n}\n.siteSubtitle { \n color: #FFF; \n font: 1.0em Arial, Sans-Serif; \n letter-spacing: 0px; \n margin:0; \n padding: 0 \n}\n#topMenu { \n background: #933b39; \n height: 3ex;\n padding: 5px 5px 5px 5px;\n width: 100%;\n}\n#topMenu a, #topMenu .tiddlyLink, #topMenu .button { \n background:transparent;\n border: none !important;\n color: white; \n font-size: 110%; \n font-variant: small-caps; \n font-weight: normal; \n letter-spacing: 1px;\n margin: 0 4px; \n padding: 0.3em 0.45em ; \n text-decoration: none;\n}\n#topMenu a:hover, #topMenu .tiddlyLink:hover, #topMenu .button:hover, #topMenu .button:active, #topMenu .highlight {\n background: #9F1313;\n color: #FFF; \n text-decoration: none; \n}\n#topMenu br { \n display: none \n}\n#displayArea { \n margin: 0 17em 2em 0.5em; \n width: 100% \n}\n#messageArea { \n background: #fefefe; \n border: 4px solid #933b39; \n color: #555; \n font-size: 100%;\n}\n#messageArea .button { \n border: 1px solid #933b39 color: #666; \n}\n#messageArea .button:hover { \n background: #FF0000; \n border-color: #FF0000 color: #FFF \n}\n#messageArea a:hover { \n background: #f5f5f5; \n border: none \n}\n#tiddlerDisplay {\n width:100%;\n}\n\n#tiddlerContents {}\n.tiddler { \n padding-bottom: 10px; \n padding-left: 0;\n width: 100% \n}\n#contentFooter { \n background: #933b39; \n border-top: 1px solid #DCDCDC; \n clear: both; \n color:#FFF; \n margin: 5em 0 3em 0;\n text-align: center;\n}\n#contentFooter .right { \n background: #FFF; \n float: right; \n text-align: right \n}\n#contentFooter a { \n background: #FFF; text-decoration: none \n}\n\n/* Tiddler Parts */\n.toolbar { \n font-size: 85% \n}\n.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active { \n background: transparent; \n border: 1px solid #fff color: #333; \n}\n.title { \n border-bottom:1px solid #FF0000; color: #933b39;; \n}\n.subtitle, .subtitle a { \n color: #830200; \n font-size: 1em; \n margin: 0.2em \n}\n\n.popup { \n background: #933b39; \n border: 1px solid #CA0000;\n color: #FFF;\n}\n.popup li a, .popup li a:visited { \n border: none;\n color: #FFF; \n}\n.popup li a:hover { \n background: #F7F7F7; \n border: none \n color: #fff; \n}\n.popup li.disabled { \n color: #000 \n}\n\n\n#sidebar { background: #fefefe; border-left: 0 solid #000; display: inline; display: none float: right; line-height: 1.4em; margin-bottom: 1em; margin-bottom: 2em !important; position: relative; right: 0; width: 16em; }\n#sidebar { display: inline; float: right; position: relative; right: 0 }\n\n#sidebarOptions .sliderPanel .txtOptionInput { border: 1px solid #830200; width: 9em }\n#sidebarOptions .sliderPanel a { background-color: #eee; border-bottom: 1px dotted #333 color: #555; font-weight: normal; }\n#sidebarOptions .sliderPanel a:hover { background-color: #eee; border-bottom: 1px dotted #111 border: none; color: #111; }\n#sidebarOptions .sliderPanel input { border: 1px solid #830200 }\n#sidebarOptions .sliderPanel { background: #eee; border: 1px solid #ccc; font-size: 0.9em }\n#sidebarOptions a { color: #830200; text-decoration: none }\n#sidebarOptions a:hover, #sidebarOptions a:active { background-color: #f5f5f5; border: 1px solid #f5f5f5 color: #C00; }\n#sidebarOptions input { border: 1px solid #830200 }\n#sidebarOptions { padding-left: 0.5em; padding-top: 2em }\n\n#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active { background: #fefefe color: #C00; }\n#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button { color: #830200 }\n#sidebarTabs .tabContents .tiddlyLink:hover, #sidebarTabs .tabContents .button:hover { background: #fefefe; border: none color: #C00; text-decoration: none; }\n#sidebarTabs .tabContents { background: #fefefe }\n#sidebarTabs .tabSelected { padding-bottom: 3px }\n#sidebarTabs .tabUnselected { border-bottom: none; padding-bottom: 3px }\n#sidebarTabs .tabUnselected:hover { border-bottom: none; color: #830200 padding-bottom: 3px; }\n#sidebarTabs { font-family: arial, helvetica }\n\n\n* html .editor textarea, * html .editor input { width: 98% }\n* html .viewer pre { margin-left: 0 }\n\n\n.editor input { border: 1px solid #888; margin-top: 5px }\n.editor textarea { border: 1px solid #888 }\n\n.highlight, .marked { background: transparent; border: none; color: #111; text-decoration: underline }\n\n.listTitle { color: #888 }\n\n.selected .tagging .button, .selected .tagged .button { color: #aaa }\n.selected .tagging .listTitle, .selected .tagged .listTitle { color: #666 }\n.selected .tagging, .selected .tagged { background-color: #f7f7f7; border: 1px solid #ccc }\n.selected .toolbar a { color: #830200 }\n.selected .toolbar a:hover { background: transparent; border: 1px solid #fff color: #333; }\n\n.shadow .title { color: #830200 }\n\n.tabContents { background: #fefefe }\n\n.tabSelected { background: #830200 color: #fefefe; }\n.tabSelected, .tabSelected:hover { background: #fefefe; border: solid 1px #ccc color: #555; }\n\n.tabUnselected { background: #eee; border: solid 1px #ccc color: #830200; }\n.tabUnselected:hover { border: 1px solid #ccc text-decoration: none; }\n\n.tagClear { clear: none }\n\n.tagging .button, .tagged .button { color: #ccc }\n.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active { background: transparent; border: none; color: #333 text-decoration: underline; }\n.tagging .listTitle, .tagged .listTitle { color: #bbb }\n.tagging, .tagged { background-color: #F7F7F7 border: 1px solid #eee; }\n\n\n\n.viewer .button, .editorFooter .button { border: 1px solid #CA0000 color: #555; }\n.viewer .button:active, .viewer .highlight, .editorFooter .button:active, .editorFooter .highlight { background: #9F1313; border-color: #9F1313 color: #fff; }\n.viewer .button:hover, .editorFooter .button:hover { background: #CA0000; border-color: #CA0000 color: #fff; }\n.viewer blockquote { border-left: 5px solid #CA0000 }\n.viewer code { background: #f5f5f5 color: #111; }\n.viewer hr { border-top: dashed 1px #555 }\n.viewer pre { background: #f5f5f5 border: 1px solid #ccc; }\n.viewer table, .viewer td { border: 1px solid #CA0000 }\n.viewer th, thead td { background: #CA0000; border: 1px solid #CA0000; color: #fff }\n\n\n.roundedCorners { \n -webkit-border-radius: 10px;\n -khtml-border-radius: 10px; \n -moz-border-radius: 10px;\n border-radius: 10px;\n} \n\n\n\n;/*}}}*/\n\n
cf. [[TiddlyWiki.com|http://www.tiddlywiki.com/#EmbeddedImages]]\n{{{\n[img[title|filename]]\n[img[filename]]\n[img[title|filename][link]]\n[img[filename][link]]\n}}}
/***\n|''Name:''|TiddlerNotesPlugin|\n|''Description:''|Add notes to tiddlers without modifying the original content|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#TiddlerNotesPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.1|\n|''Date:''|26/10/07|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.3|\n\n!!Concept:\n*The TiddlerNotesPlugin allows you to add notes to tiddlers, without needing to edit the original tiddler. This means that your original content will remain unaltered, and if you update it in the future, you won't lose your notes. Notes are stored in separate tiddlers, but can be viewed and edited from within the original tiddler.\n*For a tiddler titled "~MySlide", the notes are by default saved in a tiddler titled "~MySlide-Notes" and is given a tag of "Notes". The suffix and tags of the notes tiddlers are customizable. You can have one or multiple notes per tiddlers. So it is possible to have for example, teacher's notes and student's notes in the same file.\n*Notes can be configured to start off blank, or pre-filled with the contents of the original tiddler.\n\n!!Usage:\n*{{{<<notes>>}}} is the simplest usage form.\n* additional optional parameters include:\n**{{{heading:}}} the heading to use for the notes box\n**{{{tag:}}} the tag to be given to the notes tiddler\n**{{{suffix:}}} the suffix to be used when naming the notes tiddler\n* a full macro call could look like: {{{<<notes heading:"My Notes" tag:"NoteTiddlers" suffix:"Comments">>}}}\n* To avoid adding {{{<<notes>>}}} to each tiddler you want notes for, you could add the macro call to the ViewTemplate\n** below the line {{{<div class='viewer' macro='view text wikified'></div>}}} add the following line: <br> {{{<div class='viewer' macro='notes'></div>}}}\n** Used in combination with the ~HideWhenPlugin or ~PublisherPlugin, you could have notes be shown only for tiddlers with specific tags. The ~PublisherPlugin would allow you for instance to only have the ~TeachersNotes visible to the teacher, and the ~StudentsNotes for the same tiddler visible to the Student.\n\n!!Configuration\n*<<option chkPrefillNotes>> Enable to pre-fill notes with the original tiddler's contents\n\n!!Demo:\n* [[MySlide]]\n\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\n\nif (!config.options.chkPrefillNotes)\n config.options.chkPrefillNotes = false;\n \nfunction createTiddlyElement(theParent,theElement,theID,theClass,theText,attribs)\n{\n var e = document.createElement(theElement);\n if(theClass != null)\n e.className = theClass;\n if(theID != null)\n e.setAttribute("id",theID);\n if(theText != null)\n e.appendChild(document.createTextNode(theText));\n if(attribs){\n for(var n in attribs){\n e.setAttribute(n,attribs[n]);\n }\n }\n if(theParent != null)\n theParent.appendChild(e);\n return e;\n}\n\nfunction createTiddlyButton(theParent,theText,theTooltip,theAction,theClass,theId,theAccessKey,attribs)\n{\n var theButton = document.createElement("a");\n if(theAction) {\n theButton.onclick = theAction;\n theButton.setAttribute("href","javascript:;");\n }\n if(theTooltip)\n theButton.setAttribute("title",theTooltip);\n if(theText)\n theButton.appendChild(document.createTextNode(theText));\n if(theClass)\n theButton.className = theClass;\n else\n theButton.className = "button";\n if(theId)\n theButton.id = theId;\n if(attribs){\n for(var n in attribs){\n e.setAttribute(n,attribs[n]);\n }\n }\n if(theParent)\n theParent.appendChild(theButton);\n if(theAccessKey)\n theButton.setAttribute("accessKey",theAccessKey);\n return theButton;\n}\n\nconfig.macros.notes={\n \n cancelWarning: "Are you sure you want to abandon changes to your notes for '%0'?",\n editLabel: "edit notes",\n editTitle: "double click to edit",\n saveLabel: "save notes",\n saveTitle: "double click to save",\n cancelLabel: "cancel",\n heading: "Notes",\n suffix: "Notes",\n tag: "Notes",\n \n saveNotes: function(ev){\n e = ev? ev : window.event;\n var theTarget = resolveTarget(e);\n if (theTarget.nodeName.toLowerCase() == "textarea")\n return false;\n var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");\n story.setDirty(title,false);\n var box = document.getElementById("notesContainer"+title);\n var textarea = document.getElementById("notesTextArea"+title);\n if(textarea.getAttribute("oldText")!=textarea.value && !hasClass(theTarget,"cancelNotesButton")){\n var suffix = box.getAttribute("suffix");\n var t = store.getTiddler(title+"-"+suffix);\n store.saveTiddler(title+"-"+suffix,title+"-"+suffix,textarea.value,config.options.txtUserName,new Date(),t?t.tags:box.getAttribute("tag"),t?t.fields:{});\n }\n story.refreshTiddler(title,1,true);\n autoSaveChanges(true);\n return false;\n },\n \n editNotes: function(box,tiddler){\n removeChildren(box);\n story.setDirty(tiddler,true);\n box.title = this.saveTitle;\n box.ondblclick = this.saveNotes;\n createTiddlyButton(box,this.cancelLabel,this.cancelLabel,this.saveNotes,"cancelNotesButton");\n createTiddlyButton(box,this.saveLabel,this.saveLabel,this.saveNotes,"saveNotesButton");\n wikify("!!"+box.getAttribute("heading")+"\sn",box);\n addClass(box,"editor");\n var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");\n var wrapper2 = createTiddlyElement(wrapper1,"div");\n var e = createTiddlyElement(wrapper2,"textarea","notesTextArea"+tiddler);\n var v = store.getValue(tiddler+"-"+box.getAttribute("suffix"),"text");\n if(!v) \n v = config.options.chkPrefillNotes? store.getValue(tiddler,"text"):'';\n e.value = v;\n e.setAttribute("oldText",v);\n var rows = 10;\n var lines = v.match(/\sn/mg);\n var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);\n if(lines != null && lines.length > rows)\n rows = lines.length + 5;\n rows = Math.min(rows,maxLines);\n e.setAttribute("rows",rows);\n box.appendChild(wrapper1);\n },\n \n editNotesButtonOnclick: function(e){\n var title = story.findContainingTiddler(this).getAttribute("tiddler");\n var box = document.getElementById("notesContainer"+title);\n config.macros.notes.editNotes(box,title);\n return false;\n },\n \n ondblclick : function(ev){\n e = ev? ev : window.event;\n var theTarget = resolveTarget(e);\n var title = story.findContainingTiddler(theTarget).getAttribute("tiddler");\n var box = document.getElementById("notesContainer"+title);\n config.macros.notes.editNotes(box,title);\n e.cancelBubble = true;\n if(e.stopPropagation) e.stopPropagation();\n return false;\n },\n \n handler : function(place,macroName,params,wikifier,paramString,tiddler){\n \n params = paramString.parseParams("anon",null,true,false,false);\n var heading = getParam(params,"heading",this.heading);\n var tag = getParam(params,"tag",this.tag);\n var suffix = getParam(params,"suffix",this.suffix);\n var box = createTiddlyElement(place,"div","notesContainer"+tiddler.title,"TiddlerNotes",null,{"source":tiddler.title,params:paramString,heading:heading,tag:tag,suffix:suffix});\n createTiddlyButton(box,this.editLabel,this.editLabel,this.editNotesButtonOnclick,"editNotesButton");\n wikify("!!"+heading+"\sn",box);\n box.title=this.editTitle;\n box.ondblclick = this.ondblclick;\n wikify("<<tiddler [["+tiddler.title+"-"+suffix+"]]>>",box);\n } \n};\n\nStory.prototype.old_notes_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler = function(title,animate,unused){\n if(story.isDirty(title)) {\n if(!confirm(config.macros.notes.cancelWarning.format([title])))\n return false;\n }\n return this.old_notes_closeTiddler.apply(this,arguments);\n}\n\nsetStylesheet(".TiddlerNotes {\sn"+ " background:#eee;\sn"+ " border:1px solid #ccc;\sn"+ " padding:10px;\sn"+ " margin:15px;\sn"+ "}\sn"+ "\sn"+ ".cancelNotesButton,.editNotesButton, .saveNotesButton {\sn"+ " float:right;\sn"+ " border:1px solid #ccc;\sn"+ " padding:2px 5px;\sn"+ "}\sn"+ "\sn"+ ".saveNotesButton{\sn"+ " margin-right:0.5em;\sn"+ "}\sn"+ "\sn"+ ".TiddlerNotes.editor textarea{\sn"+ " border:1px solid #ccc;\sn"+ "}","NotesPluginStyles");\n//!END-PLUGIN-CODE\n// %/\n
// // Excludes any tiddlers from timeline that have been tagged with ''excludeTimeline''\n/*{{{*/\nconfig.macros.timeline.handler = function(place,macroName,params)\n{\n var field = params[0] ? params[0] : "modified";\n var tiddlers = store.reverseLookup("tags","excludeTimeline",false,field);\n var lastDay = "";\n var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1])) : 0;\n for(var t=tiddlers.length-1; t>=last; t--)\n {\n var tiddler = tiddlers[t];\n var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);\n if(theDay != lastDay)\n {\n var theDateList = document.createElement("ul");\n place.appendChild(theDateList);\n createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));\n lastDay = theDay;\n }\n var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink");\n theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));\n }\n}\n/*}}}*/\n
/***\n|''Name:''|DropDownMenuPlugin|\n|''Description:''|Create dropdown menus from unordered lists|\n|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|\n|''Source:''|http://tw.lewcid.org/#DropDownMenuPlugin|\n|''Code Repository:''|http://tw.lewcid.org/svn/plugins|\n|''Version:''|2.1|\n|''Date:''|11/04/2007|\n|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|\n|''~CoreVersion:''|2.2.5|\n\n!!Usage:\n* create a two-level unordered list using wiki syntax, and place {{{<<dropMenu>>}}} on the line after it.\n* to create a vertical menu use {{{<<dropMenu vertical>>}}} instead.\n* to assign custom classes to the list, just pass them as parameters to the macro {{{<<dropMenu className1 className2 className3>>}}}\n\n!!Features:\n*Supports just a single level of drop-downs, as anything more usually provides a poor experience for the user.\n* Very light weight, about 1.5kb of JavaScript and 4kb of CSS.\n* Comes with two built in css 'themes', the default horizontal and vertical. \n\n!!Customizing:\n* to customize the appearance of the menu's, you can either add a custom class as described above or, you can edit the CSS via the StyleSheetDropDownMenu shadow tiddler.\n\n!!Examples:\n* [[DropDownMenuDemo]]\n\n***/\n// /%\n//!BEGIN-PLUGIN-CODE\nconfig.macros.dropMenu={\n\n dropdownchar: "\su25bc",\n\n handler : function(place,macroName,params,wikifier,paramString,tiddler){\n list = findRelated(place.lastChild,"UL","tagName","previousSibling");\n if (!list)\n return;\n addClass(list,"suckerfish");\n if (params.length){\n addClass(list,paramString);\n }\n this.fixLinks(list);\n },\n \n fixLinks : function(el){\n var els = el.getElementsByTagName("li");\n for(var i = 0; i < els.length; i++) {\n if(els[i].getElementsByTagName("ul").length>0){\n var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");\n if(!link){\n var ih = els[i].firstChild.data;\n els[i].removeChild(els[i].firstChild);\n var d = createTiddlyElement(null,"a",null,null,ih+this.dropdownchar,{href:"javascript:;"});\n els[i].insertBefore(d,els[i].firstChild);\n }\n else{\n link.firstChild.data = link.firstChild.data + this.dropdownchar;\n removeClass(link,"tiddlyLinkNonExisting");\n }\n }\n els[i].onmouseover = function() {\n addClass(this, "sfhover");\n };\n els[i].onmouseout = function() {\n removeClass(this, "sfhover");\n };\n }\n } \n};\n\nconfig.shadowTiddlers["StyleSheetDropDownMenuPlugin"] = \n "/*{{{*/\sn"+\n "/***** LAYOUT STYLES - DO NOT EDIT! *****/\sn"+\n "ul.suckerfish, ul.suckerfish ul {\sn"+\n " margin: 0;\sn"+\n " padding: 0;\sn"+\n " list-style: none;\sn"+\n " line-height:1.4em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li {\sn"+\n " display: inline-block; \sn"+\n " display: block;\sn"+\n " float: left; \sn"+\n "}\sn\sn"+\n "ul.suckerfish li ul {\sn"+\n " position: absolute;\sn"+\n " left: -999em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li:hover ul, ul.suckerfish li.sfhover ul {\sn"+\n " left: auto;\sn"+\n "}\sn\sn"+\n "ul.suckerfish ul li {\sn"+\n " float: none;\sn"+\n " border-right: 0;\sn"+\n " border-left:0;\sn"+\n "}\sn\sn"+\n "ul.suckerfish a, ul.suckerfish a:hover {\sn"+\n " display: block;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li a.tiddlyLink, ul.suckerfish li a, #mainMenu ul.suckerfish li a {font-weight:bold;}\sn"+\n "/**** END LAYOUT STYLES *****/\sn"+\n "\sn\sn"+\n "/**** COLORS AND APPEARANCE - DEFAULT *****/\sn"+\n "ul.suckerfish li a {\sn"+\n " padding: 0.5em 1.5em;\sn"+\n " color: #FFF;\sn"+\n " background: #0066aa;\sn"+\n " border-bottom: 0;\sn"+\n " font-weight:bold;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li:hover a, ul.suckerfish li.sfhover a{\sn"+\n " background: #00558F;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li:hover ul a, ul.suckerfish li.sfhover ul a{\sn"+\n " color: #000;\sn"+\n " background: #eff3fa;\sn"+\n " border-top:1px solid #FFF;\sn"+\n "}\sn\sn"+\n "ul.suckerfish ul li a:hover {\sn"+\n " background: #e0e8f5;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li a{\sn"+\n " width:9em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish ul li a, ul.suckerfish ul li a:hover{\sn"+\n " display:inline-block;\sn"+\n " width:9em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish li {\sn"+\n " border-left: 1px solid #00558F;\sn"+\n "}\sn"+\n "/***** END COLORS AND APPEARANCE - DEFAULT *****/\sn"+\n "\sn\sn"+\n "/***** LAYOUT AND APPEARANCE: VERTICAL *****/\sn"+\n "ul.suckerfish.vertical li{\sn"+\n " width:10em;\sn"+\n " border-left: 0px solid #00558f;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical ul li, ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a {\sn"+\n " border-left: 0.8em solid #00558f;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a, ul.suckerfish.vertical li.sfhover a:hover{\sn"+\n " width:8em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical {\sn"+\n " width:10em; text-align:left;\sn"+\n " float:left;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li a {\sn"+\n " padding: 0.5em 1em 0.5em 1em;\sn"+\n " border-top:1px solid #fff;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical, ul.suckerfish.vertical ul {\sn"+\n " line-height:1.4em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover ul, ul.suckerfish.vertical li.sfhover ul { \sn"+\n " margin: -2.4em 0 0 10.9em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover ul li a, ul.suckerfish.vertical li.sfhover ul li a {\sn"+\n " border: 0px solid #FFF;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a{\sn"+\n " padding-right:1.1em;\sn"+\n "}\sn\sn"+\n "ul.suckerfish.vertical li:hover ul li, ul.suckerfish.vertical li.sfhover ul li {\sn"+\n " border-bottom:1px solid #fff;\sn"+\n "}\sn\sn"+\n "/***** END LAYOUT AND APPEARANCE: VERTICAL *****/\sn"+\n "/*}}}*/";\nstore.addNotification("StyleSheetDropDownMenuPlugin",refreshStyles);\n//!END-PLUGIN-CODE\n// %/
Work Notes\n
<!--{{{-->
\n<link rel="alternate" type="application/rss+xml" title="RSS" href="?format=xml" />
\n<!--}}}-->
{{{\nif context.REQUEST.has_key ( 'username' ) and context.REQUEST.has_key ( 'password' ) and context.REQUEST.has_key ( 'email' ):\n if hasattr ( container.users, context.REQUEST.username ):\n return 'Sorry, someone else has registered with your username.'\n password = container.hash ( context.REQUEST.password )\n container.users.manage_addProduct [ 'OFSP' ].manage_addFile ( context.REQUEST.username )\n userObject = getattr ( container.users,context.REQUEST.username )\n userObject.manage_addProperty ( 'password', password, 'string' )\n userObject.manage_addProperty ( 'email', context.REQUEST.email, 'string' )\n return 'Your account has been created.'\nreturn False\n}}}
<html>\n<style>\n.rolodex table {\nborder: 0px solid;\nbackground-color:#FFFF99;\n}\n\n.rolodex tr, .rolodex td {\nborder: 0px solid;\n}\n</style>\n<span class="rolodex">\n <table>\n <tr>\n <td align="right"><b>Firstname:</b></td>\n <td colspan="3"><input name=firstname type=text style="width:100%" /></td></tr>\n <tr>\n<tr>\n <td align="right"><b>FirstnameAgain:</b></td>\n <td colspan="3"><input name=firstname type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Lastname:</b></td>\n <td colspan="3"><input name=lastname type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Email:</b></td>\n <td colspan="3"><input name=email type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Phone:</b></td>\n <td colspan="3"><input name=phone type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right" valign="top"><b>Address:</b></td>\n <td colspan="3"><textarea name=address rows="2" cols="40" style="width:100%" ></textarea></td></tr>\n <tr>\n <td align="right"><b>City:</b></td>\n <td colspan="3"><input name=city type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>State/Province:</b></td>\n <td><input name=state type=text size="5" /></td>\n <td align="right"><b style="width:100%" >ZIP/Postal Code:</b></td>\n <td><input name=zip type=text size="5" style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Country:</b></td>\n <td colspan="3"><input name=country type=text style="width:100%" /></td></tr>\n <tr>\n <td align="right"><b>Webpage:</b></td>\n <td colspan="3"><input name=webpage type=text style="width:100%" /></td></tr>\n <tr>\n <td colspan="4"><sub><b>Notes</b></sub><br>\n <textarea name=notes rows="4" cols="40" style="width:100%" ></textarea></td></tr>\n</span>\n</html>
Link to a collection: <dao role="http://oac.cdlib.org/arcrole/link/search/" href="http://content.cdlib.org/search?style=oac-img&sort=title&relation=ark:/13030/kt9290094p" title="Online items">
<<showtoc>>\n!Heading One\nand some text \n\n!!Heading Three \nBut nested between them \n\n!!Heading Two\nAnd some more text \n!Description\nThis macro will insert a table of contents reflecting the headings that are used in a tiddler and will be automatically updated when you make changes. Each item in the table of contents can be clicked on to jump to that heading. It can be used either inside of select tiddlers or inside a system wide template.\n\nA parameter can be used to show the table of contents of a seperate tiddler, <<showtoc tiddlerTitle>>\n\nIt will also place a link beside each header which will jump the screen to the top of the current tiddler. This will only be displayed if the current tiddler is using the <<showtoc>> macro.\n\nThe appearance of the table of contents and the link to jump to the top can be modified using CSS. An example of this is given below.\n\n!Usage\n!!Only in select tiddlers\nThe table of contents above is an example of how to use this macro in a tiddler. Just insert <<showtoc>> in a tiddler on a line by itself.\n\nIt can also display the table of contents of another tiddler by using the macro with a parameter, <<showtoc tiddlerTitle>>\n!!On every tiddler\nIt can also be used in a template to have it show on every tiddler. An example ViewTemplate is shown below.\n
/***\n|Name|ExportTiddlersPlugin|\n|Source|http://www.TiddlyTools.com/#ExportTiddlersPlugin|\n|Version|2.4.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||\n|Description|select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file|\n\nWhen many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\nExportTiddlersPlugin let you ''select and extract tiddlers from your ~TiddlyWiki documents and save them to a local file'' or a remote server (requires installation of compatible server-side scripting, still under development...). An interactive control panel lets you specify a destination, and then select which tiddlers to export. A convenient 'selection filter' helps you pick desired tiddlers by specifying a combination of modification dates, tags, or tiddler text to be matched or excluded. ''Tiddler data can be output as ~TiddlyWiki "storeArea ~DIVs" that can be imported into another ~TiddlyWiki or as ~RSS-compatible XML that can be published for RSS syndication.''\n\n!!!!!Inline interface (live)\n<<<\n<<exportTiddlers inline>>\n<<<\n!!!!!Usage\n<<<\nOptional "special tiddlers" used by this plugin:\n* SiteUrl^^\nURL for official server-published version of document being viewed (used in XML export)\ndefault: //none//^^\n* SiteHost^^\nhost name/address for remote server (e.g., "www.server.com" or "192.168.1.27")\ndefault: //none//^^\n* SitePost^^\nremote path/filename for submitting changes (e.g., "/cgi-bin/submit.cgi")\ndefault: //none//^^\n* SiteParams^^\narguments (if any) for server-side receiving script\ndefault: //none//^^\n* SiteNotify^^\naddresses (if any) for sending automatic server-side email notices\ndefault: //none//^^\n* SiteID^^\nusername or other authorization identifier for login-controlled access to remote server\ndefault: current TiddlyWiki username (e.g., "YourName")^^\n* SiteDate^^\nstored date/time stamp for most recent published version of document\ndefault: current document.modified value (i.e., the 'file date')^^\n<<<\n!!!!!Example\n<<<\n<<exportTiddlers>>\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''ExportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add {{{<<exportTiddlers>>}}} macro^^\n<<<\n!!!!!Revision History\n<<<\n''2007.07.16 [2.4.1]'' in exportTWHeader(), reset HTML source 'markup' so installed markup is NOT copied to new file.\n''2007.06.30 [2.4.0]'' added "select related tiddlers" feature. Recursively scans the tiddler links[] info to find all tiddlers referenced by any of the currently selected tiddler, and then selects them all (including the original tiddlers). ''//Theoretically//'', selecting all related tiddlers should ensure that the exported file contains all tiddlers needed to properly render all of the originally selected tiddlers.\n''2007.04.19 [2.3.0]'' in exportData(), pass SiteURL value as param to saveToRss(). Fixes 'undefined' appearing in tiddler link in XML output. Also, in refreshExportList(), added 'sort by tags'. Also, added 'group select'... selecting a heading (date,author,tag) auto-selects all tiddlers in that group.\n''2007.03.02 [2.2.6]'' in onClickExportButton(), when selecting open tiddlers for TW2.2, look for "storyDisplay" instead of "tiddlerDisplay" but keep fallback to "tiddlerDisplay" for TW2.1 or earlier\n''2007.03.01 [2.2.5]'' removed hijack of store.saveChanges() (was catching save on http:, but there are other solutions that do a much better job of handling save to server.\n|please see [[ExportTiddlersPluginHistory]] for additional revision details|\n''2005.10.09 [0.0.0]'' development started\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n// // version\n//{{{\nversion.extensions.exportTiddlers = {major: 2, minor: 4, revision: 1, date: new Date(2007,7,16)};\n//}}}\n\n// // macro handler\n//{{{\nconfig.macros.exportTiddlers = {\n label: "export tiddlers",\n prompt: "Copy selected tiddlers to an export document",\n newdefault: "export.html",\n datetimefmt: "0MM/0DD/YYYY 0hh:0mm:0ss" // for "filter date/time" edit fields\n};\n\nconfig.macros.exportTiddlers.handler = function(place,macroName,params) {\n if (params[0]!="inline")\n { createTiddlyButton(place,this.label,this.prompt,onClickExportMenu); return; }\n var panel=createExportPanel(place);\n panel.style.position="static";\n panel.style.display="block";\n}\n\nfunction createExportPanel(place) {\n var panel=document.getElementById("exportPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.exportTiddlers.css,"exportTiddlers");\n panel=createTiddlyElement(place,"span","exportPanel",null,null)\n panel.innerHTML=config.macros.exportTiddlers.html;\n exportShowPanel(document.location.protocol);\n exportInitFilter();\n refreshExportList(0);\n return panel;\n}\n\nfunction onClickExportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("exportPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createExportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n if (panel.style.display!="none") refreshExportList(0); // update list when panel is made visible\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // IE needs explicit scoping for functions called by browser events\n//{{{\nwindow.onClickExportMenu=onClickExportMenu;\nwindow.onClickExportButton=onClickExportButton;\nwindow.exportShowPanel=exportShowPanel;\nwindow.exportShowFilterFields=exportShowFilterFields;\nwindow.refreshExportList=refreshExportList;\n//}}}\n\n// // CSS for floating export control panel\n//{{{\nconfig.macros.exportTiddlers.css = '\s\n#exportPanel {\s\n display: none; position:absolute; z-index:12; width:35em; right:105%; top:6em;\s\n background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\s\n padding: 0.5em; margin:0em; -moz-border-radius:1em;\s\n}\s\n#exportPanel a, #exportPanel td a { color:#009; display:inline; margin:0px; padding:1px; }\s\n#exportPanel table { width:100%; border:0px; padding:0px; margin:0px; font-size:8pt; line-height:110%; background:transparent; }\s\n#exportPanel tr { border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel td { color:#000; border:0px;padding:0px;margin:0px; background:transparent; }\s\n#exportPanel select { width:98%;margin:0px;font-size:8pt;line-height:110%;}\s\n#exportPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%; }\s\n#exportPanel textarea { width:98%;padding:0px;margin:0px;overflow:auto;font-size:8pt; }\s\n#exportPanel .box { border:1px solid black; padding:3px; margin-bottom:5px; background:#f8f8f8; -moz-border-radius:5px; }\s\n#exportPanel .topline { border-top:2px solid black; padding-top:3px; margin-bottom:5px; }\s\n#exportPanel .rad { width:auto;border:0 }\s\n#exportPanel .chk { width:auto;border:0 }\s\n#exportPanel .btn { width:auto; }\s\n#exportPanel .btn1 { width:98%; }\s\n#exportPanel .btn2 { width:48%; }\s\n#exportPanel .btn3 { width:32%; }\s\n#exportPanel .btn4 { width:24%; }\s\n#exportPanel .btn5 { width:19%; }\s\n';\n//}}}\n\n// // HTML for export control panel interface\n//{{{\nconfig.macros.exportTiddlers.html = '\s\n<!-- output target and format -->\s\n<table cellpadding="0" cellspacing="0"><tr><td width=50%>\s\n export to\s\n <select size=1 id="exportTo" onchange="exportShowPanel(this.value);">\s\n <option value="file:" SELECTED>this computer</option>\s\n <option value="http:">web server (http)</option>\s\n <option value="https:">secure web server (https)</option>\s\n <option value="ftp:">file server (ftp)</option>\s\n </select>\s\n</td><td width=50%>\s\n output format\s\n <select id="exportFormat" size=1>\s\n <option value="DIV">TiddlyWiki export file</option>\s\n <option value="TW">TiddlyWiki document</option>\s\n <option value="XML">RSS feed (XML)</option>\s\n </select>\s\n</td></tr></table>\s\n\s\n<!-- export to local file -->\s\n<div id="exportLocalPanel" style="margin-top:5px;">\s\nlocal path/filename<br>\s\n<input type="text" id="exportFilename" size=40 style="width:93%"><input \s\n type="button" id="exportBrowse" value="..." title="select or enter a local folder/file..." style="width:5%" \s\n onclick="this.previousSibling.value=window.promptForExportFilename(this);">\s\n<!--<input type="file" id="exportFilename" size=57 style="width:100%"><br>-->\s\n</div><!--panel-->\s\n\s\n<!-- export to http server -->\s\n<div id="exportHTTPPanel" style="display:none;margin-top:5px;">\s\n<table><tr><td align=left>\s\n server location, script, and parameters<br>\s\n</td><td align=right>\s\n <input type="checkbox" class="chk" id="exportNotify"\s\n onClick="document.getElementById(\s'exportSetNotifyPanel\s').style.display=this.checked?\s'block\s':\s'none\s'"> notify\s\n</td></tr></table>\s\n<input type="text" id="exportHTTPServerURL" onfocus="this.select()"><br>\s\n<div id="exportSetNotifyPanel" style="display:none">\s\n send email notices to<br>\s\n <input type="text" id="exportNotifyTo" onfocus="this.select()"><br>\s\n</div>\s\n</div><!--panel-->\s\n\s\n<!-- export to ftp server -->\s\n<div id="exportFTPPanel" style="display:none;margin-top:5px;">\s\n<table cellpadding="0" cellspacing="0" width="32%"><tr valign="top"><td>\s\n host server<br>\s\n <input type="text" id="exportFTPHost" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n username<br>\s\n <input type="text" id="exportFTPID" onfocus="this.select()"><br>\s\n</td><td width="32%">\s\n password<br>\s\n <input type="password" id="exportFTPPW" onfocus="this.select()"><br>\s\n</td></tr></table>\s\nFTP path/filename<br>\s\n<input type="text" id="exportFTPFilename" onfocus="this.select()"><br>\s\n</div><!--panel-->\s\n\s\n<!-- notes -->\s\nnotes<br>\s\n<textarea id="exportNotes" rows=3 cols=40 style="height:4em;margin-bottom:5px;" onfocus="this.select()"></textarea> \s\n\s\n<!-- list of tiddlers -->\s\n<table><tr align="left"><td>\s\n select:\s\n <a href="JavaScript:;" id="exportSelectAll"\s\n onclick="onClickExportButton(this)" title="select all tiddlers">\s\n all </a>\s\n <a href="JavaScript:;" id="exportSelectChanges"\s\n onclick="onClickExportButton(this)" title="select tiddlers changed since last save">\s\n changes </a> \s\n <a href="JavaScript:;" id="exportSelectOpened"\s\n onclick="onClickExportButton(this)" title="select tiddlers currently being displayed">\s\n opened </a> \s\n <a href="JavaScript:;" id="exportSelectRelated"\s\n onclick="onClickExportButton(this)" title="select all tiddlers related (by link or transclusion) to the currently selected tiddlers">\s\n related </a> \s\n <a href="JavaScript:;" id="exportToggleFilter"\s\n onclick="onClickExportButton(this)" title="show/hide selection filter">\s\n filter </a> \s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportListSmaller"\s\n onclick="onClickExportButton(this)" title="reduce list size">\s\n – </a>\s\n <a href="JavaScript:;" id="exportListLarger"\s\n onclick="onClickExportButton(this)" title="increase list size">\s\n + </a>\s\n</td></tr></table>\s\n<select id="exportList" multiple size="10" style="margin-bottom:5px;"\s\n onchange="refreshExportList(this.selectedIndex)">\s\n</select><br>\s\n</div><!--box-->\s\n\s\n<!-- selection filter -->\s\n<div id="exportFilterPanel" style="display:none">\s\n<table><tr align="left"><td>\s\n selection filter\s\n</td><td align="right">\s\n <a href="JavaScript:;" id="exportHideFilter"\s\n onclick="onClickExportButton(this)" title="hide selection filter">hide</a>\s\n</td></tr></table>\s\n<div class="box">\s\n<input type="checkbox" class="chk" id="exportFilterStart" value="1"\s\n onclick="exportShowFilterFields(this)"> starting date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterStartBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportStartDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterStartBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id="exportFilterEnd" value="1"\s\n onclick="exportShowFilterFields(this)"> ending date/time<br>\s\n<table cellpadding="0" cellspacing="0"><tr valign="center"><td width="50%">\s\n <select size=1 id="exportFilterEndBy" onchange="exportShowFilterFields(this);">\s\n <option value="0">today</option>\s\n <option value="1">yesterday</option>\s\n <option value="7">a week ago</option>\s\n <option value="30">a month ago</option>\s\n <option value="site">SiteDate</option>\s\n <option value="file">file date</option>\s\n <option value="other">other (mm/dd/yyyy hh:mm)</option>\s\n </select>\s\n</td><td width="50%">\s\n <input type="text" id="exportEndDate" onfocus="this.select()"\s\n onchange="document.getElementById(\s'exportFilterEndBy\s').value=\s'other\s';">\s\n</td></tr></table>\s\n<input type="checkbox" class="chk" id=exportFilterTags value="1"\s\n onclick="exportShowFilterFields(this)"> match tags<br>\s\n<input type="text" id="exportTags" onfocus="this.select()">\s\n<input type="checkbox" class="chk" id=exportFilterText value="1"\s\n onclick="exportShowFilterFields(this)"> match titles/tiddler text<br>\s\n<input type="text" id="exportText" onfocus="this.select()">\s\n</div> <!--box-->\s\n</div> <!--panel-->\s\n\s\n<!-- action buttons -->\s\n<div style="text-align:center">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportFilter" value="apply filter">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportStart" value="export tiddlers">\s\n<input type=button class="btn3" onclick="onClickExportButton(this)"\s\n id="exportClose" value="close">\s\n</div><!--center-->\s\n';\n//}}}\n\n// // initialize interface\n// // exportShowPanel(which)\n//{{{\nfunction exportShowPanel(which) {\n var index=0; var panel='exportLocalPanel';\n switch (which) {\n case 'file:':\n case undefined:\n index=0; panel='exportLocalPanel'; break;\n case 'http:':\n index=1; panel='exportHTTPPanel'; break;\n case 'https:':\n index=2; panel='exportHTTPPanel'; break;\n case 'ftp:':\n index=3; panel='exportFTPPanel'; break;\n default:\n alert("Sorry, export to "+which+" is not yet available");\n break;\n }\n exportInitPanel(which);\n document.getElementById('exportTo').selectedIndex=index;\n document.getElementById('exportLocalPanel').style.display='none';\n document.getElementById('exportHTTPPanel').style.display='none';\n document.getElementById('exportFTPPanel').style.display='none';\n document.getElementById(panel).style.display='block';\n}\n//}}}\n\n// // exportInitPanel(which)\n//{{{\nfunction exportInitPanel(which) {\n switch (which) {\n case "file:": // LOCAL EXPORT PANEL: file/path:\n // ** no init - security issues in IE **\n break;\n case "http:": // WEB EXPORT PANEL\n case "https:": // SECURE WEB EXPORT PANEL\n // url\n if (store.tiddlerExists("unawiki_download")) {\n var theURL=store.getTiddlerText("unawiki_download");\n theURL=theURL.replace(/\s[\s[download\s|/,'').replace(/\s]\s]/,'');\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n }\n // server script/params\n var title=(store.tiddlerExists("unawiki_host"))?"unawiki_host":"SiteHost";\n var theHost=store.getTiddlerText(title);\n if (!theHost || !theHost.length) theHost=document.location.host;\n if (!theHost || !theHost.length) theHost=title;\n // get POST\n var title=(store.tiddlerExists("unawiki_post"))?"unawiki_post":"SitePost";\n var thePost=store.getTiddlerText(title);\n if (!thePost || !thePost.length) thePost="/"+title;\n // get PARAMS\n var title=(store.tiddlerExists("unawiki_params"))?"unawiki_params":"SiteParams";\n var theParams=store.getTiddlerText(title);\n if (!theParams|| !theParams.length) theParams=title;\n var serverURL = which+"//"+theHost+thePost+"?"+theParams;\n document.getElementById("exportHTTPServerURL").value=serverURL;\n // get NOTIFY\n var theAddresses=store.getTiddlerText("SiteNotify");\n if (!theAddresses|| !theAddresses.length) theAddresses="SiteNotify";\n document.getElementById("exportNotifyTo").value=theAddresses;\n break;\n case "ftp:": // FTP EXPORT PANEL\n // host\n var siteHost=store.getTiddlerText("SiteHost");\n if (!siteHost || !siteHost.length) siteHost=document.location.host;\n if (!siteHost || !siteHost.length) siteHost="SiteHost";\n document.getElementById("exportFTPHost").value=siteHost;\n // username\n var siteID=store.getTiddlerText("SiteID");\n if (!siteID || !siteID.length) siteID=config.options.txtUserName;\n document.getElementById("exportFTPID").value=siteID;\n // password\n document.getElementById("exportFTPPW").value="";\n // file/path\n document.getElementById("exportFTPFilename").value="";\n break;\n }\n}\n//}}}\n\n// // exportInitFilter()\n//{{{\nfunction exportInitFilter() {\n // start date\n document.getElementById("exportFilterStart").checked=false;\n document.getElementById("exportStartDate").value="";\n // end date\n document.getElementById("exportFilterEnd").checked=false;\n document.getElementById("exportEndDate").value="";\n // tags\n document.getElementById("exportFilterTags").checked=false;\n document.getElementById("exportTags").value="";\n // text\n document.getElementById("exportFilterText").checked=false;\n document.getElementById("exportText").value="";\n // show/hide filter input fields\n exportShowFilterFields();\n}\n//}}}\n\n// // exportShowFilterFields(which)\n//{{{\nfunction exportShowFilterFields(which) {\n var show;\n\n show=document.getElementById('exportFilterStart').checked;\n document.getElementById('exportFilterStartBy').style.display=show?"block":"none";\n document.getElementById('exportStartDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterStartBy').value;\n document.getElementById('exportStartDate').value\n =getFilterDate(val,'exportStartDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterStartBy') && (val=='other'))\n document.getElementById('exportStartDate').focus();\n\n show=document.getElementById('exportFilterEnd').checked;\n document.getElementById('exportFilterEndBy').style.display=show?"block":"none";\n document.getElementById('exportEndDate').style.display=show?"block":"none";\n var val=document.getElementById('exportFilterEndBy').value;\n document.getElementById('exportEndDate').value\n =getFilterDate(val,'exportEndDate').formatString(config.macros.exportTiddlers.datetimefmt);\n if (which && (which.id=='exportFilterEndBy') && (val=='other'))\n document.getElementById('exportEndDate').focus();\n\n show=document.getElementById('exportFilterTags').checked;\n document.getElementById('exportTags').style.display=show?"block":"none";\n\n show=document.getElementById('exportFilterText').checked;\n document.getElementById('exportText').style.display=show?"block":"none";\n}\n//}}}\n\n// // onClickExportButton(which): control interactions\n//{{{\nfunction onClickExportButton(which)\n{\n // DEBUG alert(which.id);\n var theList=document.getElementById('exportList'); if (!theList) return;\n var count = 0;\n var total = store.getTiddlers('title').length;\n switch (which.id)\n {\n case 'exportFilter':\n count=filterExportList();\n var panel=document.getElementById('exportFilterPanel');\n if (count==-1) { panel.style.display='block'; break; }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage("filtered "+formatExportMessage(count,total));\n if (count==0) { alert("No tiddlers were selected"); panel.style.display='block'; }\n break;\n case 'exportStart':\n exportTiddlers();\n break;\n case 'exportHideFilter':\n case 'exportToggleFilter':\n var panel=document.getElementById('exportFilterPanel')\n panel.style.display=(panel.style.display=='block')?'none':'block';\n break;\n case 'exportSelectChanges':\n var lastmod=new Date(document.lastModified);\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n var tiddler=store.getTiddler(theList.options[t].value); if (!tiddler) continue;\n theList.options[t].selected=(tiddler.modified>lastmod);\n count += (tiddler.modified>lastmod)?1:0;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no unsaved changes");\n break;\n case 'exportSelectAll':\n for (var t = 0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count += 1;\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,count));\n break;\n case 'exportSelectOpened':\n for (var t = 0; t < theList.options.length; t++) theList.options[t].selected=false;\n var tiddlerDisplay = document.getElementById("tiddlerDisplay"); // for TW2.1-\n if (!tiddlerDisplay) tiddlerDisplay = document.getElementById("storyDisplay"); // for TW2.2+\n for (var t=0;t<tiddlerDisplay.childNodes.length;t++) {\n var tiddler=tiddlerDisplay.childNodes[t].id.substr(7);\n for (var i = 0; i < theList.options.length; i++) {\n if (theList.options[i].value!=tiddler) continue;\n theList.options[i].selected=true; count++; break;\n }\n }\n document.getElementById("exportStart").disabled=(count==0);\n clearMessage(); displayMessage(formatExportMessage(count,total));\n if (count==0) alert("There are no tiddlers currently opened");\n break;\n case 'exportSelectRelated':\n // recursively build list of related tiddlers\n function getRelatedTiddlers(tid,tids) {\n var t=store.getTiddler(tid); if (!t || tids.contains(tid)) return tids;\n tids.push(t.title);\n if (!t.linksUpdated) t.changed();\n for (var i=0; i<t.links.length; i++)\n if (t.links[i]!=tid) tids=getRelatedTiddlers(t.links[i],tids);\n return tids;\n }\n // for all currently selected tiddlers, gather up the related tiddlers (including self) and select them as well\n var tids=[];\n for (var i=0; i<theList.options.length; i++)\n if (theList.options[i].selected) tids=getRelatedTiddlers(theList.options[i].value,tids);\n // select related tiddlers (includes original selected tiddlers)\n for (var i=0; i<theList.options.length; i++)\n theList.options[i].selected=tids.contains(theList.options[i].value);\n clearMessage(); displayMessage(formatExportMessage(tids.length,total));\n break;\n case 'exportListSmaller': // decrease current listbox size\n var min=5;\n theList.size-=(theList.size>min)?1:0;\n break;\n case 'exportListLarger': // increase current listbox size\n var max=(theList.options.length>25)?theList.options.length:25;\n theList.size+=(theList.size<max)?1:0;\n break;\n case 'exportClose':\n document.getElementById('exportPanel').style.display='none';\n break;\n }\n}\n//}}}\n\n// // list display\n//{{{\nfunction formatExportMessage(count,total)\n{\n var txt=total+' tiddler'+((total!=1)?'s':'')+" - ";\n txt += (count==0)?"none":(count==total)?"all":count;\n txt += " selected for export";\n return txt;\n}\n\nfunction refreshExportList(selectedIndex)\n{\n var theList = document.getElementById("exportList");\n var sort;\n if (!theList) return;\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) sort='modified';\n if (selectedIndex==1) sort='title';\n if (selectedIndex==2) sort='modified';\n if (selectedIndex==3) sort='modifier';\n if (selectedIndex==4) sort='tags';\n\n // unselect headings and count number of tiddlers actually selected\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (!theList.options[t].selected) continue;\n if (theList.options[t].value!="")\n count++;\n else { // if heading is selected, deselect it, and then select and count all in section\n theList.options[t].selected=false;\n for ( t++; t<theList.options.length && theList.options[t].value!=""; t++) {\n theList.options[t].selected=true;\n count++;\n }\n }\n }\n\n // disable "export" button if no tiddlers selected\n document.getElementById("exportStart").disabled=(count==0);\n // show selection count\n var tiddlers = store.getTiddlers('title');\n if (theList.options.length) { clearMessage(); displayMessage(formatExportMessage(count,tiddlers.length)); }\n\n // if a [command] item, reload list... otherwise, no further refresh needed\n if (selectedIndex>4) return;\n\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=\n new Option(tiddlers.length+" tiddlers in document", "",false,false);\n theList.options[i++]=\n new Option(((sort=="title" )?">":indent)+' [by title]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modified")?">":indent)+' [by date]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="modifier")?">":indent)+' [by author]', "",false,false);\n theList.options[i++]=\n new Option(((sort=="tags" )?">":indent)+' [by tags]', "",false,false);\n // output the tiddler list\n switch(sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modifier":\n case "modified":\n var tiddlers = store.getTiddlers(sort);\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a[sort] == b[sort]) return(0); else return (a[sort] > b[sort]) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++)\n {\n var tiddler = tiddlers[t];\n var theSection = "";\n if (sort=="modified") theSection=tiddler.modified.toLocaleDateString();\n if (sort=="modifier") theSection=tiddler.modifier;\n if (theSection != lastSection)\n {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n if (!tags || !tags.length) {\n if (theTitles["untagged"]==undefined) { theTags.push("untagged"); theTitles["untagged"]=new Array(); }\n theTitles["untagged"].push(title);\n }\n else for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n}\n//}}}\n\n// // list filtering\n//{{{\nfunction getFilterDate(val,id)\n{\n var result=0;\n switch (val) {\n case 'site':\n var timestamp=store.getTiddlerText("SiteDate");\n if (!timestamp) timestamp=document.lastModified;\n result=new Date(timestamp);\n break;\n case 'file':\n result=new Date(document.lastModified);\n break;\n case 'other':\n result=new Date(document.getElementById(id).value);\n break;\n default: // today=0, yesterday=1, one week=7, two weeks=14, a month=31\n var now=new Date(); var tz=now.getTimezoneOffset()*60000; now-=tz;\n var oneday=86400000;\n if (id=='exportStartDate')\n result=new Date((Math.floor(now/oneday)-val)*oneday+tz);\n else\n result=new Date((Math.floor(now/oneday)-val+1)*oneday+tz-1);\n break;\n }\n // DEBUG alert('getFilterDate('+val+','+id+')=='+result+"\snnow="+now);\n return result;\n}\n\nfunction filterExportList()\n{\n var theList = document.getElementById("exportList"); if (!theList) return -1;\n\n var filterStart=document.getElementById("exportFilterStart").checked;\n var val=document.getElementById("exportFilterStartBy").value;\n var startDate=getFilterDate(val,'exportStartDate');\n\n var filterEnd=document.getElementById("exportFilterEnd").checked;\n var val=document.getElementById("exportFilterEndBy").value;\n var endDate=getFilterDate(val,'exportEndDate');\n\n var filterTags=document.getElementById("exportFilterTags").checked;\n var tags=document.getElementById("exportTags").value;\n\n var filterText=document.getElementById("exportFilterText").checked;\n var text=document.getElementById("exportText").value;\n\n if (!(filterStart||filterEnd||filterTags||filterText)) {\n alert("Please set the selection filter");\n document.getElementById('exportFilterPanel').style.display="block";\n return -1;\n }\n if (filterStart&&filterEnd&&(startDate>endDate)) {\n var msg="starting date/time:\sn"\n msg+=startDate.toLocaleString()+"\sn";\n msg+="is later than ending date/time:\sn"\n msg+=endDate.toLocaleString()\n alert(msg);\n return -1;\n }\n\n // scan list and select tiddlers that match all applicable criteria\n var total=0;\n var count=0;\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-tiddler list items (section headings)\n var opt=theList.options[i]; if (opt.value=="") continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var tiddler=store.getTiddler(opt.value); if (!tiddler) continue; \n var sel=true;\n if ( (filterStart && tiddler.modified<startDate)\n || (filterEnd && tiddler.modified>endDate)\n || (filterTags && !matchTags(tiddler,tags))\n || (filterText && (tiddler.text.indexOf(text)==-1) && (tiddler.title.indexOf(text)==-1)))\n sel=false;\n opt.selected=sel;\n count+=sel?1:0;\n total++;\n }\n return count;\n}\n//}}}\n\n//{{{\nfunction matchTags(tiddler,cond)\n{\n if (!cond||!cond.trim().length) return false;\n\n // build a regex of all tags as a big-old regex that \n // OR's the tags together (tag1|tag2|tag3...) in length order\n var tgs = store.getTags();\n if ( tgs.length == 0 ) return results ;\n var tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n // build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3\n // turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n cond = cond.replace( regex, "/$1\s\s|/.test(tiddlerTags)" );\n cond = cond.replace( /\ssand\ss/ig, " && " ) ;\n cond = cond.replace( /\ssor\ss/ig, " || " ) ;\n cond = cond.replace( /\ss?not\ss/ig, " ! " ) ;\n\n // if a boolean uses a tag that doesn't exist - it will get left alone \n // (we only turn existing tags into actual tests).\n // replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"\n // if the tag doesn't exist then /tag/.test(...) will always return false.\n cond = cond.replace( /(\ss|^)+[^\s/\s|&!][^\ss]*/g, "false" ) ;\n\n // make a string of the tags in the tiddler and eval the 'cond' string against that string \n // if it's TRUE then the tiddler qualifies!\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try { if ( eval( cond ) ) return true; }\n catch( e ) { displayMessage("Error in tag filter '" + e + "'" ); }\n return false;\n}\n//}}}\n\n// // output data formatting\n// // exportHeader(format)\n//{{{\nfunction exportHeader(format)\n{\n switch (format) {\n case "TW": return exportTWHeader();\n case "DIV": return exportDIVHeader();\n case "XML": return exportXMLHeader();\n }\n}\n//}}}\n\n// // exportFooter(format)\n//{{{\nfunction exportFooter(format)\n{\n switch (format) {\n case "TW": return exportDIVFooter();\n case "DIV": return exportDIVFooter();\n case "XML": return exportXMLFooter();\n }\n}\n//}}}\n\n// // exportTWHeader()\n//{{{\nfunction exportTWHeader()\n{\n // Get the URL of the document\n var originalPath = document.location.href;\n // Check we were loaded from a file URL\n if(originalPath.substr(0,5) != "file:")\n { alert(config.messages.notFileUrlError); return; }\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s");\n // Load the original file\n var original = loadFile(localPath);\n if(original == null)\n { alert(config.messages.cantSaveError); return; }\n // reset existing HTML source markup\n original=updateMarkupBlock(original,"PRE-HEAD");\n original=updateMarkupBlock(original,"POST-HEAD");\n original=updateMarkupBlock(original,"PRE-BODY");\n original=updateMarkupBlock(original,"POST-BODY");\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n { alert(config.messages.invalidFileError.format([localPath])); return; }\n return original.substr(0,posOpeningDiv+startSaveArea.length)\n}\n//}}}\n\n// // exportDIVHeader()\n//{{{\nfunction exportDIVHeader()\n{\n var out=[];\n var now = new Date();\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<html><body>");\n out.push("<style type=\s"text/css\s">");\n out.push("#storeArea {display:block;margin:1em;}");\n out.push("#storeArea div");\n out.push("{padding:0.5em;margin:1em;border:2px solid black;height:10em;overflow:auto;}");\n out.push("#javascriptWarning");\n out.push("{width:100%;text-align:left;background-color:#eeeeee;padding:1em;}");\n out.push("</style>");\n out.push("<div id=\s"javascriptWarning\s">");\n out.push("TiddlyWiki export file<br>");\n out.push("Source"+": <b>"+convertUnicodeToUTF8(document.location.href)+"</b><br>");\n out.push("Title: <b>"+title+"</b><br>");\n out.push("Subtitle: <b>"+subtitle+"</b><br>");\n out.push("Created: <b>"+now.toLocaleString()+"</b> by <b>"+user+"</b><br>");\n out.push("TiddlyWiki "+twver+" / "+"ExportTiddlersPlugin "+pver+"<br>");\n out.push("Notes:<hr><pre>"+document.getElementById("exportNotes").value.replace(regexpNewLine,"<br>")+"</pre>");\n out.push("</div>");\n out.push("<div id=\s"storeArea\s">");\n return out;\n}\n//}}}\n\n// // exportDIVFooter()\n//{{{\nfunction exportDIVFooter()\n{\n var out=[];\n out.push("</div><!--POST-BODY-START-->\sn<!--POST-BODY-END--></body></html>");\n return out;\n}\n//}}}\n\n// // exportXMLHeader()\n//{{{\nfunction exportXMLHeader()\n{\n var out=[];\n var now = new Date();\n var u = store.getTiddlerText("SiteUrl",null);\n var title = convertUnicodeToUTF8(wikifyPlain("SiteTitle").htmlEncode());\n var subtitle = convertUnicodeToUTF8(wikifyPlain("SiteSubtitle").htmlEncode());\n var user = convertUnicodeToUTF8(config.options.txtUserName.htmlEncode());\n var twver = version.major+"."+version.minor+"."+version.revision;\n var pver = version.extensions.exportTiddlers.major+"."\n +version.extensions.exportTiddlers.minor+"."+version.extensions.exportTiddlers.revision;\n out.push("<" + "?xml version=\s"1.0\s"?" + ">");\n out.push("<rss version=\s"2.0\s">");\n out.push("<channel>");\n out.push("<title>" + title + "</title>");\n if(u) out.push("<link>" + convertUnicodeToUTF8(u.htmlEncode()) + "</link>");\n out.push("<description>" + subtitle + "</description>");\n out.push("<language>en-us</language>");\n out.push("<copyright>Copyright " + now.getFullYear() + " " + user + "</copyright>");\n out.push("<pubDate>" + now.toGMTString() + "</pubDate>");\n out.push("<lastBuildDate>" + now.toGMTString() + "</lastBuildDate>");\n out.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");\n out.push("<generator>TiddlyWiki "+twver+" plus ExportTiddlersPlugin "+pver+"</generator>");\n return out;\n}\n//}}}\n\n// // exportXMLFooter()\n//{{{\nfunction exportXMLFooter()\n{\n var out=[];\n out.push("</channel></rss>");\n return out;\n}\n//}}}\n\n// // exportData()\n//{{{\nfunction exportData(theList,theFormat)\n{\n // scan export listbox and collect DIVs or XML for selected tiddler content\n var out=[];\n for (var i=0; i<theList.options.length; i++) {\n // get item, skip non-selected items and section headings\n var opt=theList.options[i]; if (!opt.selected||(opt.value=="")) continue;\n // get tiddler, skip missing tiddlers (this should NOT happen)\n var thisTiddler=store.getTiddler(opt.value); if (!thisTiddler) continue; \n if (theFormat=="TW") out.push(convertUnicodeToUTF8(thisTiddler.saveToDiv()));\n if (theFormat=="DIV") out.push(convertUnicodeToUTF8(thisTiddler.title+"\sn"+thisTiddler.saveToDiv()));\n if (theFormat=="XML") out.push(convertUnicodeToUTF8(thisTiddler.saveToRss(store.getTiddlerText("SiteUrl",""))));\n }\n return out;\n}\n//}}}\n\n// // exportTiddlers(): output selected data to local or server\n//{{{\nfunction exportTiddlers()\n{\n var theList = document.getElementById("exportList"); if (!theList) return;\n\n // get the export settings\n var theProtocol = document.getElementById("exportTo").value;\n var theFormat = document.getElementById("exportFormat").value;\n\n // assemble output: header + tiddlers + footer\n var theData=exportData(theList,theFormat);\n var count=theData.length;\n var out=[]; var txt=out.concat(exportHeader(theFormat),theData,exportFooter(theFormat)).join("\sn");\n var msg="";\n switch (theProtocol) {\n case "file:":\n var theTarget = document.getElementById("exportFilename").value.trim();\n if (!theTarget.length) msg = "A local path/filename is required\sn";\n if (!msg && saveFile(theTarget,txt))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to local file";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "http:":\n case "https:":\n var theTarget = document.getElementById("exportHTTPServerURL").value.trim();\n if (!theTarget.length) msg = "A server URL is required\sn";\n if (document.getElementById('exportNotify').checked)\n theTarget+="¬ify="+encodeURIComponent(document.getElementById('exportNotifyTo').value);\n if (document.getElementById('exportNotes').value.trim().length)\n theTarget+="¬es="+encodeURIComponent(document.getElementById('exportNotes').value);\n if (!msg && exportPost(theTarget+encodeURIComponent(txt)))\n msg=count+" tiddler"+((count!=1)?"s":"")+" exported to "+theProtocol+" server";\n else if (!msg)\n msg+="An error occurred while saving to "+theTarget;\n break;\n case "ftp:":\n default:\n msg="Sorry, export to "+theLocation+" is not yet available";\n break;\n }\n clearMessage(); displayMessage(msg,theTarget);\n}\n//}}}\n\n// // exportPost(url): cross-domain post uses hidden iframe to submit url and capture responses\n//{{{\nfunction exportPost(url)\n{\n var f=document.getElementById("exportFrame"); if (f) document.body.removeChild(f);\n f=document.createElement("iframe"); f.id="exportFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n d.location.replace(url);\n return true;\n}\n//}}}\n\n// // promptForFilename(msg,path,file) uses platform/browser specific functions to get local filespec\n//{{{\nfunction promptForExportFilename(here)\n{\n var msg=here.title; // use tooltip as dialog box message\n var path=getLocalPath(document.location.href);\n var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\s\s"); \n if (slashpos!=-1) path = path.substr(0,slashpos+1); // remove filename from path, leave the trailing slash\n var file=config.macros.exportTiddlers.newdefault;\n var result="";\n if(window.Components) { // moz\n try {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');\n var nsIFilePicker = window.Components.interfaces.nsIFilePicker;\n var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);\n picker.init(window, msg, nsIFilePicker.modeSave);\n var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);\n thispath.initWithPath(path);\n picker.displayDirectory=thispath;\n picker.defaultExtension='html';\n picker.defaultString=file;\n picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);\n if (picker.show()!=nsIFilePicker.returnCancel) var result=picker.file.persistentDescriptor;\n }\n catch(e) { alert('error during local file access: '+e.toString()) }\n }\n else { // IE\n try { // XP only\n var s = new ActiveXObject('UserAccounts.CommonDialog');\n s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';\n s.FilterIndex=3; // default to HTML files;\n s.InitialDir=path;\n s.FileName=file;\n if (s.showOpen()) var result=s.FileName;\n }\n catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE\n }\n return result;\n}\n//}}}
|!Option|!Syntax|!Output|\n|bold font|{{{''bold''}}}|''bold''|\n|italic type|{{{//italic//}}}|//italic//|\n|underlined text|{{{__underlined__}}}|__underlined__|\n|strikethrough text|{{{--strikethrough--}}}|--strikethrough--|\n|superscript text|{{{^^super^^script}}}|^^super^^script|\n|subscript text|{{{~~sub~~script}}}|~~sub~~script|\n|highlighted text|{{{@@highlighted@@}}}|@@highlighted@@|\n|monospaced text|{{{{{{monospaced}}}}}}|{{{monospaced}}}|
//{{{\nconfig.formatters.unshift( {\n name: "inlinetabs",\n match: "\s\s<tabs",\n lookaheadRegExp: /(?:<tabs (.*)>\sn)((?:.|\sn)*?)(?:\sn<\s/tabs>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n var cookie = lookaheadMatch[1];\n var wrapper = createTiddlyElement(null,"div",null,cookie);\n var tabset = createTiddlyElement(wrapper,"div",null,"tabset");\n tabset.setAttribute("cookie",cookie);\n var validTab = false;\n var firstTab = '';\n var tabregexp = /(?:<tab (.*)>)(?:(?:\sn)?)((?:.|\sn)*?)(?:<\s/tab>)/mg;\n while((m = tabregexp.exec(lookaheadMatch[2])) != null)\n {\n if (firstTab == '') firstTab = m[1];\n var tab = createTiddlyButton(tabset,m[1],m[1],story.onClickInlineTab,"tab tabUnselected");\n tab.setAttribute("tab",m[1]);\n tab.setAttribute("content",m[2]);\n tab.title = m[1];\n if(config.options[cookie] == m[1])\n validTab = true;\n }\n if(!validTab)\n config.options[cookie] = firstTab;\n w.output.appendChild(wrapper);\n story.switchInlineTab(tabset,config.options[cookie]);\n w.nextMatch = this.lookaheadRegExp.lastIndex;\n }\n }\n})\n\nStory.prototype.switchInlineTab = function(tabset,tab)\n{\n var cookie = tabset.getAttribute("cookie");\n var theTab = null\n var nodes = tabset.childNodes;\n for(var t=0; t<nodes.length; t++)\n if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)\n {\n theTab = nodes[t];\n theTab.className = "tab tabSelected";\n }\n else\n nodes[t].className = "tab tabUnselected"\n if(theTab)\n {\n if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")\n tabset.parentNode.removeChild(tabset.nextSibling);\n var tabContent = createTiddlyElement(null,"div",null,"tabContents");\n tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);\n wikify(theTab.getAttribute("content"),tabContent);\n if(cookie)\n {\n config.options[cookie] = tab;\n saveOptionCookie(cookie);\n }\n }\n}\n \nStory.prototype.onClickInlineTab = function(e)\n{\n story.switchInlineTab(this.parentNode,this.getAttribute("tab"));\n return false;\n}\n//}}}
[img[filestore/uploads/datamodels/dm101NotationSummary.gif]]
Layed out in tables (can we not do that?)\n*head\n*body\n**main\n*** header\n
Six Major Sections \n*METS Header\n* Descriptive Metadata*\n* Administrative Metadata*\n* File Groups\n* Structural Map\n* Behavior Section*\n \nMay be internal to METS document as XML Schema and/or external to METS document in any format.\n\n \n\n
|>|>|!PageTemplate|\n|>|>|[[SiteTitle]] - [[SiteSubtitle]]|\n|[[MainMenu]]|[[DefaultTiddlers]]<br><br>[[ViewTemplate]]<br><br>[[EditTemplate]]|[[SideBarOptions]]|\n|~|~|[[OptionsPanel]]<br>AdvancedOptions|\n|~|~|SideBarTabs|\n|>|>|[[SiteUrl]]|
merge(config.macros,{\n wordCount: {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n createTiddlyText(place,tiddler&&tiddler.text?tiddler.text.match(/\sw+/g).length:"0");\n }\n }\n});\n
* [[WikiWords|WikiWord]] are automatically transformed to hyperlinks to the respective tiddler\n** the automatic transformation can be suppressed by preceding the respective WikiWord with a tilde ({{{~}}}): {{{~WikiWord}}}\n* [[PrettyLinks]] are enclosed in square brackets and contain the desired tiddler name: {{{[[tiddler name]]}}}\n** optionally, a custom title or description can be added, separated by a pipe character ({{{|}}}): {{{[[title|target]]}}}<br>'''N.B.:''' In this case, the target can also be any website (i.e. URL).
<script label="edit a tiddler">\n var title=prompt("Enter a tiddler title");\n if (!title||!title.length) return; /* cancelled by user */\n story.displayTiddler(null,title,2);\n</script>
<<timeline created >>
/***\n''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#NestedSlidersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''\n\nYou can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n===\n++++!!!!![Usage]>\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater (with optional CSS width value)\n*mouse auto rollover\n*custom label/tooltip/accesskey\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^width^*[label=key|tooltip]>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{^width^}}} (or just {{{^}}})^^\nmakes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)^^\n* {{{*}}}^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{[label=key|tooltip]}}}^^\nuses custom label/tooltip/accesskey. {{{=key}}} and {{{|tooltip}}} are optional. 'key' is must be a ''single letter only''. Default labels/tootips are: ">" (more) and "<" (less), with no default access key assignment.^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, sized floater, rollover, label/tooltip/key, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^30em^*[label=Z|click or press Alt-Z to open]>...\n content\n===\n}}}\n++++(testcookie)!!!^30em^*[label=Z|click or press Alt-Z to open]>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...=I|click for information or press Alt-I]\n put some general information here, plus a floating slider with more specific info:\n +++^10em^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^25em^*[glossary definition]explaining technical terms===\n ===\n===\n----\nnested floaters\n>menu: <<tiddler NestedSlidersExample>>\n(see [[NestedSlidersExample]] for definition)\n----\n===\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label\n''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element\n''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position\n''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)\n''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin. This lets other plugins 'hijack' the function even when they are loaded first.\n''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels. While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels. Short-term workaround is to only adjust the position for 'top-level' floaters.\n''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to. Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.\n''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state\n''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\nformatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin\nmore documentation\n''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}\ntweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\ncode cleanup, added documentation\n''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\nchanged name to EasySlidersPlugin\n''2005.11.03 - 1.0.0'' initial public release\n<<<\n!!!!!Credits\n<<<\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.nestedSliders = {major: 1, minor: 9, revision: 0, date: new Date(2006,5,11)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^(?:[^\s\s^\s\s*\s\s[\s\s>]*\s\s^)?)?(\s\s*)?(\s\s[[^\s\s]]*\s\s])?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie, no accesskey\n var show="none"; var title=">"; var tooltip="show"; var cookie=""; var key="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().slice(1,-1);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // parse custom label/tooltip/accesskey: [label=X|tooltip]\n if (lookaheadMatch[6]) {\n title = lookaheadMatch[6].trim().slice(1,-1);\n var pos=title.indexOf("|");\n if (pos!=-1) { tooltip = title.substr(pos+1,title.length); title=title.substr(0,pos); }\n if (title.substr(title.length-2,1)=="=") { key=title.substr(title.length-1,1); title=title.slice(0,-2); }\n if (pos==-1) tooltip += " "+title; // default tooltip: "show/hide <title>"\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,null,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);\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n btn.keyparam=key; // save the access key letter ("" if none)\n if (key.length) {\n btn.setAttribute("accessKey",key); // init access key\n btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus\n }\n\n // "non-click" MouseOver open/close slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.style.display = show;\n if (lookaheadMatch[4] && lookaheadMatch[4].length>2) panel.style.width=lookaheadMatch[4].slice(1,-1); // custom width\n panel.button = btn; // so the slider panel know which button it belongs to\n btn.sliderPanel=panel;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[8]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[7]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align slider/floater position with button\n adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[7]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nwindow.onClickNestedSlider=function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n // 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" || t=="textarea" || t=="select")\n { ctrls[c].focus(); break; }\n }\n }\n if (this.sliderCookie && this.sliderCookie.length)\n { config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }\n // align slider/floater position with target button\n adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n return false;\n}\n\n// hijack animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }\n\n// adjust panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n if (panelClass=="floatingPanel") {\n var left=0;\n var top=btn.offsetHeight; \n if (place.style.position!="relative") {\n var left=findPosX(btn);\n var top=findPosY(btn)+btn.offsetHeight;\n var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;\n if (p) { left-=findPosX(p); top-=findPosY(p); }\n }\n if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix dcterms: <http://purl.org/dc/terms/>.\n@prefix bibo: <http://purl.org/ontology/bibo/>.\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#integer>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n\n<_:article1>\n rdf:type bibo:AcademicArticle;\n dcterms:title "AN UNUSUAL NEW NEOSAUROPOD DINOSAUR FROM THE LOWER\nCRETACEOUS HASTINGS BEDS GROUP OF EAST SUSSEX, ENGLAND"@en;\n dcterms:creator <_:author1>, <_:author2>;\n dcterms:abstract """Xenoposeidon proneneukos gen. et sp. nov. is a\nneosauropod represented by BMNH R2095, a well-preserved partial\nmid-to-posterior dorsal vertebra from the Berriasian-Valanginian\nHastings Beds Group of Ecclesbourne Glen, East Sussex, England. It was\nbriefly described by Lydekker in 1893, but it has subsequently been\noverlooked. This specimen's concave cotyle, large lateral pneumatic\nfossae, complex system of bony laminae and camerate internal structure\nshow that it represents a neosauropod dinosaur. However, it differs\nfrom all other sauropods in the form of its neural arch, which is\ntaller than the centrum, covers the entire dorsal surface of the\ncentrum, has its posterior margin continuous with that of the cotyle,\nand slopes forward at 35 degrees relative to the vertical. Also unique\nis a broad, flat area of featureless bone on the lateral face of the\narch; the accessory infraparapophyseal and postzygapophyseal laminae\nwhich meet in a V; and the asymmetric neural canal, small and round\nposteriorly but large and teardrop-shaped anteriorly, bounded by\narched supporting laminae. The specimen cannot be referred to any\nknown sauropod genus, and clearly represents a new genus and possibly\na new `family'. Other sauropod remains from the Hastings Beds Group\nrepresent basal Titanosauriformes, Titanosauria and Diplodocidae; X.\nproneneukos may bring to four the number of sauropod `families'\nrepresented in this unit. Sauropods may in general have been much less\nmorphologically conservative than is usually assumed. Since\nneurocentral fusion is complete in R2095, it is probably from a mature\nor nearly mature animal. Nevertheless, size comparisons of R2095 with\ncorresponding vertebrae in the Brachiosaurus brancai holotype HMN SII\nand Diplodocus carnegii holotype CM 84 suggest a rather small\nsauropod: perhaps 15 m long and 7600 kg in mass if built like a\nbrachiosaurid, or 20 m and 2800 kg if built like a diplodocid."""@en;\n dcterms:subject\n<http://id.loc.gov/authorities/sh85038094#concept>,\n<http://id.loc.gov/authorities/sh85117730#concept>,\n<http://id.loc.gov/authorities/sh85097127#concept>;\n dcterms:isPartOf <_:journal1>;\n bibo:volume "50"^^xsd:integer;\n bibo:issue "6"^^xsd:integer;\n bibo:numPages "18"^^xsd:integer;\n bibo:pages "1547-1564";\n bibo:pageStart "1547"^^xsd:integer;\n bibo:pageEnd "1564"^^xsd:integer;\n dcterms:issued "2007-11"^^xsd:date;\n dcterms:language <http://purl.org/NET/marccodes/languages/eng#lang>;\n bibo:authorList ( <_:author1> <_:author2> );\n bibo:doi "10.1111/j.1475-4983.2007.00728.x".\n\n<_:journal1>\n rdf:type bibo:Journal;\n dcterms:title "Palaeontology";\n bibo:issn "0031-0239";\n foaf:homepage\n<http://www3.interscience.wiley.com/journal/118531917/home?CRETRY=1=0 <http://www3.interscience.wiley.com/journal/118531917/home?CRETRY=1&SRETRY=0> >;\n dcterms:publisher <_:publisher1>.\n\n<_:publisher1>\n rdf:type foaf:Organization;\n foaf:name "Blackwell Publishing";\n foaf:homepage <http://www.blackwellpublishing.com/>;\n dcterms:isPartOf <_:publisher2>.\n<_:publisher2>\n rdf:type foaf:Organization;\n foaf:name "Wiley-Blackwell";\n foaf:homepage <http://www.wiley.com/WileyCDA/Brand/id-35.html>;\n dcterms:isPartOf <_:publisher3>.\n<_:publisher3>\n rdf:type foaf:Organization;\n foaf:name "John Wiley & Sons, Inc.";\n foaf:name "Wiley";\n foaf:homepage <http://www.wiley.com/WileyCDA/>.\n\n<_:author1>\n rdf:type foaf:Person;\n foaf:name "Michael Taylor";\n foaf:givenName "Michael";\n foaf:familyName "Taylor";\n foaf:homepage <http://miketaylor.org.uk/>;\n foaf:depiction\n<http://www.miketaylor.org.uk/dino/xeno/images/photos/DINO_4.jpeg>;\n foaf:topic_interest <http://dbpedia.org/resource/Paleontology>,\n<http://id.loc.gov/authorities/sh85066163#concept>;\n foaf:made <_:article1>.\n\n<_:author2>\n rdf:type foaf:Person;\n foaf:name "Darren Naish";\n foaf:givenName "Darren";\n foaf:familyName "Naish";\n foaf:homepage <http://scienceblogs.com/tetrapodzoology/>;\n foaf:depiction\n<http://scienceblogs.com/tetrapodzoology/Naish_profile_70_px.jpg>;\n foaf:topic_interest <http://dbpedia.org/resource/Tetrapod>,\n<http://dbpedia.org/resource/Paleontology>;\n foaf:made <_:article1>.\n
!!!Fedora Repository Service Interfaces \n\n!!!Management Service (API-M)\nIngest - XML-encoded object submission\nCreate - interactive object creation via API requests\nMaintain - interactive object modification via API requests\nValidate -- application of integrity rules to objects\nIdentify - generate unique object identifiers\nSecurity - authentication and access control\nPreserve - automatic content versioning and audit trail\nExport - XML-encoded object formats\n \n!!!Access Service (API-A and API-A-LITE)\nSearch - search repository for objects\nObject Reflection - what disseminations can the object provide?\nObject Dissemination - request a view of the object's content\n \n!!!OAI-PMH Provider Service\nOAI-DC records
<<login>>
96.32.1.163\n\nchanged from 24.151,33,52
/***\n|Name|FullScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#FullScreenPlugin|\n|Version|1.1|\n|Requires|~TW2.x|\n!Description:\nToggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.\n\n!Demo:\nClick the â button in the toolbar for this tiddler. Click it again to turn off fullscreen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nEdit the ViewTemplate to add the fullscreen command to the toolbar.\n\n!History:\n*25-07-06: ver 1.1\n*20-07-06: ver 1.0\n\n!Code\n***/\n//{{{\nvar lewcidFullScreen = false;\n\nconfig.commands.fullscreen =\n{\n text:" ↕ ",\n tooltip:"Fullscreen mode"\n};\n\nconfig.commands.fullscreen.handler = function (event,src,title)\n{\n if (lewcidFullScreen == false)\n {\n lewcidFullScreen = true;\n setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important; width: 100%}',"lewcidFullScreenStyle");\n }\n else\n {\n lewcidFullScreen = false;\n setStylesheet(' ',"lewcidFullScreenStyle");\n }\n}\n\nconfig.macros.fullscreen={};\nconfig.macros.fullscreen.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = params[0]||" â ";\n var tooltip = params[1]||"Fullscreen mode";\n createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);\n}\n\nvar lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler =function(title,animate,slowly)\n{\n lewcid_fullscreen_closeTiddler.apply(this,arguments);\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n\n\nSlider.prototype.lewcidStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n{\n this.lewcidStop();\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n//}}}
I'm testing this out\n<<formTiddler "MyFormTemplate>>\n<<showData>>
/***\nThis tiddler is a special status tiddler. It is a DTML script that interrogates Zope about the status of your tiddlers. The variables below are dynamic and this tiddler is reloaded when you login. Editing this tiddler through ZiddlyWiki will break your ZiddlyWiki. (If you need to make modifications, edit it in the ZMI)\n***/\n//{{{\nif(typeof document.zw == "undefined") var zw = {};\nzw.loggedIn = false;\nzw.anonEdit = false;\nzw.isAdmin = false;\nzw.latestTiddler = 128292280022;\nzw.username = 'Anonymous User';\nconfig.options.txtUserName = 'Anonymous User';\nzw.serverUrl = "http://kennison.name/work/notes";\nversion.extensions.ZiddlyWiki = '1';\nzw.tiddlerList = {\n"SiteSubtitle": "893.27582.25108.27528" ,"SiteTitle": "893.27581.40443.42427" ,"GettingStarted": "892.63082.60525.59801" ,"PageTemplate": "895.18070.64735.51933" ,"ViewTemplate": "896.60308.2409.52804" ,"OptionsPanel": "892.63235.9657.20138" ,"StyleSheet": "904.18328.39800.19729" ,"ColorPalette": "898.7088.22099.63590" ,"StyleSheetColors": "892.52688.26738.31914" ,"StyleSheetLayout": "892.52688.58577.41574" ,"Mets Records": "893.27901.64349.9949" ,"DefaultTiddlers": "893.65002.7422.3447" ,"Grant Ideas": "892.58892.7501.39611" ,"Mets Record From Eprints": "898.30131.5379.1245" ,"Dublin Core Generator": "893.27911.44238.57582" ,"ToggleSideBarMacro": "892.63080.37744.11451" ,"MainMenu": "895.65413.2449.52940" ,"AdvancedOptions": "892.48826.64089.12458" ,"TaggerPlugin": "892.63082.16185.6434" ,"TopMenu": "892.48920.7925.17100" ,"AutoOpenTiddlersPlugin": "893.65010.15179.58009" ,"SinglePageModePlugin": "894.907.46370.41591" ,"TagCloudPlugin": "892.53214.40560.15820" ,"Tagcloud": "892.51644.63424.1979" ,"Contents": "899.56181.58392.44185" ,"contentFooter": "893.59410.53621.30941" ,"Web site to steal from": "904.22352.58528.36761" ,"DropDownMenuPlugin": "893.59335.64310.42410" ,"InlineTabsPlugin": "894.8311.40935.38741" ,"InlineSlidersPlugin": "894.8312.39860.11673" ,"SystemLayout": "893.4792.11304.16093" ,"SystemTiddlers": "893.4795.3585.61883" ,"SystemOptions": "893.4794.40006.24268" ,"ShadowedPages": "893.4790.18394.358" ,"Contents By Creation Date": "893.4709.21807.55705" ,"Contents By Title": "892.63077.6627.37239" ,"Formatting Headings": "892.53589.14582.63300" ,"Formating Inline Text": "892.53590.29633.46899" ,"Formatting Lists": "892.53591.42262.27374" ,"Formatting Preformatted Text": "892.53605.37065.9591" ,"Formatting Tables": "892.53596.24938.19541" ,"Formatting - Inserting Images": "892.53598.7904.29201" ,"Formatting - Hyperlinks": "893.5132.27260.19370" ,"Formating - Adding CSS Class": "901.60799.35178.11110" ,"Formatting - Special Markers": "892.53604.6067.20514" ,"Macros": "892.63086.13939.65450" ,"GoogleGadget": "893.65009.2755.58709" ,"InlineJavascriptPlugin": "892.56010.41246.18688" ,"x_StyleSheet": "893.1928.25542.10069" ,"Script Test": "893.27589.59688.37427" ,"SimpleSearchPlugin": "894.8313.63898.8140" ,"Login": "892.63445.61926.56883" ,"Hawksworx": "893.2954.30723.65024" ,"Formatting Blockquotes": "893.4737.6399.24729" ,"BreadCrumbsPlugin": "893.65008.30281.20582" ,"System Configuration": "893.59333.2419.16486" ,"CookieJar": "896.21623.19770.20360" ,"ImportTiddlersPlugin": "893.53997.31366.19848" ,"NestedSlidersPlugin": "893.59332.206.32955" ,"DCTableOfContentsPlugin": "893.59324.7167.2321" ,"Table of Contents Example": "893.59326.6712.64307" ,"Inline Slider Example": "896.39741.64386.25224" ,"Drop Menu Test": "894.22674.23562.17373" ,"LightBox Example": "896.39863.48129.3822" ,"AccordianMenuPlugin": "893.59416.38930.28023" ,"AccordionMenuPluginDemo": "894.29723.37286.39338" ,"PartTiddlerPlugin": "893.60691.43417.45192" ,"Edit Tiddler Script": "894.5652.47409.16110" ,"Web Templates": "894.28337.9501.60040" ,"IP Address Change": "894.64238.11117.2764" ,"Fedora": "895.14905.18796.14677" ,"eScidDoc": "898.14323.58937.46165" ,"Types of Metadata that we Need": "896.26973.10410.44834" ,"FoXML": "898.54701.2876.46694" ,"Things to Read": "903.65297.22973.35310" ,"Repository Exchange": "897.50549.30612.40448" ,"Dublin Core with Qualifiers": "900.13813.62294.17015" ,"InstantTimestampPlugin": "896.6964.34561.61815" ,"JsDoIt": "896.6971.45669.32273" ,"Color Chart": "896.7026.65016.12049" ,"Recursively chmod directories only": "896.7060.16609.12339" ,"ImportedTiddlers": "899.53571.33300.64102" ,"AWK program to Report Video Use": "896.25359.47338.62958" ,"Eprints Notes": "896.27441.55425.48964" ,"Python XMLSchema": "896.37524.20569.49186" ,"Data Modeling Notation Summary": "897.50538.44068.64358" ,"QuizPlugin": "896.57177.1640.53623" ,"Book Quiz": "896.57181.15840.51097" ,"OKI Interface Definitions": "897.50564.61700.39645" ,"Australian Mets Records": "897.50541.17805.49578" ,"EAD DAO": "897.46400.3797.38912" ,"Dubline Core as Linked Data": "898.7272.45568.62498" ,"Micro Curation": "897.63906.1883.39662" ,"WCSU Colors": "899.49500.36690.50670" ,"Adding Value": "899.53571.33202.44748" ,"FormTiddlerPlugin": "899.53577.49314.41267" ,"MyFormTemplate": "899.60698.13842.44424" ,"MyForm": "899.56736.39748.58572" ,"MyForm2": "899.56852.49787.9676" ,"Error Messages from Zope Products Zope-2.12": "899.65425.15434.56985" ,"Zope Script": "900.2422.51535.42905" ,"Maki Script": "900.2896.38462.17339" ,"Higher Educations and Students": "900.3655.28004.8891" ,"Basic Energy Science": "900.12584.56117.51046" ,"Peer Institutions": "900.21031.38895.48674" ,"Content Types": "900.22802.62122.45619" ,"Distance Education Notes": "902.4056.2282.34542" ,"Higher Edcuation": "900.36941.17160.64768" ,"RDF at USCD": "901.60712.40589.15223" ,"Dublin Core Description Sets": "900.37201.31440.41966" ,"Industrial learning objects": "900.37244.11282.27818" ,"Scholars Site from Harvard": "900.38681.27255.27357" ,"Stuff That I need to get back": "900.54452.19362.22442" ,"Semantic Web Topic": "900.58600.24279.24456" ,"Vocabulary Links": "900.64510.5126.51319" ,"OAI Harvester": "901.1890.50668.34611" ,"Data Structures": "901.10201.19114.41181" ,"Library Mission": "901.10314.35227.47701" ,"How do I do the CAO Counts": "901.19678.24674.65382" ,"Build or Buy": "901.25177.36676.42530" ,"What is librarianship": "901.25986.11527.60433" ,"Digital Reading": "901.30367.8721.59204" ,"Metadata Elsewhere": "901.33387.6671.65501" ,"Integrative Lerning": "902.4056.21699.50329" ,"Buckland and the Catalog": "901.38857.34980.12424" ,"What Metadata do you need": "901.39017.35745.16827" ,"Conversation": "901.39076.26482.41301" ,"URLs for items in an application": "901.43706.4304.50414" ,"Learning Mangement Systems": "901.43888.5420.51592" ,"ffmpeg Notes": "904.26850.27640.19848" ,"Library Futures": "901.60563.64005.10769" ,"RDF Journal Article": "901.60596.6089.11520" ,"Common Cartridge": "902.4055.24419.27835" ,"What's wrong with BlackBoard": "902.4059.39974.36078" ,"Course Management Systems": "902.4076.34480.41745" ,"Micro Curation Video": "902.23719.5258.13550" ,"Z3950 connections": "902.26694.43906.10188" ,"Premis RDF": "902.26548.22899.23790" ,"What we should be working on": "903.1484.32521.25856" ,"III LDAP": "903.3143.58971.20548" ,"Perl Script": "903.3147.52163.4812" ,"GeoCoding Links": "903.65059.26625.40055" ,"Libraries as infrastructure": "903.65223.5414.30924" ,"Knowledge Networks": "904.824.60046.16401" ,"LMS": "904.8082.25220.45056" ,"Fedora APIs": "904.8214.51684.16384" ,"Swiss Document Site": "904.8871.24659.54562" ,"Resource-Method-Representation": "904.9545.18929.24046" ,"Common Rest Design Pattern": "904.11163.14632.11810" ,"Regular Expressions Card": "904.11182.40489.55296" ,"Science Story": "904.18264.34630.33228" ,"Information Seeking Research": "904.31102.43934.7560" };\n//}}}\n
/*\n TiddlyWiki Comments Plugin - Online demo at http://tiddlyguv.org/CommentsPlugin.html\n\n TODO:\n - Support Cascade comment delete when the top-level tiddler is deleted\n - Support more than one < <comments> > per tiddler. This will probably entail creating an invisible root tiddler to\n hold all the comments for a macro together. The user will need to provide an ID for this tiddler.\n - Don't use global "macro" var (use "macro" param a la jquery)\n\n*/\n\n/***\n|Name|CommentsPlugin|\n|Description|Macro for nested comments, where each comment is a separate tiddler.|\n|Source|http://tiddlyguv.org/CommentsPlugin.html#CommentsPlugin|\n|Documentation|http://tiddlyguv.org/CommentsPlugin.html#CommentsPluginInfo|\n|Version|0.1|\n|Author|Michael Mahemoff, Osmosoft|\n|''License:''|[[BSD open source license]]|\n|~CoreVersion|2.2|\n***/\n\n/*{{{*/\nif(!version.extensions.CommentsPlugin) {\n\n version.extensions.CommentsPlugin = {installed:true};\n\n (function(plugin) {\n\n var cmacro = config.macros.comments = {\n\n\n\ninit: function() {\n var stylesheet = store.getTiddlerText(tiddler.title + "##StyleSheet");\n if (stylesheet) { // check necessary because it happens more than once for some reason\n config.shadowTiddlers["StyleSheetCommentsPlugin"] = stylesheet;\n store.addNotification("StyleSheetCommentsPlugin", refreshStyles);\n }\n if (!version.extensions.CommentsPlugin.retainViewTemplate) cmacro.enhanceViewTemplate();\n},\n\nenhanceViewTemplate: function() {\n var template = config.shadowTiddlers.ViewTemplate;\n if ((/commentBreadcrumb/g).test(template)) return; // already enhanced\n var TITLE_DIV = "<div class='title' macro='view title'></div>";\n var commentsDiv = "<div class='commentBreadcrumb' macro='commentBreadcrumb'></div>";\n config.shadowTiddlers.ViewTemplate = template.replace(TITLE_DIV,commentsDiv+"\sn"+TITLE_DIV);\n},\n\nhandler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var macroParams = paramString.parseParams();\n var tiddlerParam = getParam(macroParams, "tiddler");\n tiddler = tiddlerParam ? store.getTiddler(tiddlerParam) : tiddler;\n if (!tiddler || !store.getTiddler(tiddler.title)) return;\n cmacro.buildCommentsArea(tiddler, place, macroParams);\n // cmacro.refreshCommentsFromRoot(story.getTiddler(tiddler.title).commentsEl, tiddler, macroParams);\n cmacro.refreshCommentsFromRoot(place.commentsEl, tiddler, macroParams);\n},\n\n\nbuildCommentsArea: function(rootTiddler, place, macroParams) {\n var commentsArea = createTiddlyElement(place, "div", null, "comments");\n var heading = getParam(macroParams, "heading");\n if (heading) createTiddlyElement(commentsArea, "h1", null, null, heading);\n var comments = createTiddlyElement(commentsArea, "div", null, "");\n place.commentsEl = comments;\n\n if (cmacro.editable(macroParams)) {\n var newCommentArea = createTiddlyElement(commentsArea, "div", null, "newCommentArea", "New comment:");\n cmacro.forceLoginIfRequired(params, newCommentArea, function() {\n var newCommentEl = cmacro.makeTextArea(newCommentArea, macroParams);\n // var addComment = createTiddlyElement(newCommentArea, "button", null, "addComment button", "Add Comment");\n var addComment = createTiddlyButton(newCommentArea, "Add Comment", null, function() {\n var comment = cmacro.createComment(newCommentEl.value, rootTiddler, macroParams); \n newCommentEl.value = "";\n cmacro.refreshCommentsFromRoot(comments, rootTiddler, macroParams);\n }, "addComment button");\n });\n }\n\n},\n\n\nmakeTextArea: function(container, macroParams) {\n var textArea = createTiddlyElement(container, "textarea");\n textArea.rows = getParam(macroParams, "textRows") || 4;\n textArea.cols = getParam(macroParams, "textCols") || 20;\n textArea.value = getParam(macroParams, "text") || "";\n return textArea;\n},\n\nrefreshCommentsFromRoot: function(rootCommentsEl, rootTiddler, macroParams) {\n cmacro.treeifyComments(rootTiddler);\n cmacro.refreshComments(rootCommentsEl, rootTiddler, macroParams);\n},\n\nrefreshComments: function(daddyCommentsEl, tiddler, macroParams) {\n // cmacro.log("refreshComments - root", rootCommentsEl, "daddy", daddyCommentsEl,\n // "tiddler ", tiddler, "macroParams ", macroParams);\n // cmacro.log("refreshComments", arguments);\n\n var commentsEl;\n if (tiddler.fields.daddy) {\n var commentEl = cmacro.buildCommentEl(daddyCommentsEl, tiddler, macroParams);\n daddyCommentsEl.appendChild(commentEl);\n commentsEl = commentEl.commentsEl;\n } else { // root element\n removeChildren(daddyCommentsEl);\n // refreshedEl = story.getTiddler(tiddler.title);\n commentsEl = daddyCommentsEl;\n }\n\n for (var child = tiddler.firstChild; child; child = child.next) {\n cmacro.refreshComments(commentsEl, child, macroParams);\n }\n\n},\n\ntreeifyComments: function(rootTiddler) {\n\n var comments = cmacro.findCommentsFromRoot(rootTiddler);\n\n cmacro.forEach(comments, function(comment) {\n var prev = comment.fields.prev;\n var daddy = comment.fields.daddy;\n if (prev) {\n store.getTiddler(prev).next = comment;\n } else {\n store.getTiddler(daddy).firstChild = comment;\n }\n });\n\n},\n\nlogComments: function(comments) {\n for (var i=0; i<comments.length; i++) {\n var comment = comments[i];\n }\n},\n\nfindCommentsFromRoot: function(rootTiddler) {\n var comments = [];\n store.forEachTiddler(function(title,tiddler) {\n if (tiddler.fields.root==rootTiddler.title) comments.push(tiddler);\n });\n return comments;\n},\n\nfindChildren: function(daddyTiddler) {\n var comments = [];\n store.forEachTiddler(function(title,tiddler) {\n if (tiddler.fields.daddy==daddyTiddler.title) comments.push(tiddler);\n });\n return comments;\n},\n\nbuildCommentEl: function(daddyCommentsEl, comment, macroParams) {\n\n // COMMENT ELEMENT\n var commentEl = document.createElement("div");\n commentEl.className = "comment";\n\n // HEADING <- METAINFO AND DELETE\n var headingEl = createTiddlyElement(commentEl, "div", null, "heading");\n\n var metaInfoEl = createTiddlyElement(headingEl, "div", null, "commentTitle", comment.modifier + '@' + comment.modified.formatString(getParam(macroParams,"dateFormat") || "DDD, MMM DDth, YYYY hh12:0mm:0ss am"));\n metaInfoEl.onclick = function() { \n // story.closeAllTiddlers();\n story.displayTiddler("top", comment.title, null, true);\n // document.location.hash = "#" + comment.title;\n };\n\n var deleteEl = createTiddlyElement(headingEl, "div", null, "deleteComment", "X");\n deleteEl.onclick = function() {\n if (true || confirm("Delete this comment and all of its replies?")) {\n cmacro.deleteTiddlerAndDescendents(comment);\n commentEl.parentNode.removeChild(commentEl);\n }\n };\n\n // TEXT\n commentEl.text = createTiddlyElement(commentEl, "div", null, "commentText");\n wikify(comment.text, commentEl.text);\n\n // REPLY LINK\n if (cmacro.editable(macroParams)) {\n var replyLinkZone = createTiddlyElement(commentEl, "div", null, "replyLinkZone");\n var replyLink = createTiddlyElement(replyLinkZone, "span", null, "replyLink", "reply to this comment");\n replyLink.onclick = function() { cmacro.openReplyLink(comment, commentEl, replyLink, macroParams); };\n }\n\n // var clearance = createTiddlyElement(commentEl, "clearance", null, "clearance");\n // clearance.innerHTML = " ";\n\n // COMMENTS AREA\n commentEl.commentsEl = createTiddlyElement(commentEl, "div", null, "comments");\n\n // RETURN\n return commentEl;\n\n},\n\nopenReplyLink: function(commentTiddler, commentEl, replyLink, macroParams) {\n if (commentEl.replyEl) {\n commentEl.replyEl.style.display = "block";\n return;\n }\n\n commentEl.replyEl = document.createElement("div");\n commentEl.replyEl.className = "reply";\n\n replyLink.style.display = "none";\n var newReplyHeading = createTiddlyElement(commentEl.replyEl, "div", null, "newReply");\n createTiddlyElement(newReplyHeading, "div", null, "newReplyLabel", "New Reply:");\n var closeNewReply = createTiddlyElement(newReplyHeading, "div", null, "closeNewReply", "close");\n closeNewReply.onclick = function() {\n commentEl.replyEl.style.display = "none";\n replyLink.style.display = "block";\n };\n\n cmacro.forceLoginIfRequired(params, commentEl.replyEl, function() {\n var replyText = cmacro.makeTextArea(commentEl.replyEl, macroParams);\n var submitReply = createTiddlyButton(commentEl.replyEl, "Reply", null, function() {\n var newComment = cmacro.createComment(replyText.value, commentTiddler, macroParams);\n replyText.value = "";\n closeNewReply.onclick();\n cmacro.refreshComments(commentEl.commentsEl, newComment, macroParams);\n });\n });\n\n commentEl.insertBefore(commentEl.replyEl, commentEl.commentsEl);\n},\n\n\ncreateComment: function(text, daddy, macroParams) {\n\n var rootTitle = daddy.fields.root ? daddy.fields.root : daddy.title;\n // second case is the situation where daddy *is* root\n var newComment = cmacro.createCommentTiddler(macroParams, rootTitle);\n var fieldsParam = getParam(macroParams, "fields") || "";\n var fields = fieldsParam.decodeHashMap();\n var inheritedFields = (getParam(macroParams, "inheritedFields") || "").split(",");\n cmacro.forEach(inheritedFields, function(field) {\n if (field!="") fields[field] = daddy.fields[field];\n });\n var tagsParam = getParam(macroParams, "tags") || "comment";\n var now = new Date();\n newComment.set(null, text, config.options.txtUserName, now, tagsParam.split(","), now, fields);\n\n var youngestSibling = cmacro.findYoungestChild(daddy)\n if (youngestSibling) newComment.fields.prev = youngestSibling.title;\n newComment.fields.daddy = daddy.title;\n newComment.fields.root = rootTitle;\n\n cmacro.saveTiddler(newComment.title);\n autoSaveChanges(false);\n return newComment;\n},\n\nfindYoungestChild: function(daddy) {\n\n var siblingCount = 0;\n var elderSiblings = cmacro.mapize(cmacro.selectTiddlers(function(tiddler) {\n isChild = (tiddler.fields.daddy==daddy.title);\n if (isChild) siblingCount++;\n return isChild;\n }));\n if (!siblingCount) return null;\n\n // Find the only sibling that doesn't have a prev pointing at it\n var youngestSiblings = cmacro.clone(elderSiblings) // as a starting point\n cmacro.forEachMap(elderSiblings, function(tiddler) {\n delete youngestSiblings[tiddler.fields.prev];\n });\n\n for (title in youngestSiblings) { return youngestSiblings[title]; }\n\n},\n\n// The recursive delete is run by a separate function (nested inside\n// this one, for encapsulation purposes).\ndeleteTiddlerAndDescendents: function(tiddler) {\n\n function deleteRecursively(tiddler) {\n for (var child = tiddler.firstChild; child; child = child.next) {\n deleteRecursively(child);\n }\n store.removeTiddler(tiddler.title);\n }\n\n cmacro.treeifyComments(store.getTiddler(tiddler.fields.root));\n\n // save some info prior to deleting\n var prev = tiddler.fields.prev;\n var next = tiddler.next;\n\n deleteRecursively(tiddler);\n\n // used saved info\n if (next) {\n next.fields.prev = prev;\n cmacro.saveTiddler(next.title);\n }\n\n autoSaveChanges(false);\n\n},\n\n\nforEach: function(list, visitor) { for (var i=0; i<list.length; i++) visitor(list[i]); },\nforEachMap: function(map, visitor) { for (var key in map) visitor(map[key]); },\nselect: function(list, selector) { \n var selection = [];\n cmacro.forEach(list, function(currentItem) {\n if (selector(currentItem)) { selection.push(currentItem); }\n });\n return selection;\n},\nselectTiddlers: function(selector) { \n var tiddlers = [];\n store.forEachTiddler(function(title, tiddler) {\n var wanted = selector(tiddler);\n if (wanted) tiddlers.push(tiddler);\n });\n return tiddlers;\n},\nmap: function(list, mapper) { \n var mapped = [];\n cmacro.forEach(list, function(currentItem) { mapped.push(mapper(currentItem)); });\n return mapped;\n},\nremove: function(list, unwantedItem) {\n return cmacro.select(list,\n function(currentItem) { return currentItem!=unwantedItem; });\n},\nmapize: function(tiddlerList) {\n var map = {};\n cmacro.forEach(tiddlerList, function(tiddler) { map[tiddler.title] = tiddler; });\n return map;\n},\nclone: function(map) { return merge({}, map); },\n\n\neditable: function(params) {\n var editable = getParam(params, "editable");\n return (!editable || editable!="false");\n},\n\nneedsLogin: function(params) {\n var loginCheck = getParam(params, "loginCheck");\n return loginCheck && !window[loginCheck]();\n},\n\nforceLoginIfRequired: function(params, loginPromptContainer, authenticatedBlock) {\n if (cmacro.needsLogin(params)) wikify("<<"+getParam(macroParams, "loginPrompt")+">>", loginPromptContainer);\n else authenticatedBlock();\n},\n\n\nmergeReadOnly: function(first, second) {\n var merged = {};\n for (var field in first) { merged[field] = first[field]; }\n for (var field in second) { merged[field] = second[field]; }\n return merged;\n},\n\n// callers may replace this with their own ID generation algorithm\ncreateCommentTiddler: function(macroParams, rootTitle) {\n // var titleFormat = getParam(macroParams, "titleFormat") || "%root%Comment"; \n var prefix = rootTitle+"Comment"; // was "_comment"\n if (!store.createGuidTiddler) return store.createTiddler(prefix+((new Date()).getTime()));\n return store.createGuidTiddler(prefix);\n},\nsaveTiddler: function(tiddler) {\n var tiddler = (typeof(tiddler)=="string") ? store.getTiddler(tiddler) : tiddler; \n store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, cmacro.mergeReadOnly(config.defaultCustomFields, tiddler.fields), false, tiddler.created)\n},\nlog: function() { if (console && console.firebug) console.log.apply(console, arguments); },\nassert: function() { if (console && console.firebug) console.assert.apply(console, arguments); },\n\n\ncopyFields: function(fromTiddler, toTiddler, field1, field2, fieldN) {\n for (var i=2; i<arguments.length; i++) {\n fieldKey = arguments[i];\n if (fromTiddler.fields[fieldKey]) toTiddler.fields[fieldKey] = fromTiddler.fields[fieldKey];\n }\n}\n}\n\nconfig.macros.commentsCount = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n var count = 0;\n if (tiddler && store.getTiddler(tiddler.title)) {\n var rootTiddler = paramString.length ? paramString : tiddler.title;\n count = config.macros.comments.findCommentsFromRoot(store.getTiddler(rootTiddler)).length;\n }\n createTiddlyText(place, count);\n }\n},\n\nconfig.macros.commentBreadcrumb = {\n handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!tiddler.fields.root) return;\n var rootLink = createTiddlyElement(place, "span", null, null);\n createTiddlyLink(rootLink, tiddler.fields.root, true);\n\n var rootIsParent = tiddler.fields.daddy==tiddler.fields.root;\n var rootIsGrandparent = (store.getTiddler(tiddler.fields.daddy)).fields.daddy==tiddler.fields.root;\n\n if (!rootIsParent) {\n if (!rootIsGrandparent) createTiddlyElement(place, "span", null, null, " > ... ");\n createTiddlyElement(place, "span", null, null, " > ");\n var daddyLink = createTiddlyElement(place, "span", null, null);\n createTiddlyLink(daddyLink, tiddler.fields.daddy, true);\n }\n\n createTiddlyElement(place, "span", null, null, " > ");\n\n // place.appendChild(createTiddlyLink(tiddler.fields.root));\n }\n}\n\nconfig.macros.tiddlyWebComments = {};\nconfig.macros.tiddlyWebComments.handler =\n function(place,macroName,params,wikifier,paramString,tiddler) {\n paramString = "fields:'server.workspace:bags/comments' inheritedFields:'server.host,server.type'";\n config.macros.comments.handler(place,macroName,params,wikifier, paramString,tiddler);\n };\n\nfunction log() { if (console && console.firebug) console.log.apply(console, arguments); }\n\n})(version.extensions.CommentsPlugin);\n\n\n/***\n!StyleSheet\n\n.comments h1 { margin-bottom: 0; padding-bottom: 0; }\n.comments { padding: 0; }\n.comment .comments { margin-left: 1em; }\n\n.comment { padding: 0; margin: 1em 0 0; }\n.comment .comment { margin 0; }\n.comment .toolbar .button { border: 0; color: #9a4; }\n.comment .heading { background: [[ColorPalette::PrimaryPale]]; color: [[ColorPalette::PrimaryDark]]; border-bottom: 1px solid [[ColorPalette::PrimaryLight]]; border-right: 1px solid [[ColorPalette::PrimaryLight]]; padding: 0.5em; height: 1.3em; }\n.commentTitle { float: left; }\n.commentTitle:hover { text-decoration: underline; cursor: pointer; }\n.commentText { clear: both; padding: 1em 1em; }\n.deleteComment { float: right; cursor: pointer; text-decoration:underline; color:[[ColorPalette::SecondaryDark]]; padding-right: 0.3em; }\n.comment .reply { margin-left: 1em; }\n.comment .replyLink { color:[[ColorPalette::SecondaryDark]]; font-style: italic; \n cursor: pointer; text-decoration: underline; margin: 0 1em; }\n.comment .created { }\n.comment .newReply { color:[[ColorPalette::SecondaryDark]]; margin-top: 1em; }\n.newReplyLabel { float: left; }\n.closeNewReply { cursor: pointer; float: right; text-decoration: underline; }\n.comments textarea { width: 100%; padding: 0.3em; margin-bottom: 0.6em; }\n.newCommentArea { margin-top: 0.5em; }\n\n.clearance { clear: both; }\n\n\n!(end of StyleSheet)\n\n***/\n\n config.macros.comments.init();\n\n} // end of 'install only once'\n/*}}}*/\n\n// function log() { if (console && console.firebug) console.log.apply(console, arguments); }\n
!!Headings\n{{{\n!Heading 1\n!!Heading 2\n!!!Heading 3\n!!!!Heading 4\n!!!!!Heading 5\n}}}\n<<<\n!Heading 1\n!!Heading 2\n!!!Heading 3\n!!!!Heading 4\n!!!!!Heading 5\n\n
[img[http://upload.wikimedia.org/wikipedia/en/0/08/Integrative_learning_concept_map.gif]]
bibutils package
How do these thing go together?\n\n!!!Types of Metadata\n* Subject metadata (classification, keywords)\n* Geospatial metadata (postcode, map references, place names)\n* Person-related metadata (people, institutions, co-workers, projects)\n* Usage-related metadata (course reading lists, comments, annotations, library borrowing records)\n* File Format metadata (definitive for preservation)\n* Factual metadata (date, time, user, software system, etc)\n* Bibliographic metadata (including citation)\n* Multilingual/translated metadata (automatic metadata translation)\n* Integrating AMG into deposit workflows (web service orchestration)\n* Useage Data (how often, by whom, etc. was this resource used)\n\n[[Annotated Bibliography on Automated Metadata Generation|http://www.intrallect.com/wiki/index.php/AMG-UC_Annotated_Bibliography]]\n\n[[Natural Language Text Processing with Python|http://www.acm.org/crossroads/xrds13-4/natural_language.html]]\n\n* Technical and Structural about the Data object itself\n* Descriptive, Administrative, Contextual\n\n!!!Metadata Functions ```[[John's JISC CETIS blog|http://blogs.cetis.ac.uk/johnr/2009/08/31/comparing-metadata-requirements-part-2/]]```\n* identify\n* find\n* select\n* use\n* cite\n* manage \n\n[img[http://blogs.cetis.ac.uk/johnr/files/2009/08/oermetadata1.jpg]]
[[from|http://www.jonmott.com/blog/2010/01/the-cms-and-the-pln/]]\n\n!!!CMS Strengths\n* Simple, consistent, and structured Integration with student information systems (SISs) so student rosters are automagically populated in courses\n* Private and secure (i.e., FERPA compliant)\n* Tight tool integration (e.g., quiz scores populated in gradebooks)\n* Supports sophisticated content structuring (e.g., sequencing, branching, and adaptive release)\n\n!!!CMS Weaknesses\n* As it is widely implemented, the CMS is time-bound (i.e., courses go away at the end of the semester)\n* Teacher, rather than student, centric\n* Courses are walled off from each other and from the wider Web, thereby negating the potential of the network effect\n* Limited opportunities for students to "own" and manage their learning experiences within and across courses\n* Rigid, non-modular tools\n* Interoperability challenges and difficulties (significant progress is being made on this front, but the ability to easily move data in and out of the CMS and to plug in alternative tools to replace or enhance native tools remains to be seen)\n\n\n!!!PLN Strengths\n\n*Almost limitless variety and functionality of tools\n* Customizable and adaptable\n* No artificial time boundaries -- remains "on" before, during, and after matriculation\n* Open to interaction and connection with persons without regard to their official registration in programs or courses\n* Easily sharable with others both inside and outside of courses, programs, and institutions\n* Student-centric (i.e., each student selects and uses the tools that make sense for their particular needs and circumstances)\n* Compilable via simple technologies like RSS\n\n!!!PLN Weaknesses\n* Complex and difficult to create for inexperienced students and faculty members\n* Potential security and data exposure problems -- FERPA issues abound\n* Limited institutional control over data\n* Absent or unenforceable SLAs -- no ability to predict or resolve Web application performance issues, outages, or even disappearance
If you can help someone understand something thats good. Pointing out what they need to understand isn't always helpful. They can't handle what information is coming their way now. But I think this is a little like the "productivity paradox", you're too busy getting things done to learn how to do things better.
{{{find . -type d -exec chmod 755 {} \s;}}}\n\nThis will recursively search your directory tree (starting at dir 'dot') and chmod 755 all directories only.\n\nSimilarly, the following will chmod all files only (and ignore the directories):\n\n{{{find . -type f -exec chmod 644 {} \s;}}}
/***\n|Name:|InstantTimestampPlugin|\n|Source|http://instanttimestamp.tiddlyspot.com/|\n|Documentation|TBA|\n|Version|1.0.5 (17-Jan-2007)|\n|Author|SimonBaird|\n|License|Creative Commons Attribution-ShareAlike 2.5 License|\n|~CoreVersion|2.1|\n|Type|plugin|\n|Requires|NA|\n|Overrides|NA|\n|Description|Date Stamp|\n!Description\nIf you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list:\n{{{\n* {ts} or {t} -> timestamp\n* {ds} or {d} -> datestamp\n* !ts or !t at start of line -> !!timestamp\n* !ds or !d at start of line -> !!datestamp\n}}}\n(I added the extra ! since that's how I like it. Remove it from translations below if required)\n!Notes\n* Change the timeFormat and dateFormat below to suit your preference.\n* See also AutoCorrectPlugin\n!History\n* 17-Jan-07, version 1.0.5\n** added fields param to saveTiddler method needed in TW 2.1+\n* 06-Apr-06, version 1.0.4\n** removed the AutoCorrect stuff and put it in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.3\n** now have exclusion by tag and tiddler name, probably less important here than in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.2\n** put matches into array to and eval them to allow generic substitutions\n* 05-Apr-06, version 1.0.1\n** added ds for datestamp as suggested by DanielBaird\n** made case insensitive\n** Added translation for !t at start of line\n* 05-Apr-06, version 1.0.0\n** written after suggestion by Achim Wessling \n!Code\n***/\n//{{{\n\nconfig.InstantTimestamp = {\n\n // adjust to suit\n timeFormat: '0DD.0MM.YY 0hh:0mm',\n dateFormat: '0DD.0MM.YY',\n\n translations: [\n [/^!ts?$/img, "'!!'+now.formatString(config.InstantTimestamp.timeFormat)"],\n [/^!ds?$/img, "'!!'+now.formatString(config.InstantTimestamp.dateFormat)"],\n [/\s{ts?\s}/ig, "now.formatString(config.InstantTimestamp.timeFormat)"],\n [/\s{ds?\s}/ig, "now.formatString(config.InstantTimestamp.dateFormat)"]\n ],\n\n excludeTags: [\n "noAutoCorrect",\n "html",\n "CSS",\n "css",\n "systemConfig",\n "zsystemConfig",\n "Plugins",\n "Plugin",\n "plugins",\n "plugin",\n "javascript",\n "code"\n ],\n\n excludeTiddlers: [\n "StyleSheet",\n "StyleSheetLayout",\n "StyleSheetColors",\n "StyleSheetPrint"\n ]\n\n}; \n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.find(item) != null);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nTiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields) {\n\n tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n var conf = config.InstantTimestamp;\n\n if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {\n\n var now = new Date();\n var trans = config.InstantTimestamp.translations;\n for (var i=0;i<trans.length;i++) {\n newBody = newBody.replace(trans[i][0], eval(trans[i][1]));\n }\n }\n\n return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields);\n}\n\n//}}}
/***\n|Name|DcTableOfContentsPlugin|\n|Author|[[Doug Compton|http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin]]|\n|Contributors|[[Lewcid|http://lewcid.org]], [[FND|http://devpad.tiddlyspot.com]], [[ELS|http://www.tiddlytools.com]]|\n|Source|[[FND's DevPad|http://devpad.tiddlyspot.com#DcTableOfContentsPlugin]]|\n|Version|0.4.1|\n|~CoreVersion|2.2|\n<<showtoc>>\n!Description\nThis macro will insert a table of contents reflecting the headings that are used in a tiddler and will be automatically updated when you make changes. Each item in the table of contents can be clicked on to jump to that heading. It can be used either inside of select tiddlers or inside a system wide template.\n\nA parameter can be used to show the table of contents of a seperate tiddler, <<showtoc tiddlerTitle>>\n\nIt will also place a link beside each header which will jump the screen to the top of the current tiddler. This will only be displayed if the current tiddler is using the <<showtoc>> macro.\n\nThe appearance of the table of contents and the link to jump to the top can be modified using CSS. An example of this is given below.\n\n!Usage\n!!Only in select tiddlers\nThe table of contents above is an example of how to use this macro in a tiddler. Just insert <<showtoc>> in a tiddler on a line by itself.\n\nIt can also display the table of contents of another tiddler by using the macro with a parameter, <<showtoc tiddlerTitle>>\n!!On every tiddler\nIt can also be used in a template to have it show on every tiddler. An example ViewTemplate is shown below.\n\n//{{{\n<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'>Created <span macro='view created date DD-MM-YY'></span>, updated <span macro='view modified date DD-MM-YY'></span></div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class="toc" macro='showtoc'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n//}}}\n\n!Examples\nIf you had a tiddler with the following headings:\n{{{\n!Heading1a\n!!Heading2a\n!!Heading2b\n!!!Heading3\n!Heading1b\n}}}\nthis table of contents would be automatically generated:\n* Heading1a\n** Heading2a\n** Heading2b\n*** Heading3\n* Heading1b\n!Changing how it looks\nTo modifiy the appearance, you can use CSS similiar to the below.\n//{{{\n.dcTOC ul {\n color: red;\n list-style-type: lower-roman;\n}\n.dcTOC a {\n color: green;\n border: none;\n}\n\n.dcTOC a:hover {\n background: white;\n border: solid 1px;\n}\n.dcTOCTop {\n font-size: 2em;\n color: green;\n}\n//}}}\n\n!Revision History\n!!v0.1.0 (2006-04-07)\n* initial release\n!!v0.2.0 (2006-04-10)\n* added the [top] link on headings to jump to the top of the current tiddler\n* appearance can now be customized using CSS\n* all event handlers now return false\n!!v0.3.0 (2006-04-12)\n* added the ability to show the table of contents of a seperate tiddler\n* fixed an error when a heading had a ~WikiLink in it\n!!v0.3.5 (2007-10-16)\n* updated formatter object for compatibility with TiddlyWiki v2.2 (by Lewcid)\n!!v0.4.0 (2007-11-14)\n* added toggle button for collapsing/expanding table of contents element\n* refactored documentation\n!To Do\n* code sanitizing/rewrite\n* documentation refactoring\n* use shadow tiddler for styles\n!Code\n***/\n//{{{\n\nversion.extensions.DcTableOfContentsPlugin= {\n major: 0, minor: 4, revision: 0,\n type: "macro",\n source: "http://devpad.tiddlyspot.com#DcTableOfContentsPlugin"\n};\n\n// Replace heading formatter with our own\nfor (var n=0; n<config.formatters.length; n++) {\n var format = config.formatters[n];\n if (format.name == 'heading') {\n format.handler = function(w) {\n // following two lines is the default handler\n var e = createTiddlyElement(w.output, "h" + w.matchLength);\n w.subWikifyTerm(e, this.termRegExp); //updated for TW 2.2+\n\n // Only show [top] if current tiddler is using showtoc\n if (w.tiddler && w.tiddler.isTOCInTiddler == 1) {\n // Create a container for the default CSS values\n var c = createTiddlyElement(e, "div");\n c.setAttribute("style", "font-size: 0.5em; color: blue;");\n // Create the link to jump to the top\n createTiddlyButton(c, " [top]", "Go to top of tiddler", window.scrollToTop, "dcTOCTop", null, null);\n }\n }\n break;\n }\n}\n\nconfig.macros.showtoc = {\n handler: function(place, macroName, params, wikifier, paramString, tiddler) {\n var text = "";\n var title = "";\n var myTiddler = null;\n\n // Did they pass in a tiddler?\n if (params.length) {\n title = params[0];\n myTiddler = store.getTiddler(title);\n } else {\n myTiddler = tiddler;\n }\n\n if (myTiddler == null) {\n wikify("ERROR: Could not find " + title, place);\n return;\n }\n\n var lines = myTiddler .text.split("\sn");\n myTiddler.isTOCInTiddler = 1;\n\n // Create a parent container so the TOC can be customized using CSS\n var r = createTiddlyElement(place, "div", null, "dcTOC");\n // create toggle button\n createTiddlyButton(r, "toggle", "show/collapse table of contents",\n function() { config.macros.showtoc.toggleElement(this.nextSibling); },\n "toggleButton")\n // Create a container so the TOC can be customized using CSS\n var c = createTiddlyElement(r, "div");\n\n if (lines != null) {\n for (var x=0; x<lines.length; x++) {\n var line = lines[x];\n if (line.substr(0,1) == "!") {\n // Find first non ! char\n for (var i=0; i<line.length; i++) {\n if (line.substr(i, 1) != "!") {\n break;\n }\n }\n var desc = line.substring(i);\n // Remove WikiLinks\n desc = desc.replace(/\s[\s[/g, "");\n desc = desc.replace(/\s]\s]/g, "");\n\n text += line.substr(0, i).replace(/[!]/g, '*');\n text += '<html><a href="javascript:;" onClick="window.scrollToHeading(\s'' + title + '\s', \s'' + desc+ '\s', event)">' + desc+ '</a></html>\sn';\n }\n }\n }\n wikify(text, c);\n }\n}\n\nconfig.macros.showtoc.toggleElement = function(e) {\n if(e) {\n if(e.style.display != "none") {\n e.style.display = "none";\n } else {\n e.style.display = "";\n }\n }\n};\n\nwindow.scrollToTop = function(evt) {\n if (! evt)\n var evt = window.event;\n\n var target = resolveTarget(evt);\n var tiddler = story.findContainingTiddler(target);\n\n if (! tiddler)\n return false;\n\n window.scrollTo(0, ensureVisible(tiddler));\n\n return false;\n};\n\nwindow.scrollToHeading = function(title, anchorName, evt) {\n var tiddler = null;\n\n if (! evt)\n var evt = window.event;\n\n if (title) {\n story.displayTiddler(store.getTiddler(title), title, null, false);\n tiddler = document.getElementById(story.idPrefix + title);\n } else {\n var target = resolveTarget(evt);\n tiddler = story.findContainingTiddler(target);\n }\n\n if (tiddler == null)\n return false;\n \n var children1 = tiddler.getElementsByTagName("h1");\n var children2 = tiddler.getElementsByTagName("h2");\n var children3 = tiddler.getElementsByTagName("h3");\n var children4 = tiddler.getElementsByTagName("h4");\n var children5 = tiddler.getElementsByTagName("h5");\n\n var children = new Array();\n children = children.concat(children1, children2, children3, children4, children5);\n\n for (var i = 0; i < children.length; i++) {\n for (var j = 0; j < children[i].length; j++) {\n var heading = children[i][j].innerHTML;\n\n // Remove all HTML tags\n while (heading.indexOf("<") >= 0) {\n heading = heading.substring(0, heading.indexOf("<")) + heading.substring(heading.indexOf(">") + 1);\n }\n\n // Cut off the code added in showtoc for TOP\n heading = heading.substr(0, heading.length-6);\n\n if (heading == anchorName) {\n var y = findPosY(children[i][j]);\n window.scrollTo(0,y);\n return false;\n }\n }\n }\n return false\n};\n//}}}
!!!What are the possible elements of a statement?\n\nStatement (\n ResourceURI ( <http://dublincore.org/pages/home> )\n\n PropertyURI ( dcterms:subject )\n ValueClassURI ( <http://example.org/terms/Concept> )\n VocabularyEncodingSchemeURI ( <http://purl.org/dc/terms/LCSH> )\n ValueString ( "Metadata" )\n ValueString ( "Métadonnées" )\n )\n\nLiteralValueString ( "DCMI Home Page"\n Language ( en-GB )\n\nSyntaxEncodingSchemeURI ( <http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> )\n\nValueRef - ValueID
>Blackboard remains first and foremost a semester-based, content-delivery oriented, course management system. The software is not (at least noticeably) evolving to become a student-centered learning management system. And while the addition of wikis and blogs inside the Blackboard system is as welcome improvement, there is still little or no integration between student learning tools "inside the moat" and outside of it "in the cloud."
http://digital2.library.unt.edu/vocabularies/agent-qualifiers/\n
http://geocoder.us/\nhttp://wiki.openstreetmap.org/wiki/Main_Page
<<quiz>>