Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
!Dive into Moodle
<<tiddler [[Dive into Moodle]]>>
!Attendance
<<tiddler [[Attendance]]>>
!Dr M's Surgery
<<tiddler [[Dr M's Surgery]]>>
!Advanced assignment -- advanced uploading of files
<<tiddler [[Advanced assignment]]>>
<<tiddler [[Forums, Groups & Choice]]>>
!Feedback
<<tiddler [[Feedback]]>>
!Notes
<<tiddler [[Notes]]>>
[[Moodle Workshop: 22 Aug]]
!!Me
Instructional Technologist at Earlham for 6 years having moved to ITAM from ECS in 02. I've been around a while and accumulated a BSc in Zoology from Coleg y Prifysgol Abertawe (Swansea University) in 1975, a PhD in Entomology from Imperial Collge, London in 1981, and a MSc in Computer Science from Brunel University in 1988. Many and varied interests from Eastern Orthodoxy to pedagogy with technology.
!!Tiddlywiki
[[TiddlyWiki|http://www.tiddlywiki.com/]] <<version>>
[[TW 4 restofus|http://giffmex.org/twfortherestofus.html]]
[[TiddlyWiki Guides|http://tiddlywikiguides.org/index.php?title=TiddlyWiki_Guides]]
[[Tiddly Doc|http://doc.tiddlywiki.org/#StartingPoints]]
[[Light Box Egs|TiddlyLightBoxExamples]]
[[Calendar creator|http://33ad.org/tools/gtdtwcal.php?month=3&year=2007]]
----
<<changeMode Author>>
<<changeMode>>
----
Here's how to mount your personal Home drive when using Windows:
# Double-click on ''My Computer''. You'll see a list with:
** Hard disk drives
** Devices with Removable storage
** Network Drives
# Open up ''Homes on Rahu (H:)''
# That's it!
To copy files from My Documents just open another window to My Documents and drag and drop the collection of files.
Your network home drive is a useful location to store files, to place pages on your web site (in the WWW folder) and as a backup location.
Here's how to mount your personal Home volume:
# In the Finder select Go -> Connect to Server. You'll see [[this window|graphics/connect_2_server.png]]<<imagebox>> pop up.
** Type in smb:/ /rahu.earlham.edu or select the name if it's already there.
** Click Connect
# A new window pops up called 'Select SMB shared volume'. Pull down the list to ''homes''. Click OK.
# Log in with your Earlham username and password. If you choose to save this, you won't have to log in again.
# HOMES is now mounted as a volume on your desktop and you can drag and drop files to it.
[[Moodle docs|http://docs.moodle.org/en/Advanced_uploading_of_files_assignment]]
!!Setting up
!!Points to watch
!!How it works for students
!!ZIP download
!!Returning graded papers
There are two types of assignment activity involving file uploads:
* upload a single file = [[Simple assignment|Assignment : simple file upload]]
* [[advanced uploading of files|Advanced uploading files : features]] = Advanced assignment
Use this version when you want to :
* have students upload multiple files
* allow students to create a note to the teacher about the assignment
* return a marked-up paper to each student
Suggested [[best practices for assignments|Assignments : Best Practices]]
+++!![Create the assignment]
* click [Turn editing on]
* In the appropriate topic or week box pulldown Activity -> Advanced uploading of files
* If you put it into the wrong place, or you change your mind, you can easily move it.
===
+++!![Configure assignment using settings]
+++!!![1 : General]
;Assignment name
:Keep this as short and concise as possible. Especially if you're planning to do the ZIP download
;Description
: This needs three parts:
# Exactly what you want students to write about and how much. Giving the due date does not hurt either.
# The number of files they should upload. Moodle ''does not indicate'' the total number of files that should be uploaded (an unfortunate oversight).
# Operational instruction : click ''[send for marking]''
;Grade
: Numeric grades are more flexible. You will probably want to assign the same grade for all assignments in the same grade category and then use the Gradebook to scale the result. For example you might have 5 short papers each worth 100 points but the final grade for the Short Papers category might be 20% of the overall grade. Rather than make each paper worth 20/5 = 4% you can let the gradebook do the final scaling.
;Availability:
:You can determine when you want the assignment to be accessible to students and the due date and time (from the Moodle server time).
;Prevent late submissions:
:If this is set to 'yes' the upload box is hidden 1 minute after the due time. Students can still see the assignment but not upload anything. Some profs also hide the whole assignment activity in the Course Outline after the due date so that it becomes invisible. If it is set to 'no' students can still upload but there will be a red indicator in the gradebook with the length of time the assignment is late.
[[screenshot|graphics/advanced_assignment_settings_general.png]]<<imagebox>>
===
+++!!![2. Advanced uploading settings]
;Maximum size:
:Max size for all uploaded files. Could be used to make sure students pay attention to file size.
;Allow deleting
:You can allow or prohibit students to delete files they may have uploaded by accident.
; Number uploaded files
:Indicate the number of files you want uploaded for this assignment. ''Note:'' this number is ''not'' shown to students by the system, so you do need to indicate the number of files to upload in the instructions that you give them.
;Allow notes
:Notes is a handy feature that allows students to write a comment about the assignment they have just uploaded
;Hide description before available date
:This is a middle level of hiding. #1 Hide whole assignment, #2 Hide the description, #3 Set the 'available date' to make assignment non-functional before this date (description still visible).
;Email alerts to teachers
:If 'yes' then every uploaded file will spark an email. More useful for distance ed courses.
;Enable send for marking
:This should be set to 'yes'. Setting to 'no' means that students can only post drafts.
[[screenshot|graphics/advanced_assignment_settings_uploading.png]]<<imagebox>>
===
+++!!![3. Common settings]
;Group mode
:Theoretically a group can submit a single assignment.
;Visible
:Can hide/unhide within the activity. Saves doing this in the Course outline.
;Grade category
:If you already have your gradebook setup you can assign the assignment to a grade category. Here again it saves a separate step in the gradebook.
[[screenshot|graphics/advanced_assignment_settings_module.png]]<<imagebox>>
===
Click [Save and return to course] or or if you want to display the assignment to check it click [Save and display]. This latter was the old default.
===
+++!![How it works for students]
* Follow the instructions to do the assignment. Upload all the files required. Note that the system does not indicate the number of files to upload but will will display a Browse/Upload combination whenever there's still a file that needs to be uploaded. [[Screenshot|graphics/advanced_assignment_student_view.png]]<<imagebox>>
* If you make a mistake or create a newer draft you can delete the currently uploaded files and upload new ones.
* Click [Edit notes] to add notes for the teacher as desired.
* Click [Send for marking] button when finished. If you don't do this the teacher ''will not be able to grade your work''. [[screenshot|graphics/advanced_assignment_student_view2.png]]<<imagebox>>
* You'll be prompted with:
>Once the assignment is sent for marking, you will no longer be able to delete or attach file(s). Do you want to continue?
Answer [Yes]
* Now you'll see the Assignment and a statement :
>''Assignment was already submitted for marking and can not be updated''
* When your paper has been graded and returned, you'll see something like this [[screenshot|graphics/Test_ZIP_student_graded_assignment.png]]<<imagebox>>
===
+++![Grading]
<<tiddler [[Grading assignments]]>>
===
!!1. Create Assignment
Advantages of [[Advanced uploading files]]
# When creating the assignment, choose //Advanced uploading of files//
# Make sure to state explicitly the number of submissions required.
!!2. Grading and downloading as Zip
# Open the assignment and click the link //View n submitted assignments//
* You'll see a grading screen like [[this|graphics/Test_ZIP_submissions_grading.png]]<<imagebox>>
* To download all the student's submitted files, click ''Zip and download all submissions''
<<<
!!!Note:
* The submitted files are zipped up into a file called ''assignments.zip''. Make sure that you @@CHANGE the FILENAME@@ when you save it to avoid confusion and possible overwriting.
* usernames are prepended to the submission filenames to make it easy to track owners -- [[demo unzip|graphics/Test_ZIP_submissions_zippedfiles.png]]<<imagebox "note the prepended usernames">>
<<<
* Click the 'Grade' link for the submission you want to grade.
## If you have corrected or marked up the document upload this response file @@FIRST@@ - this process refreshes the window and may obliterate any grade or comments written.
## Select grade and enter comment text. You should finish up with a window like [[this|graphics/Test_ZIP_grading2.png]]<<imagebox "standard grading interface with response file, notes & submissions">>
## Click 'Save and show next' button.
## When you have finished click the 'Save all my feedback' for good measure.
!!3. What the student sees
When the student opens the graded assignment he sees the original assignment, the feedback and grade from the Teacher, together with the returned document, and the submitted files and and notes. The statement "Assignment was already submitted for marking and can not be updated" is somewhat superfluous. [[Screenshot|graphics/Test_ZIP_student_graded_assignment.png]]<<imagebox>>
!!4. 'Quick' grading
Checking the 'Allow Quick grading box' and clicking Save preferences reveals the 'quick grading' columns - [[screenshot|Test_quickgrading.png]]<<imagebox>>. This allows the teacher to grade and comment all the assignments displayed on the page. Two points to note:
# @@Nothing will get saved@@ until the ''Save all my feedback'' button is clicked. It's rather easy to load a new page accidentally which may wipe out your grading input.
# This interface does not permit you to return responses or delete erroneous submissions - you need to use the regular grading interface to do these things.
!!Features
The most flexible assignment type is "Advanced uploading of files". This enables a number of useful features:
* Multiple file submissions - +++[caveat]>
Note that the user interface does ''not'' indicate the number of files expected. All that is present is the upload file field [but this does remain visible until the requisite number of files have been uploaded]. This means that the teacher @@must explicitly state the number of files to upload@@ in the assignment instructions.===
* Ability for the student to delete files uploaded by mistake and re-upload the correct file.
* The //Notes// allows students to state their excuses along with their submitted files.
* No submissions are committed until the ''Send for marking'' button is clicked. Teachers can see instances where files have been uploaded but not yet sent for marking - [[Draft submission|graphics/Test_ZIP_draft_submission.png]]<<imagebox "Note incomplete submission labelled with ''Draft'' ">>
* Teachers have the option of marking up the submitted files and returning them to students.
* Note that the "Upload single file" choice does not allow any of these options.
Quite often you just students simply to upload a file for their assignment. The //Upload a single file// is the assignment option to use in this case.
# Make sure that you have Editing switched ''on'' in your Moodle course
# In the appropriate week or topic section select Add activity -> Upload a single file (if it turns up in the wrong place you can always move it)
# Enter Assignment name. Make it concise and descriptive. "Assignment 1" doesn't really mean a lot.
# Description : It's as well to be very specific and intentional here about what you want your students to do and to emphasize the due date and time. +++[here's an example]
{{{
Write a 500 word piece about your personal encounters with Boggarts.
Have you ever got the 'Ridicculous' counter-charm to work?
Upload the Word document here by 21st September at 4pm.
}}}
===
# Set a grade from the pull-down menu. You can choose a numeric or alphabetic grade or No grade if you do not want to use the Moodle gradebook.
# Available from: Check the 'Disable' box to make the assignment available immediately, otherwise, set a date.
# Due date : Set the latest date and time that students can upload their assignment.
# Prevent late submissions:
** ''No'' : the assignment still shows but the upload box does not so that students cannot upload anything. Some faculty go one step further and hide the assignment after the due date.
** ''Yes'' : the assignment //and// the upload box are still displayed but the student's name will be marked in red in the gradebook and there will be an indication of how late the assignment was uploaded.
# most times you can [Save and return to course] at this point
Other settings:
* Allow resubmitting : set to 'yes' if you want to allow students to revise their work and resubmit it.
* Email alerts : you can have an email sent to you every time a student uploads an assignment.
* Groups : if your students are working in groups set the group mode here
* Grade category : you can assign a pre-created grade category here. A useful shortcut.
Remember than an Assignment is logically distinct from a Resource. Try not to use a Resource activity when an Assignment is called for. Enter clear instructions into the summary box (copy and paste perhaps) and include exactly what you want them to do with regards to Moodle; either upload a documents, write inline, or hand in to class. A reminder of the assignment due date never comes amiss. Alternately, you can create the assignment instructions as a Resource -- online as a Web page is probably best (do your students really want to have to open a separate file of instructions?).
Advantages:
* Can be flexible about offline, online or inline types of assignment.
* Can enforce due date.
* Students can easily view the list of Assignments (in the Activities block) to check that they are up to date. If assignments are mixed up with resources this is much more difficult.
!!!Suggested procedure:
* You'll often have your assignment as a document -- just copy the text and paste it into the assignment Description box.
* Include specific directions for students to either upload the document or print it out and hand in.
* Make sure that you are explicit about the due date. You can prevent late entries if you want to.
Moodle docs on [[attendance|http://docs.moodle.org/en/Attendance#Using_Attendance_in_a_Class_by_a_Teacher]]
!!Setting up Attendance
!!Adding sessions
!!Taking attendance
!!Reports
!!!Omitting breaks (Fall break, Thanksgiving, Spring break, etc)
Background: #fff
Foreground: #333
PrimaryPale: #FFBFBF
PrimaryLight: #BF2323
PrimaryMid: #BF2323
PrimaryDark: #660000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #ff0000
<<viewPalette>>
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<div macro="showWhenExists EditPanelTemplate">[[EditPanelTemplate]]</div>
<div class='editor' macro='edit text'></div>
<!--}}}-->
<<search>>
<<calendar thismonth>>
<<closeAll>>
<<newTiddler tag:News >>
<<newJournal title:'0DD/0MM/YYYY' label: "nouveau journal" tag:Changes tag:excludeLists>>
----
<<saveChanges>>
----
<<changeMode Reader>>
<<changeMode Author>>
<<changeMode>>
Author : <<option txtUserName>>
<!--{{{-->
<div id='header' class='header'>
<div id='topMenu' refresh='content' tiddler='TopMenu'></div>
<div class='siteTitle'>
<span refresh='content' tiddler='SiteTitle'></span>
</div>
<div class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></div>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='AuthorMenu'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='AuthorSidebarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<<tabs txtMainTab "Chrono" "Affichage chronologique des éléments utilisateur" UserTabTimeline "Alpha" "Liste aphabétique des éléments utilisateur" TabUser "Index" "Liste des index utilisateur" UserTabTags>>
[[CommunStyleSheet]]
/*{{{*/
body {
margin: 0 30px 0 30px;
}
#sidebarTabs {
font-size: .8em;
line-height: 1em;
}
/*}}}*/
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title'>
<span class='title' macro='view title'></span>
<!--<span macro="miniTag">--></span>
</div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date [[DD MMM YYYY]]'></span>)</div>
<div class='tagged' macro='tags'></div>
<div class='tagClear'></div>
<div class='viewer' macro='view text wikified'></div>
<div macro="showWhenTagged [[systemList]]">
<div class='viewer' macro="listByTag '' created ''"></div>
</div>
<div class='tagging' macro='tagging'></div>
<div class='tagClear'></div>
<!--}}}-->
Teachers can perform a course backup on your own Moodle course. This can be helpful in the following circumstances:
* You want to have a secure copy of the course for yourself. If you are leaving the College, you can take the course backup with you and have it installed into a new Moodle system.
* You are planning a major update to the course and you want a fall back position in case it goes wrong.
* You are in the middle of a major course change and are getting nervous.
Here's how:
# Go to Administration : backup (you do ''not'' need to be in //Edit course// mode).
# Normally you will not want to include the information that students may have uploaded. Thus for the 'User data' side click the //None// option
** you can decide what components to include. For example, you will probably not be interested in saving Attendance details. Uncheck appropriate boxes.
** scrolling down the page we come to the Users and Files section. You'll probably want something like this: [img[graphics/course_backup_userstuff.png]]
** since you're not saving user data click //None// for Backup role assignments.
** [Continue]
# On the next screen you can (and probably should) change the file name for the backup file. The format is ''backup''-''course short name''-''date of backup''-''time of backup''.zip. Hence the importance of including the graduation year and semester in the short name. You can include some indication of what the backup is for, eg backup-premajorchange-~CLAS150:200920-20090122.zip.
** [Continue]
# you should see 'Backup completed successfully'.
** [Continue]
Now you'll be taken to the //backupdata// folder in the course's //Files// section. You can download the zip file to your own machine merely by clicking on the filename and choosing //Save file//
<<faqlist byTag best_practices title hr>>
/***
''Name:'' CalendarPlugin
''Version:'' <<getversion calendar>> (<<getversiondate calendar "DD MMM YYYY">>)
''Author:'' SteveRumsby
''Configuration:''
|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|
''Syntax:''
|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|
|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|
|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|
|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|
|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|
***/
// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.
// // ''[[Changes]] by ELS 2005.10.30:''
// // config.macros.calendar.handler()
// // ^^use "tbody" element for IE compatibility^^
// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^
// // createCalendarDays()
// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^
// // calendar stylesheet definition
// // ^^use .calendar class-specific selectors, add text centering and margin settings^^
//{{{
config.macros.calendar = {};
config.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];
config.macros.calendar.weekendbg = "#c0c0c0";
config.macros.calendar.monthbg = "#e0e0e0";
config.macros.calendar.holidaybg = "#ffc0c0";
//}}}
// //''Code section:''
// (you should not need to alter anything below here)//
//{{{
if(config.options.txtCalFirstDay == undefined)
config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
config.options.txtCalStartOfWeekend = 5;
config.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>>
version.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};
config.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
config.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead
//}}}
// //Is the given date a holiday?
//{{{
function calendarIsHoliday(date)
{
var longHoliday = date.formatString("0DD/0MM/YYYY");
var shortHoliday = date.formatString("0DD/0MM");
for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {
return true;
}
}
return false;
}
//}}}
// //The main entry point - the macro handler.
// //Decide what sort of calendar we are creating (month or year, and which month or year)
// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.
// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//
// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//
//{{{
config.macros.calendar.handler = function(place,macroName,params)
{
var calendar = createTiddlyElement(place, "table", null, "calendar", null);
var tbody = createTiddlyElement(calendar, "tbody", null, null, null);
var today = new Date();
var year = today.getYear();
if (year<1900) year+=1900;
if (params[0] == "thismonth")
{
cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, today.getMonth());
}
else if (params[0] == "lastmonth") {
var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
}
else if (params[0] == "nextmonth") {
var month = today.getMonth()+1; if (month>11) { month=0; year++; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
}
else {
if (params[0]) year = params[0];
if(params[1])
{
cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, params[1]-1);
}
else
{
cacheReminders(new Date(year, 0, 1, 0, 0), 366);
createCalendarYear(tbody, year);
}
}
window.reminderCacheForCalendar = null;
}
//}}}
//{{{
//This global variable is used to store reminders that have been cached
//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
if (window.findTiddlersWithReminders == null)
return;
window.reminderCacheForCalendar = {};
var leadtimeHash = [];
leadtimeHash [0] = 0;
leadtimeHash [1] = leadtime;
var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
for(var i = 0; i < t.length; i++) {
//just tag it in the cache, so that when we're drawing days, we can bold this one.
window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"];
}
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarYear(calendar, year)
{
var row;
row = createTiddlyElement(calendar, "tr", null, null, null);
var back = createTiddlyElement(row, "td", null, null, null);
var backHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, year-1);
};
createTiddlyButton(back, "<", "Previous year", backHandler);
back.align = "center";
var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);
yearHeader.align = "center";
yearHeader.setAttribute("colSpan", 19);
var fwd = createTiddlyElement(row, "td", null, null, null);
var fwdHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, year+1);
};
createTiddlyButton(fwd, ">", "Next year", fwdHandler);
fwd.align = "center";
createCalendarMonthRow(calendar, year, 0);
createCalendarMonthRow(calendar, year, 3);
createCalendarMonthRow(calendar, year, 6);
createCalendarMonthRow(calendar, year, 9);
}
//}}}
//{{{
function createCalendarMonthRow(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDayHeader(row, 3);
createCalendarDayRows(cal, year, mon);
}
//}}}
//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
var month;
if(nav) {
var back = createTiddlyElement(row, "td", null, null, null);
back.align = "center";
back.style.background = config.macros.calendar.monthbg;
/*
back.setAttribute("colSpan", 2);
var backYearHandler = function() {
var newyear = year-1;
removeChildren(cal);
cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, mon);
};
createTiddlyButton(back, "<<", "Previous year", backYearHandler);
*/
var backMonHandler = function() {
var newyear = year;
var newmon = mon-1;
if(newmon == -1) { newmon = 11; newyear = newyear-1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
};
createTiddlyButton(back, "<", "Previous month", backMonHandler);
month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
// month.setAttribute("colSpan", 3);
month.setAttribute("colSpan", 5);
var fwd = createTiddlyElement(row, "td", null, null, null);
fwd.align = "center";
fwd.style.background = config.macros.calendar.monthbg;
// fwd.setAttribute("colSpan", 2);
var fwdMonHandler = function() {
var newyear = year;
var newmon = mon+1;
if(newmon == 12) { newmon = 0; newyear = newyear+1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
};
createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);
/*
var fwdYear = createTiddlyElement(row, "td", null, null, null);
var fwdYearHandler = function() {
var newyear = year+1;
removeChildren(cal);
cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, mon);
};
createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);
*/
} else {
month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
month.setAttribute("colSpan", 7);
}
month.align = "center";
month.style.background = config.macros.calendar.monthbg;
}
//}}}
//{{{
function createCalendarDayHeader(row, num)
{
var cell;
for(var i = 0; i < num; i++) {
for(var j = 0; j < 7; j++) {
var d = j + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);
if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
cell.style.background = config.macros.calendar.weekendbg;
}
}
}
//}}}
//{{{
function createCalendarDays(row, col, first, max, year, mon)
{
var i;
for(i = 0; i < col; i++) {
createTiddlyElement(row, "td", null, null, null);
}
var day = first;
for(i = col; i < 7; i++) {
var d = i + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
var daycell = createTiddlyElement(row, "td", null, null, null);
var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);
if(day > 0 && day <= max) {
var celldate = new Date(year, mon, day);
// ELS 2005.10.30: use <<date>> macro's showDate() function to create popup
if (window.showDate) {
showDate(daycell,celldate,"popup","DD","DD-MMM-YYYY",true, isaWeekend);
} else {
if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
var title = celldate.formatString(config.macros.calendar.tiddlerformat);
if(calendarIsHoliday(celldate)) {
daycell.style.background = config.macros.calendar.holidaybg;
}
if(window.findTiddlersWithReminders == null) {
var link = createTiddlyLink(daycell, title, false);
link.appendChild(document.createTextNode(day));
} else {
var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
}
}
}
day++;
}
}
//}}}
// //We've clicked on a day in a calendar - create a suitable pop-up of options.
// //The pop-up should contain:
// // * a link to create a new entry for that date
// // * a link to create a new reminder for that date
// // * an <hr>
// // * the list of reminders for that date
//{{{
function onClickCalendarDate(e)
{
var button = this;
var date = button.getAttribute("title");
var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));
date = dat.formatString(config.macros.calendar.tiddlerformat);
var popup = createTiddlerPopup(this);
popup.appendChild(document.createTextNode(date));
var newReminder = function() {
var t = store.getTiddlers(date);
displayTiddler(null, date, 2, null, null, false, false);
if(t) {
document.getElementById("editorBody" + date).value += "\n<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) +
" year:" + (dat.getYear()+1900) + " title: >>";
} else {
document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) +
" year:" + (dat.getYear()+1900) + " title: >>";
}
};
var link = createTiddlyButton(popup, "New reminder", null, newReminder);
popup.appendChild(document.createElement("hr"));
var t = findTiddlersWithReminders(dat, [0,14], null, 1);
for(var i = 0; i < t.length; i++) {
link = createTiddlyLink(popup, t[i].tiddler, false);
link.appendChild(document.createTextNode(t[i].tiddler));
}
}
//}}}
//{{{
function calendarMaxDays(year, mon)
{
var max = config.macros.calendar.monthdays[mon];
if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {
max++;
}
return max;
}
//}}}
//{{{
function createCalendarDayRows(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1 + 7;
var day1 = -first1 + 1;
var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first2 < 0) first2 = first2 + 7;
var day2 = -first2 + 1;
var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first3 < 0) first3 = first3 + 7;
var day3 = -first3 + 1;
var max1 = calendarMaxDays(year, mon);
var max2 = calendarMaxDays(year, mon+1);
var max3 = calendarMaxDays(year, mon+2);
while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
}
}
//}}}
//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1+ 7;
var day1 = -first1 + 1;
var max1 = calendarMaxDays(year, mon);
while(day1 <= max1) {
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
}
}
//}}}
// //ELS 2005.10.30: added styles
//{{{
setStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { font-size:10pt; text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");
//}}}
Sometimes you need to change the colour of the title or name of a resource or activity in order to distinguish it or draw attention to it in the course outline.
Follow the screen tutorial to see how to to do this:
<html>
<p> </p>
<object width="720" height="405">
<param name="movie" value="http://www.earlham.edu/markp/moodledocs/graphics/colorize_resource2.swf"></param><param name="wmode" value="transparent"></param><embed src="http://www.earlham.edu/markp/moodledocs/graphics/colorize_resource2.swf" type="application/x-shockwave-flash" wmode="transparent" width="720" height="405"></embed>
</object>
<p> </p>
</html>
/***
|''Name:''|ChangeModePlugin|
|''Description:''|Change template and styleSheet|
|''Credits:''|SaqImtiaz for is PresentationPlugin|
|''Version:''|0.0.4|
|''Date:''|Jun 5, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#changeModePlugin|
|''Usage:''|{{{<<changeMode [newMode]>>}}}<br>{{{newMode: if omitted the default mode is applied}}}|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.ChangeModePlugin =
{
major: 0, minor: 0, revision: 4,
date: new Date("Jun 9, 2007"),
source: 'http://tiddlywiki.bidix.info/#ChangeModePlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0'
};
// From SaqImtiaz's PresentationPlugin
//---------------------------------------------------
TiddlyWiki.prototype.isTiddler= function (title)
{
return store.tiddlerExists(title) || store.isShadowTiddler(title);
};
TiddlyWiki.prototype.removeNotification = function(title,fn)
{
for (var i=0; i<this.namedNotifications.length; i++)
if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))
this.namedNotifications.splice(i,1);
};
Story.prototype.chooseTemplateForTiddler_core = Story.prototype.chooseTemplateForTiddler;
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
if (!template)
template = DEFAULT_VIEW_TEMPLATE;
var mode = config.macros.changeMode.currentMode;
if (template == DEFAULT_VIEW_TEMPLATE) {
if (store.isTiddler(mode+"ViewTemplate"))
return mode+"ViewTemplate";
} else if (template == DEFAULT_EDIT_TEMPLATE) {
if (store.isTiddler(mode+"EditTemplate"))
return mode+"EditTemplate";
}
return this.chooseTemplateForTiddler_core(title,template);
}
Story.prototype.lewcidrefreshAllTiddlers = function()
{
var place = document.getElementById(this.container);
var e = place.firstChild;
if(!e) return;
this.refreshTiddler(e.getAttribute("tiddler"),null,true);
while((e = e.nextSibling) != null)
this.refreshTiddler(e.getAttribute("tiddler"),null,true);
}
//---------------------------------------------------
// manage different modes
//
// config.macros.changeMode.initMode: the name of the initial Mode
// config.macros.changeMode.readOnlyModes: array containing readOnly mode (no Backstage and readOnly)
//
config.macros.changeMode =
{
currentMode: '', // defaultMode
initMode: 'Reader',
readOnlyModes : ['Reader'],
noBackstage : ['Reader', 'Author'],
singlePageMode: ['Reader', 'Author'],
lingo: {
label: "%0 Mode",
prompt: "Change the current mode to '%0'",
modeName: {
Author: 'Author',
Reader: 'Reader',
'': '(default)'
}
},
handler: function(place,macroName,params) {
var newMode = (params[0] ? params[0]: ""); // default to ''
var newModeName = (this.lingo.modeName[newMode] ? this.lingo.modeName[newMode]: newMode); // default to ''
var label = this.lingo.label.format([newModeName]);
var prompt = this.lingo.prompt.format([newModeName]);
createTiddlyButton(place, label, prompt, function() {config.macros.changeMode.action(newMode);}, null, null, null);
},
action: function(template) {
config.macros.changeMode.applyMode(template);
},
defaults: [
{name: "StyleSheet", notify: refreshStyles},
{name: "PageTemplate", notify: refreshPageTemplate}
],
applyMode: function (newMode) {
var oldMode = this.currentMode;
var oldStyleElement = document.getElementById(oldMode+"StyleSheet");
if (oldStyleElement) {
oldStyleElement.parentNode.removeChild(oldStyleElement);
}
// change Palette
if (store.isTiddler(newMode + 'ColorPalette')) {
var tiddler = new Tiddler('ColorPalette');
tiddler.tags.push('admin');
if (!newMode) {
if (store.isTiddler('defaultColorPalette'))
tiddler.text = store.getTiddlerText('defaultColorPalette');
else
tiddler.text = config.shadowTiddlers['ColorPalette'];
} else {
tiddler.text = store.getTiddlerText(newMode + 'ColorPalette');
}
store.addTiddler(tiddler);
}
for (var i=0; i< this.defaults.length; i++)
{
var name = this.defaults[i]["name"];
var newElement = store.isTiddler(newMode + name) ? newMode + name : name;
store.removeNotification(oldMode + name, this.defaults[i]["notify"]);
store.addNotification(newElement,this.defaults[i]["notify"]);
store.notify(newElement); //just one do blanket notify instead?
}
if (backstage && !backstage.button)
backstage.init();
// change readOnly
if (this.readOnlyModes.indexOf(newMode) == -1) {
readOnly = false;
}
else {
readOnly = true;
}
// change backstage display
if (backstage && backstage.button) {
if (this.noBackstage.indexOf(newMode) == -1) {
backstage.button.style.display = "block";
}
else {
backstage.hide();
backstage.button.style.display = "none";
}
// change singlePageMode
if (this.singlePageMode.indexOf(newMode) == -1) {
config.options.chkSinglePageMode = false;
}
else {
config.options.chkSinglePageMode= true;
}
}
this.currentMode = newMode;
story.lewcidrefreshAllTiddlers ();
// store.refreshPalette();
store.notifyAll();
},
init: function() {
if (!store.isTiddler('defaultColorPalette'))
config.shadowTiddlers['defaultColorPalette'] = config.shadowTiddlers['ColorPalette'];
config.macros.changeMode.applyMode(this.initMode);
}
}
config.paramifiers.mode = {
onconfig: function(mode) {
if (mode == 'false')
config.macros.changeMode.initMode = null;
else
config.macros.changeMode.initMode = mode;
}
};
//}}}
In the Course Menu click the 'Gradebook' link:
[img[graphics/student_access_grades.png]]
This is an example of what you'll see:
[img[graphics/example_user_report.png]]
Ignore the course total for now.
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
* [[Getting started|sundry/comic life documentation_print.pdf]] with Comic Life. Read the [[documentation|sundry/comic life documentation_print.pdf]]
* The [[Plasq company|http://plasq.com/]] that makes Comic Life
* [[Download a trial version|http://plasq.com/downloads/]] for Mac or Windows platform
* [[Comic Life Gallery|http://plasq.com/comiclife/gallery]] -- good ideas for stories
* [[Free cartoon character artwork|http://plasq.com/component/option,com_joomlaboard/Itemid,55/func,view/catid,9/id,9000/#9000]]. Click on 'pdf package for Mac' or 'png package for Windows'. Lots of fun here.
* Having problems with accented characters or anything else? Take a look at the [[PAQ page|http://plasq.com/comiclife/paq/]] and perhaps download the komika font or other fonts linked from this page.
* The printed manual is on reserve in ITAM and you can get to it online from Help.
!!Examples
* [[The road to the Superbowl|sundry/The_Road_to_the_Super_Bowl.pdf]] for Ana Cornide
* [[The bearhunters|sundry/bearhunters.pdf]]
* [[Collaboration with Earlham Learning Spaces poster|sundry/els_presentation.pdf]] for Collaboration Conference at Lake Forest, July 08. This show how Comic Life can be used to create an eye catching poster.
!!Using Comic Life with Moodle.
Having students print their comic book in colour to submit on paper is a hassle, expensive and time consuming. Why not have them submit their work using Moodle? Here's how:
* Have the students create a PDF file of the comic book. Either:
** File -> Export PDF (lower quality 72dpi screen resolution)
** File -> Print : PDF (Mac) or File -> Print : choose Adobe PDF in printer list (PC)
* If your students have been working as a group in this project you'll want to use a +++[Forum for upload]>
<<tiddler [[Forum : upload files]]>>
===
* If they have been working individually you can either use:
** +++[Assignment - upload single file.]
<<tiddler [[Assignment : simple file upload]]>>
=== Here students cannot view each other's work
** Forum -- +++[upload file into a forum discussion.]
<<tiddler [[Forum : upload files]]>>
===
They can even be asked to comment on each other's work.
/*{{{*/
body {
background:[[ColorPalette::Background]];
margin:0 auto;
font-size: 85%;
color: [[ColorPalette::Foreground]];
position: relative;
font-family: Helvetica, Arial, sans-serif;
}
h1,h2,h3,h4,h5 {
font-weight: normal;
padding-left: 0;
color: [[ColorPalette::TertiaryDark]];
background: transparent;
}
h1 {font-size: 1.5em; font-weight: normal;border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2 {font-size: 1.3em; border-bottom:0px;}
h3 {font-size: 1.1em; border-bottom:0px;}
h4 {font-size: 1em;}
h5 {font-size: .9em;}
ul, ul ul, ul ul ul {
list-style-image: url(http://tiddlyhome.bidix.info/_th/images/square.gif) ;
}
a {
color: [[ColorPalette::PrimaryMid]];
}
a:hover {
color: [[ColorPalette::PrimaryMid]];
background:transparent;
border-bottom:1px solid [[ColorPalette::PrimaryMid]];
}
.button {
color: [[ColorPalette::PrimaryMid]];
font-weight:bold;
}
#header {
background: [[ColorPalette::Background]];
padding: 0 0 0 0.4em;
height:1%;
}
.siteTitle {
padding: 1.5em 0 0 0;
font-weight: normal;
font-size: 3em;
color: [[ColorPalette::TertiaryDark]] ;
}
.siteSubtitle {
width: 48em;
padding: 0.3em 0em 0.2em 1em;
font-weight: bold;
font-size: 1em;
background: [[ColorPalette::PrimaryMid]];
color: [[ColorPalette::Background]];
}
#displayArea {
margin-left:0.5em;
margin-right:17.3em;
margin-top:3em;
padding-top:0em;
padding-bottom:10px;
padding-left: 1em;
}
/*}}}*/
/***
!!Sidebar
***/
/*{{{*/
#sidebar {
position:absolute;
width: 14em;
border-left:1px solid [[ColorPalette::TertiaryLight]];
padding-left:15px;
margin-top:0.5em;
font-size:1em;
line-height:1.5em;
font-family: Arial,em sans-serif;
background-color: [[ColorPalette::Background]];
}
#sidebar a {
display: inline;
font-weight: normal;
}
#sidebar h1,#sidebar h2,#sidebar h3,#sidebar h4,#sidebar h5 {
font-weight: normal;
margin-bottom:0em;
}
#sidebar h1 {
margin-left:-0.5em;
margin-bottom:0em;
}
#sidebar hr {
border:0;
border-bottom:1px solid [[ColorPalette::TertiaryLight]];
margin: 1em 0;
margin-left:-0.5em;
}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
/*}}}*/
/***
!!viewer
***/
/*{{{*/
.title {
font-size: 1.5em;
font-weight: normal;
color: [[ColorPalette::TertiaryDark]];
background:transparent;
margin: 0;
margin-bottom: .5em;
padding:0;
}
.viewer {
line-height:1.5em;
}
.tiddler {
padding:0;
margin:0;
padding-bottom:0.5em;
}
.externalLink {font-weight:bold;}
.externalLink:hover {border:none;}
.toolbar { visibility:hidden; }
.selected .toolbar { visibility:visible; }
.tagged, .tagging { float:left; }
.tagged li, .tagging li { display:inline; }
.tagged, .tagging { background:transparent !important; border:0 !important; }
.tagged .button {color: [[ColorPalette::TiertiaryPale]] !important; }
/*}}}*/
/***
!!Editor
***/
/*{{{*/
.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
/*}}}*/
/***
!!TopMenu
***/
/*{{{*/
#topMenu {
positon:relative; float:right; display:inline;
margin-left:3em;
margin-top:1em;
padding: 0.8em 0em;
}
#topMenu br {display:none; }
#topMenu a, #topMenu .tiddlyLink, #topMenu .button {
margin:0 1em;
color: [[ColorPalette::Foreground]];
margin-right:0;
margin-left:2em;
font-size: 18px;
font-family: Helvetica, sans-serif;
font-weight: normal;
font-style: normal;
}
#topMenu a:hover, #topMenu .activebutton {
border-bottom:5px
solid [[ColorPalette::PrimaryMid]];
}
.calendar, .calendar table, .calendar th, .calendar tr, .calendar td { font-size:12pt; text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }
/*}}}*/
/*{{{*/
@media print {
#topMenu {display: none ! important;}
}
/*}}}*/
<html>
<p>Typically we restore a course directly from the Course Backup ZIP file. This has a filename such as <strong>backup-aaas355_200910-20080813-1033.zip</strong> where 'backup' tells us that it's a Moodle course backup, <em>aaas355</em> is the Course id, <em>2009</em> is graduation year and <em>10</em> tells us that the course given in the Fall semester. The date <em>20080813</em> is the date that the course backup was made and <em>1033</em> the time. In the same directory we have the file <strong>backup-aaas355_0710-20070220-0233.zip</strong> which we can see was from the Fall of the previous academic year. Thus the course id, academic year and semester allows us to identify the exact course backup file to restore. And when we have from 100 - 200 course backup files together in a single directory the only way we can find your course backup is by knowing it's Id and semester it was offered.</p>
</html>
!!How Moodle can help manage your course.
* syllabus -- view syllabus as a timeline (weekly format) or as collection of topics (Topic outline)
* making web resources, copyrighted articles, scans from books, periodicals etc available
* putting handouts online for easy access
* getting in touch with all your students
** News Forum
** Profiles / Messaging
* Do online what you might otherwise have had to do in class. Eg choose groups, distribute handouts, discuss contentious topic, continue class discussion, signup sheet,
* Reminding students of classwork and homework.
!!Moodle Course page
Get rid of inessential visual distractions. Present the Course Outline to highlight the important stuff for students to pay attention to:
* delete blocks you're not using.
* shuffle blocks to one side (left or right). Convert 3 col to 2 column layout
* describe what's being covered each week / topic. Tell students what you want them to read and assignments to do. Autolink from description to resource/activity [HOWTO]
!!Integrate Moodle use into course syllabus
Be intentional about what you want your students to do when they're in your Moodle course. Most students won't read any resources unless you tell them to.
* refer to [[Moodle in class]]
* when you add a resource or assignment, be sure to inform your students via the [[News Forum|News Forum for class announcements]]
* try to follow the [[Resources : Best Practices]]
!!Homework assignments / grading
* try to follow [[Assignments : Best Practices]]
The Moodle gradebook operates only with assignments or other Moodle Activities.
* You can create a 'dummy' offline activity hidden from students to record in class participation
* You can do all or some of your grading within Moodle ''without'' revealing them to your students. Merely switch off display grades [[Moodle FAQ]]
The course ''outline'' whether weekly or topics provides the major entry point for students into your course. Rather than merely a list of resources or activities, the course outline encourages faculty to instantiate the whole course (and not just the syllabus) into weekly or topical chunks which make for easier digestion by students.
'Resources' can be text or html formatted pages stored within the course, links to web sites or any uploaded files, or a link to expose a directory within your Files section. Activities correspond to modules installed in the Moodle system and can range from:
| Assignments |Inline, Offline, Online, Upload and Review |
| Chat |synchronous online chat room to talk with students |
| Choice |Quick poll (to choose groups or whatever) |
| Forum |online Discussion forum |
| Glossary |create searchable list of definitions |
| Lesson |Display content with brief questions to test comprehension |
| Quiz |Mulitple choice, short answer, many other formats. Use for testing or revision |
| Wiki |Electronic whiteboard. The best way to accomplish a group web site. |
| Workshop |Peer assessment activity. Students assess and grade each other's work |
Students found the Course Outline helpful:
[img[http://www.earlham.edu/~markp/cms/evaluations/moodle_fall_04/Q8.png]]
from [[2005 survey of student opinions of Moodle|http://www.earlham.edu/~markp/cms/evaluations/moodle_fall_04/results.php]]
The main Moodle course page contains Blocks which are generally used for various aspects of managing the course (located on either side of the Outline) and the Course Outline placed in the centre of the window. This latter is divided into a series of boxes into which the faculty puts the syllabus details and the links to Resources and Activities.
The Course Outline comes in two major forms:
# Weekly
# Topics
Choosing which Outline to use:
!!!1. Weekly outline
The Outline is divided into weekly boxes with the dates for each week displayed at the top. These cannot be removed. Immediately under this is the area for adding text. Many faculty choose to map their syllabus into weekly chunks. [[Course Outline weekly|graphics/course_outline_weekly.png]]<<imagebox "note labels on weekly chunks with the span of dates">> -- in editing mode.
!!!2. Topics outline
Here the boxes have no title and so one can use them as topic based containers; eg Powerpoint lectures, Readings, etc. The topic format can also be used to combine time based and topic based containers, eg [[Outlines : innovative]]
!!How to choose the Outline
On the main course page click Administration : Settings:
* Format : Weekly format. Choose number of weeks (don't forget to account for Fall/Spring break). The Course start date should be the first Sunday before the start of the semester. This is so that the weeks will go from Sunday to Sunday. [[Illustration|graphics/course_outline_settings_weekly.png]]<<imagebox>>
* Format : Topics format. Here, all you need to set is the number of boxes that you want for your topics. The 'Course start date' can be ignored since it has no meaning in this context.
* Don't forget to Save changes.
!!Changing the number of topics/weeks
You may wish to add or remove a topic or week chunk. There are no controls for doing this in the Editing mode on the Outline page. Instead you must open Administration : Settings and change the number of weeks/topics and then Save. If you reduce the number of weeks/topics the bottom-most chunk will be the one removed. Make sure that this has no content, otherwise you will lose it!
Compare:
!!!!before formatting
[img[graphics/before_refresher_small.png][graphics/before_refresher.png]]<<imagebox "Course Outline before formatting">>
!!!!after formatting
[img[graphics/after_refresher_small.png][graphics/after_refresher.png]]<<imagebox "Course Outline after formatting">>
''FORMAT'' for readability:
* use headings -- the example uses heading 2 (h2)
* don't be afraid to leave blank lines create white space
* make liberal use of bullet / number lists
* link titles in the text with the titles you've given to the resource (see above example). This is done automatically if you use the exact resource name in the text (copy & paste)
<<faqlist byTag outline title hr>>
!!Create a new course
* use of course create form -- improvements.
* role required to create course
* course naming convention
* settings:
** course outline -- topics/weekly
** start date -- Sunday //before// the start of semester
** number of sections (include Fall/Spring breaks)
** group enabling
* add name(s) of teacher (Assign roles)
!!Issues
* what to do if teacher account is not on list (eg new faculty)
* how to change number of topic/week sections in course outline
!!!Examples of innovative Outlines:
[img[graphics/combine_date_topics_outlinesm.jpg][graphics/combine_date_topics_outline.png]]<<imagebox "Combination of dates and topics">>
!!!!Neat way of presenting a film schedule:
[img[graphics/combine_date_topics_outline2sm.jpg][graphics/combine_date_topics_outline2.png]]<<imagebox "Film schedule and assignments combined">>
#After logging in, go to Front page : Site files : [[backupdata|https://moodle.earlham.edu/files/index.php?id=1&wdir=%2F%2Fbackupdata&choose=]]
# You'll see a bunch of backups already there. Upload the course you want to restore
# Now click Restore and ''restore to a new course'' (this always works better than restoring to a course you already created)
# Change the shortname to <course id>:200920
# Make sure you get the start date correct (Jan 11, 2009)
# Make sure to add the teacher role
# Finally, if you did create the course already the restored one will have a '_1" on it. Just delete the empty course you created and rename the restored course accordingly.
!!What do Moodle courses look like?
Here are some examples:
* [[simple topics outline|graphics/example_course_screens/simple_topics.png]]<<imagebox>>
* [[simple topics formatted nicely|graphics/example_course_screens/simple_topics2.png]]<<imagebox>>
* [[weekly outline|graphics/example_course_screens/weekly_outline.png]]<<imagebox>>
* [[complex schedule with reading and listening|graphics/example_course_screens/complex_schedule_read_listen.png]]<<imagebox>>
** [[flash audio player|graphics/example_course_screens/flash_audio_player.png]]<<imagebox>>
* [[using graphics in Outline|graphics/example_course_screens/graphics_outline.png]]<<imagebox>>
* [[japanese language with playlist|graphics/example_course_screens/audio_player_japanese.png]]<<imagebox>>
* [[combining dates and topics|graphics/example_course_screens/combine_date_topics_outline.png]]<<imagebox>>
* [[combining dates and topics -- another example|graphics/example_course_screens/combine_date_topics_outline2.png]]<<imagebox>>
<html>
<form id="form" name="form" method=post action="http://www.earlham.edu/jb-cgi/jitterbug-report-form.pl" >
<input type="hidden" name="notify_email" value="markp@earlham.edu">
<input type="hidden" name="subject" value="Moodle Course Request">
<h1>Moodle Course Request form</h1>
<p>Many times we are asked to create courses for faculty but are given inadequate information. For example, the course id might be missing or maybe the course description. So we're asking teaching faculty to fill in this form to provide us with the details we need to create your new course and restore courses from previous years.</p>
<h2>Procedure </h2>
<ol>
<li>If you are faculty new to Earlham and have not yet used Moodle, please login to the <a href="https://moodle.earlham.edu" target="_blank">Earlham Moodle system</a> -- we cannot add you as a teacher to the course until you have 'registered' with Moodle. Having logged in you can log out immediatley.</li>
<li>Complete the 'Your Information' section.</li>
<li>Course Information. <br>
Fill in the Course Id and Title for each course you would like to have created.
If the course has multiple sections you should enter the section number. <br>
Note that all IP courses are numbered <strong>IP150</strong> so the section number is the only way to distinguish these courses. Just look up the section number on Webdb -- try <a href="http://webdb.earlham.edu/service.php?a=CRSEINFO&w=CRSESRCH&wa=search&viewStart=0&year=2009&semester=20&department=&gened=IP&submit=Search" target="_blank">this link</a>.
<br>
For <strong>cross listed courses</strong> pick the Course id that suits you best.
<blockquote><p>Moodle courses have two descriptor names, the <em>Short name</em> which appears in the navigation bar and is used to label course backups, and the <em>Full name</em> which is the title of the course. We generate a unique Short name from the Course Id (which is used by Banner), the section number, graduation year and semester id (10 - Fall, 20- Spring). Thus Principles of Chemistry taught at 11am in the Fall semester of 2008 has the Course Id CHEM111 and section 2, and the short name would be CHEM111-2:200910. Course Ids from any year can be exhumed from <a href="http://webdb.earlham.edu" target="_blank">WebDb</a> using the Advanced Search option.</p></blockquote></li>
<li>Choose Weekly or Topics format of your Course Outline for each course.<br>
Topics will give you five numbered sections in the Outline. To add or subtract sections change the number of topics using Administration:Settings.<br>
Weekly will give you 16 sections with date labels (15 weeks plus spring break). The dates run from the first Sunday before the semester starts (Jan 11th 2009) in weekly increments.</li>
<li>The Enrollment key is the simple course password which you give out to your students on the first day of class so that they can enroll in your course. It prevents students not in your course from accidently enrolling.</li>
</ol>
<h2>Your Information</h2>
<p>Name: <input name='personal_name' type='text' size="40"/>
</p>
<p>Earlham email address: <input type='text' name='email'>@earlham.edu</p>
<p>Phone # (just in case): <input type='text' name='phone'></p>
<h2>Course Information</h2>
<table cellspacing="0" cellpadding="4" rules="all">
<tr align="center">
<th>#</th>
<th>Course Id</th>
<th>Sect- ion</th>
<th>Course Title</th>
<th>Course Outline</th>
<th>Enrollment key</th>
</tr>
<tr>
<td> </td>
<td>eg CHEM111</td>
<td>eg 2<sup><strong>*</strong></sup></td>
<td>What you want to call the course</td>
<td align="center">choose Outline format</td>
<td align="center">course password</td>
</tr>
<tr>
<th>1</th>
<td align="center"><input name='CourseId-1' type='text' size="10"></td>
<td align="center"><input name="Section-1" type="text" size="4"></td>
<td><input name='CourseDescription-1' type='text' size="34"></td>
<td align="center"><select name='Outline-1'>
<option value="Topics">Topics</option>
<option value="Weekly">Weekly</option>
</select></td>
<td align="center"><input name="enrolment-1" type="text" size="20"> </td>
</tr>
<tr>
<th>2</th>
<td align="center"><input name='CourseId-2' type='text' size="10"></td>
<td align="center"><input name="Section-2" type="text" size="4"></td>
<td><input name='CourseDescription-2' type='text' size="34"></td>
<td align="center"><select name='Outline-2'>
<option value="Topics">Topics</option>
<option value="Weekly">Weekly</option>
</select></td>
<td align="center"><input name="enrolment-2" type="text" size="20"></td>
</tr>
<tr>
<th>3</th>
<td align="center"><input name='CourseId-3' type='text' size="10"></td>
<td align="center"><input name="Section-3" type="text" size="4"></td>
<td><input name='CourseDescription-3' type='text' size="34"></td>
<td align="center"><select name='Outline-3'>
<option value="Topics">Topics</option>
<option value="Weekly">Weekly</option>
</select></td>
<td align="center"><input name="enrolment-3" type="text" size="20"></td>
</tr>
</table>
<h2>Restore Course</h2>
<h3>Procedure</h3>
<p>Follow this procedure to have a course restored from a previous year's Moodle. </p>
<ol>
<li>Make sure that you have requested a new course using the form above to restore the old course into.</li>
<li>Here again we need to know details about the old course; the Course Id and the academic/graduation year and semester that it was taught. The best way to discover this information is to access the Moodle system of the academic year you want to restore from.
<blockquote>
<table border="0" rules="all">
<tr>
<th>Graduation year</th>
<th>Moodle URL</th>
</tr>
<tr>
<td>2009</td>
<td><a href="https://moodle.earlham.edu" target="_blank">https://moodle.earlham.edu</a></td>
</tr>
<tr>
<td>2008</td>
<td><a href="https://moodle-old.earlham.edu" target="_blank">https://moodle-old.earlham.edu/</a><br /> (not available from off campus)</td>
</tr>
<tr>
<td>2007</td>
<td><a href="https://moodle-old.earlham.edu/0607" target="_blank">https://moodle-old.earlham.edu/0607</a><br />(not available from off campus)</td>
</tr>
<tr valign="top">
<td>2006-05</td>
<td>Course backups are available to be restored but the courses themselves are not searchable online. You can discover the course ids to restore by using <a href="http://webdb.earlham.edu/">WebDb</a></td>
</tr>
</table>
</blockquote></li>
<li>Finally, indicate which new course you'd like the Course backup to be restored to.</li>
</ol>
<table border="0" align="center" rules="all">
<tr>
<th>Academic Year</th>
<th>Semester</th>
<th>Course Id</th>
<th>Course Title</th>
<th>Restore to new course #</th>
</tr>
<tr align="center">
<td>
<select name="year_restore-1">
<option value="0809" selected>08 - 09</option>
<option value="0708">07 - 08</option>
<option value="0607">06 - 07</option>
<option value="0506">05 - 06 </option></select></td>
<td><select name="semester_restore-1"><option value="Fall">Fall</option>
<option value="Spring">Spring</option></select></td>
<td><input name="courseId_restore-1" size="12" type="text" ></td>
<td><input name="title_restore-1" size="40" type="text"></td>
<td><select name="restoreTo-1"><option value="1">course 1</option>
<option value="2">course 2</option>
<option value="3">course 3</option></select></td>
</tr>
<tr align="center">
<td><select name="year_restore-2">
<option value="0809" selected>08 - 09</option>
<option value="0708">07 - 08</option>
<option value="0607">06 - 07</option>
<option value="0506">05 - 06 </option></select></td>
<td><select name="semester_restore-2"><option value="Fall">Fall</option>
<option value="Spring">Spring</option></select></td>
<td><input name="courseId_restore-2" size="12" type="text" ></td>
<td><input name="title_restore-2" size="40" type="text"></td>
<td><select name="restoreTo-2"><option value="1">course 1</option>
<option value="2" selected>course 2</option>
<option value="3">course 3</option></select></td> </tr>
<tr align="center">
<td><select name="year_restore-3">
<option value="0809" selected>08 - 09</option>
<option value="0708">07 - 08</option>
<option value="0607">06 - 07</option>
<option value="0506">05 - 06 </option></select></td>
<td><select name="semester_restore-3"><option value="Fall">Fall</option>
<option value="Spring">Spring</option></select></td>
<td><input name="courseId_restore-3" size="12" type="text" ></td>
<td><input name="title_restore-3" size="40" type="text"></td>
<td><select name="restoreTo-3"><option value="1">course 1</option>
<option value="2">course 2</option>
<option value="3" selected>course 3</option></select></td> </tr>
</table>
<h2>Submit your Request</h2>
<dl>
<dt>Send this request to your support person:</dt>
<!-- <dd> <input type="radio" name="jitterbug_email" value="Amy Bryant <bryanam@earlham.edu>">Amy Bryant</dd> -->
<dd> <input type="radio" name="jitterbug_email" value="Neal Baker <bakerne@earlham.edu>">Neal Baker</dd>
<!-- <dd> <input type="radio" name="jitterbug_email" value="Mark Pearson <markp@earlham.edu>">Mark Pearson</dd> -->
<dd> <input type="radio" name="jitterbug_email" value="Wes Miller <wesm@earlham.edu>">Wes Miller</dd>
</dl>
<p><input type="submit"value="Submit Request" name="submit"> <input type="reset" value="Clear Form" name="reset">
</p>
</form>
</html>
+++!!![Why we need Course Ids]>
<<tiddler [[Course Id requirement]]>>
===
+++!!![Problems accessing 07-08 Moodle]>
<<tiddler [[Enrolment issues]]>>
===
How do you accumulate grades through successive categories?
The Listening Logs for Jazz History are graded in 5 chunks. Here's how I set out the original layout:
[img[graphics/original_grade_category_arrangement.png]]
But Dan needed the grades to ''accumulate'' from one grading point to the next. Here's how I nested the categories and //reordered the assignments// (listening log assignments are now in //descending// order to make the grading display more tractable) to achieve this:
[img[graphics/new_grade_category_arrangement.png]]
* The gradebook view for the teacher; [[here's what you see|graphics/new_grade_arrangement.png]]<<imagebox>>. Notice the different directions for successive grades and totals.
* Change some gradebook settings:
<<<
;Edit -> Course Settings
: General : @@Aggregation position : First@@
: Grade Item : @@Overall decimal points : 0@@
<<<
** Now the student user [[sees this|graphics/new_grade_arrangement_user_view_mod.png]]<<imagebox>>
;For
:new and returning faculty who want to get started quickly.
Go through [[Introduction to Moodle]] at breakneck speed.
Text from Mike Thiedeman
# open E.C. libraries page
** under “Research” click on “All Databases”
** on the page that opens, under ABCD tab, click on ~ARTstor
# enter your E.C. user name and password; click Login button
# ~ARTstor home page will come up
** Top, right side of the page: click “Go” in “Enter ~ARTstor…” box
** on the login page, follow the instructions to register (if you have not registered before)
** click “Login”
# On “Search / Browse” page that opens, in toolbar click on tab for “Tools”
** in pull down menu that appears, click on //Download offiline presentation tool (OIV)//
** click accept conditions
** Select OIV 3.1 for Mac or OIV 3.1 for PC and click //Download//
# the installer for OIV will be downloaded to your computer
# an installer window will open on your screen when the download is finished. If it doesn't appear then just double-click on the //dmg// file
# Click on the OIV icon in the installer window and drag it to your applications folder
# Eject the installer (Ctrl-click & eject on the Installer virtual disk)
There are some situations where you want to collect a subset of the files used in a Moodle course rather than a total course backup. Here how to do this simple task:
# Open the Files area of the Moodle course (link located in Administration block)
# Check the boxes next to the files you want to download. You are going to ZIP up all of these and download in one swell foop!
# Scroll to the bottom of the page and pull down //With chosen files -> Create ZIP archive//.
** type in a meaningful filename into the box and add //.zip//
** click [Create zip archive]
# Now, back in the Files area locate the file and ''click on the filename itself'' and save it to your local drive in an appropriate location (eg Desktop or My Documents)
# On your local machine drag this file into a suitable folder and double-click to expand into the component files. That's IT!
# You may wish to return to Files, check the box next to the zip file and //With chosen files -> Delete completely//
Bring your Moodle aches, pains, chronic and acute problems to the Surgery.
No appointment required. First come first served.
! Before you Start
* Decide what your slide show is about. How long do you want it to take. Have the material (content) already typed in and ready to go.
! Powerpoint setup
# Adjust your working space to create more room by removing fluff. 3 panes:
** Sidebar : tabs Outline | Slides
** Slide display
** Notes
# Know which toolbars you have active.
** Standard
** Formatting
** Draw
** PDF
!What we'll cover
# Setting up the Powerpoint application
# Using a Design Template and Slide Master
# Content — Slides
# Dealing with Graphics
<<tiddler [[Effective PPT : Setup]]>>
!!Design Template
!!!Choosing Template
* Decide what template you want to use ''BASED on the CONTENT of the PRESENTATION'', eg 'red curtain call' for a Theatre presentation.
In general ''KEEP IT'' <<tiddlerbox "SIMPLE" "Exhortation to Simplicity" "" 320 100>>
!!General Principles:
<<tiddlerbox "consistency" "Exhortation to Consistency" " " 270 100>> in:
* appearance -- each slide should have the same set of fonts
* style -- each slide should have the same overall design
* behaviour -- each slide should have the same animations and transitions
Implement this with <<tiddlerbox "SLIDE MASTER" "Slide Master" "" 500 150>>
!!Slide Master
# Select View -> Master -> Slide Master. Template for whole slide show
# Click +++[Design]
<<tiddler [[PPT : Slide Design]]>>
=== and a useful popup menu appears.
!!!Note:
Two (2) slides will appear (after you have opened the slide master)
# Style used by all slide, except
# Style used by Title slide (ie first in the slide show)
!Overview of Design Principles
* +++[Visual_Clarity]>
* Titles : 36 point font
* # fonts – max 2
* Body text : 24 point
* Use Sans Serif fonts
===
* +++[Legibility]>
* # bullets per slide - max 6
* # lines in title – max 2
* # lines per bullet – max 2
===
* +++[Text_style]>
* Newspaper headlines
* Little text per bullet
* Readable fonts
* Complementary and contrasting colours
* Use SLIDE MASTER for uniformity
===
----
!The Process
# Choose a basic Master Slide design
# +++[Save]
** create folder & save inside folder
** difference between Save and Save As
===
# Modify Master Slide
## Change font face
## Apply animation to slide slide components
## Apply transition between slides
!1. Slide Master : Font Change
# Select title text. Change font to Century Gothic : bold
# Select all body bullet text. Change font to Rockwell
# Save
!!!Note:
* fonts are also changed on the Title slide
* Use ''Sans Serif'' rather than ''Serif'' font faces. (Why? Give egs of both)
!2. Slide Master : Text Animation
# Select all the bulleted text
# Add Effect of your choice from the [[menu|graphics/custom_animation.png]]<<imagebox>>. I chose Entrance -> Fly In
# Change options (direction and speed) and observe preview
# Select Title and apply animation to it. I chose Fly in from Top.
!!!Note:
* This animation will now apply to all bullet lists for all slides
* Click [Remove] to get rid of mistake
!3. Slide Master : Slide Transition
* Choose transition from menu
* Apply to all slides
!TEST TEST TEST TEST
* Demo the animations.
* Problem: title descends ''after'' content. Looks NAFF.
* Fix : go to Custom animation & reorder
* Play through again to check
! NOW ADD SLIDES -- WOOPEE !
# Close Master Slide if still open
# The first slide in the sidebar should be the Title slide, so enter the Title and Subtitle for your slideshow.
# Insert a new slide from the slide layout menu:
[img[graphics/insert_text_slide.png]]
** Type in Title text
** Type (or copy) text for first bullet -- ''KEEP it BRIEF''
!!!Note:
* To ''indent'' one bullet level press TAB key
* To ''outdent'' or return press ~SHIFT-TAB
!GUIDELINES FOR TEXT CONTENT
* think of each bullet point as a NEWSPAPER HEADLINE
* don't read the screen -- the text is a memo
* the show should be unintelligible unless you went to the talk
* don't crowd the screen -- 6 lines max
!!!Notes:
* can use the Outline to quickly add slides
* copy and paste your full text into the notes field. Print this out to read from.
----
!Dealing with Graphics
+++[File_types]
|Jaypeg|JPG|Photographs - 'lossy' format, compressed with lots of colours|
|Ping|PNG|bold colours and clear boundaries -- charts, screenshots, etc|
|giff|GIF|obsolete but still kicking around. 256 colours maximum|
===
+++[Resolution]>
|96 dpi|screen -- CRT or LCD. Sizes of screen and therefore size of pixels vary but density set to 96|
|150 dpi|medium quality text print. Good for scanning pages into Acrobat PDF|
|300 dpi|high quality for colour print on glossy paper|
===
+++[Sizes]>
|300 px|A good size for a web graphic image|
|1024px x 768px|Maximum size a normal projector can handle. No point in using a graphic larger than this in PPT|
|6" x 4"|standard size of colour photo print|
===
Last year (graduation year 2008, academic year 07-08) I received a number of complaints from both students and faculty about course clutter in My Moodle. Recall that when you log in to Earlham's Moodle system you only see the courses you are enrolled in -- this is your "My Moodle" display. When the Spring semester arrives all the courses from the Fall are still there and clutter up the display. In an attempt to alleviate this I set a system wide parameter to automatically unenroll course participants after a certain number of days of inactivity. Thus students would be automatically unenrolled from their Fall courses. However, the unanticipated side effect of this was that Teachers too were unenrolled also from both Fall and Spring courses when summer arrived.
Thus, ''when visiting [[Moodle 0708|https://old-moodle.earlham.edu]] if you click on the course it will ask you to enroll (as a //student//)''.
We do have all the course backups separate however, so there should be no need to enter the course on the old system.
!SIMPLE but SOPHISTICATED
think Google
// //''Name:'' FAQ List
// //''Version:'' 1.4 for TW 2.0.0
// //''Author:'' AlanHecht
// //''Type:'' [[Macro|Macros]]
// //''Description:'' FAQ List lets you compile a list of Frequently Asked Questions and present them in a cascading style for the viewer. Each question is turned into a link that will toggle the view of the answer text. The list can be compiled either from all tiddlers containing a certain tag or from a single tiddler that contains all the needed questions and answers.
// //''Syntax:'' << {{{ faqlist mode source sortBy hrSeparator }}} >>
// // ''faqlist:'' the macro call (required)
// // ''mode:'' either "byTag" or "byTitle" (required)
// // ''source:'' the associated tag or tiddler title (required)
// // ''sortBy:'' if byTag, sort can be "title," "modifier," "modified." If byTitle, sort can be "question" and will reorder the questions in alphabetical order. (this parameter is optional; use "null" if you don't want a sort order, but want to use "hr" as the last paramter)
// // ''hrSeparator:'' if "hr" is included at the end of the call string, each question/answer set will be separated by a horizontal rule.
// //Examples: (edit these two tiddlers to see the syntax used for each)
// // • [[FAQ Method One]] (compiled from tiddlers tagged with a certain tag)
// // • [[FAQ Method Two]] (compiled using the content of a single tiddler)
// // • @@color(#ff0000):''New!''@@ [[FAQ Method Three]] (uses the {{{<<tiddler>>}}} macro to pull the faq questions from a single tiddler and the answers from other tiddlers...very cool!)
// //''Directions:'' <<tiddler StartupBehaviorDirections>> <<tiddler MacroDirections>>
// //''Notes:'' If you choose to use byTitle mode where the entire set of questions/answers comes from a single tiddler, the syntax for the tiddler content is as follows:
// // • Each question must be a single line (i.e. no hard returns) but can wrap as needed
// // • The answer to a question begins on the next line after the question and can be as long as needed. It can also include hard returns as part of the answer text, but it cannot include empty lines (i.e. an empty line is the result of pressing enter twice).
// // • Each question/answer set must be seperated by two hard returns (i.e. must have a single, blank line between them.
// // Refer to [[FAQ Tiddler Sample]] for an example.
// //''Known Issues:'' If a user clicks too quickly to toggle a FAQ entry on/off, they will go into tiddler edit mode. This should be corrected in the future by allowing web-hosted versions of the faq to disable double-clicking.
// //''Revision History:''
// // v0.1.0 (01 August 2005): initial release
// // v0.1.1 (04 August 2005): Fixed an endless loop bug (thanks to Kevin Kleinfelter).
// // v0.1.2 (19 October 2005): Fixed TW compatibility .32 bugs (newline for block quote and e.preventDefault by Clint Checketts)
// // v0.1.3 (01 November 2005): Thanks to Clint's work, I fixed a similar "jump to top" problem when using the expand & collapse buttons. Also added the description for [[FAQ Method Three]]
// // v0.1.4 (05 January 2006): Created a special version of FaqList to work with TW v2.0.0
// //''Code section:''
version.extensions.faqlist = {major: 0, minor: 1, revision: 4, date: new Date("Jan 05, 2006")};
config.macros.faqlist = {
bulletCollapse: ">",
bulletExpand: "∨",
expandButton: {title: "Expand All", tooltip: "Open all items for reading"},
collapseButton: {title: "Collapse All", tooltip: "Close all items"}
};
config.macros.faqlist.handler = function(place,macroName,params)
{
lingo = config.macros.faqlist;
var mode = params[0].toLowerCase();
var list = [];
switch(mode)
{
case "bytag":
var tagged = store.getTaggedTiddlers(params[1], params[2]);
for(t=0; t<tagged.length; t++)
{
var title = tagged[t].title;
list[t] = [title,store.getTiddlerText(title)];
}
var subTitle = store.fetchTiddler(title).getSubtitle();
break;
case "bytitle":
var faqText = store.getTiddlerText(params[1]);
var faqItems = faqText.split("\n\n");
if(params[2] == "question")
faqItems.sort();
for(t=0; t<faqItems.length; t++)
{
list[t] = [faqItems[t].substring(0,faqItems[t].indexOf("\n")),faqItems[t].substring(faqItems[t].indexOf("\n")+1)];
}
var subTitle = null;
break;
}
var faqHeading = place.appendChild(document.createElement("span"));
faqHeading.appendChild(createTiddlyButton(faqHeading,lingo.expandButton.title,lingo.expandButton.tooltip,faqExpandAll));
faqHeading.appendChild(createTiddlyButton(faqHeading,lingo.collapseButton.title,lingo.collapseButton.tooltip,faqCollapseAll));
faqHeading.appendChild(document.createElement("p"));
var faqBody = place.appendChild(document.createElement("span"));
for(var t=0; t<list.length; t++)
{
var title = list[t][0];
var content = "<<<\n" + list[t][1] + "=\n<<<\n";
var theClass = "tiddlyLinkExisting tiddlyLink";
var itemHeading = faqBody.appendChild(document.createElement("span"));
itemHeading.appendChild(document.createTextNode(config.macros.faqlist.bulletCollapse + " "));
createTiddlyButton(itemHeading,title,subTitle,faqToggleThis,theClass);
var itemBody = faqBody.appendChild(document.createElement("span"));
itemBody.style.display = "none";
itemBody.className = "itemBody";
wikify(content,itemBody,null,null);
faqBody.appendChild(itemBody);
faqBody.appendChild(document.createElement("p"));
if(params[3] == "hr")
faqBody.appendChild(document.createElement("hr"));
}
}
function faqToggleThis(e)
{
var content = this.parentNode.nextSibling;
var shown = content.style.display;
if(shown == "none")
{
content.style.display = "inline";
this.previousSibling.nodeValue = config.macros.faqlist.bulletExpand + " ";
}
else
{
content.style.display = "none";
this.previousSibling.nodeValue = config.macros.faqlist.bulletCollapse + " ";
}
}
function faqExpandAll(e)
{
for(t=0; t<this.parentNode.nextSibling.childNodes.length; t++)
{
if(this.parentNode.nextSibling.childNodes[t].className == "itemBody")
{
this.parentNode.nextSibling.childNodes[t].style.display = "inline";
this.parentNode.nextSibling.childNodes[t].previousSibling.childNodes[0].nodeValue = config.macros.faqlist.bulletExpand + " ";
}
}
// e.preventDefault();
}
function faqCollapseAll(e)
{
for(t=0; t<this.parentNode.nextSibling.childNodes.length; t++)
{
if(this.parentNode.nextSibling.childNodes[t].className == "itemBody")
{
this.parentNode.nextSibling.childNodes[t].style.display = "none";
this.parentNode.nextSibling.childNodes[t].previousSibling.childNodes[0].nodeValue = config.macros.faqlist.bulletCollapse + " ";
}
}
// e.preventDefault();
}
[[Moodle docs|http://docs.moodle.org/en/Adding/editing_a_feedback_form]]
!!Add Feedback form
!!Add questions
!!View responses
!!Students
/***
|Location|http://visualtw.ouvaton.org/VisualTW.html|
|Version|1.0.0|
|Requires|~TW2.2.x|
|Browsers|Firefox 2.0.x, IE 6.0+, others|
!Description:
//create//, //edit//, //view// and //delete// commands in toolbar <<toolbar fields>>
!Demo:
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], see [[FieldEditor example]]
!Installation:
*import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
*save and reload
*optionnaly : add the following css text in your StyleSheet : {{{#popup tr.fieldTableRow td {padding:1px 3px 1px 3px;}}}}
!Code
***/
//{{{
config.commands.fields.handlePopup = function(popup,title) {
var tiddler = store.fetchTiddler(title);
if(!tiddler)
return;
var fields = {};
store.forEachField(tiddler,function(tiddler,fieldName,value) {fields[fieldName] = value;},true);
var items = [];
for(var t in fields) {
var editCommand = "<<untiddledCall editFieldDialog "+escape(title)+" "+escape(t)+">>";
var deleteCommand = "<<untiddledCall deleteField "+escape(title)+" "+escape(t)+">>";
var renameCommand = "<<untiddledCall renameField "+escape(title)+" "+escape(t)+">>";
items.push({field: t,value: fields[t], actions: editCommand+renameCommand+deleteCommand});
}
items.sort(function(a,b) {return a.field < b.field ? -1 : (a.field == b.field ? 0 : +1);});
var createNewCommand = "<<untiddledCall createField "+escape(title)+">>";
items.push({field : "", value : "", actions:createNewCommand });
if(items.length > 0)
ListView.create(popup,items,this.listViewTemplate);
else
createTiddlyElement(popup,"div",null,null,this.emptyText);
}
config.commands.fields.listViewTemplate = {
columns: [
{name: 'Field', field: 'field', title: "Field", type: 'String'},
{name: 'Actions', field: 'actions', title: "Actions", type: 'WikiText'},
{name: 'Value', field: 'value', title: "Value", type: 'WikiText'}
],
rowClasses: [
{className: 'fieldTableRow', field: 'actions'}
],
buttons: [ //can't use button for selected then delete, because click on checkbox will hide the popup
]
}
config.macros.untiddledCall = { // when called from listview, tiddler is unset, so we need to pass tiddler as parameter
handler : function(place,macroName,params,wikifier,paramString) {
var macroName = params.shift();
if (macroName) var macro = config.macros[macroName];
var title = params.shift();
if (title) var tiddler = store.getTiddler(unescape(title));
if (macro) macro.handler(place,macroName,params,wikifier,paramString,tiddler);
}
}
config.macros.deleteField = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly && params[0]) {
fieldName = unescape(params[0]);
var btn = createTiddlyButton(place,"delete", "delete "+fieldName,this.onClickDeleteField);
btn.setAttribute("title",tiddler.title);
btn.setAttribute("fieldName", fieldName);
}
},
onClickDeleteField : function() {
var title=this.getAttribute("title");
var fieldName=this.getAttribute("fieldName");
var tiddler = store.getTiddler(title);
if (tiddler && fieldName && confirm("delete field " + fieldName+" from " + title +" tiddler ?")) {
delete tiddler.fields[fieldName];
story.refreshTiddler(title,"ViewTemplate",true);
}
return false;
}
}
config.macros.createField = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly) {
var btn = createTiddlyButton(place,"create new", "create a new field",this.onClickCreateField);
btn.setAttribute("title",tiddler.title);
}
},
onClickCreateField : function() {
var title=this.getAttribute("title");
var tiddler = store.getTiddler(title);
if (tiddler) {
var fieldName = prompt("Field name","");
if (store.getValue(tiddler,fieldName)) {
window.alert("This field already exists.");
}
else if (fieldName) {
var v = prompt("Field value","");
tiddler.fields[fieldName]=v;
story.refreshTiddler(title,"ViewTemplate",true);
}
}
return false;
}
}
config.macros.editFieldDialog = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly && params[0]) {
fieldName = unescape(params[0]);
var btn = createTiddlyButton(place,"edit", "edit this field",this.onClickEditFieldDialog);
btn.setAttribute("title",tiddler.title);
btn.setAttribute("fieldName", fieldName);
}
},
onClickEditFieldDialog : function() {
var title=this.getAttribute("title");
var tiddler = store.getTiddler(title);
var fieldName=this.getAttribute("fieldName");
if (tiddler && fieldName) {
var value = tiddler.fields[fieldName];
value = value ? value : "";
var lines = value.match(/\n/mg);
lines = lines ? true : false;
if (!lines || confirm("This field contains more than one line. Only the first line will be kept if you edit it here. Proceed ?")) {
var v = prompt("Field value",value);
tiddler.fields[fieldName]=v;
story.refreshTiddler(title,"ViewTemplate",true);
}
}
return false;
}
}
config.macros.renameField = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly && params[0]) {
fieldName = unescape(params[0]);
var btn = createTiddlyButton(place,"rename", "rename "+fieldName,this.onClickRenameField);
btn.setAttribute("title",tiddler.title);
btn.setAttribute("fieldName", fieldName);
}
},
onClickRenameField : function() {
var title=this.getAttribute("title");
var fieldName=this.getAttribute("fieldName");
var tiddler = store.getTiddler(title);
if (tiddler && fieldName) {
var newName = prompt("Rename " + fieldName + " as ?", fieldName);
if (newName) {
tiddler.fields[newName]=tiddler.fields[fieldName];
delete tiddler.fields[fieldName];
story.refreshTiddler(title,"ViewTemplate",true);
}
}
return false;
}
}
//}}}
Use <<toolbar fields>> in toolbar to see this tiddler fields.
/***
|Name|FontSizePlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#FontSizePlugin|
|Version|1.0|
|Requires|~TW2.x|
!Description:
Resize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.
You can customize the maximum and minimum allowed sizes.
(only affects tiddler content text, not any other text)
Also, you can load a TW file with a font-size specified in the url.
Eg: http://tw.lewcid.org/#font:110
!Demo:
Try using the font-size buttons in the sidebar, or in the MainMenu above.
!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Then put {{{<<fontSize "font-size:">>}}} in your SideBarOptions tiddler, or anywhere else that you might like.
!Usage
{{{<<fontSize>>}}} results in <<fontSize>>
{{{<<fontSize font-size: >>}}} results in <<fontSize font-size:>>
!Customizing:
The buttons and prefix text are wrapped in a span with class fontResizer, for easy css styling.
To change the default font-size, and the maximum and minimum font-size allowed, edit the config.fontSize.settings section of the code below.
!Notes:
This plugin assumes that the initial font-size is 100% and then increases or decreases the size by 10%. This stepsize of 10% can also be customized.
!History:
*27-07-06, version 1.0 : prevented double clicks from triggering editing of containing tiddler.
*25-07-06, version 0.9
!Code
***/
//{{{
config.fontSize={};
//configuration settings
config.fontSize.settings =
{
defaultSize : 100, // all sizes in %
maxSize : 200,
minSize : 40,
stepSize : 10
};
//startup code
var fontSettings = config.fontSize.settings;
if (!config.options.txtFontSize)
{config.options.txtFontSize = fontSettings.defaultSize;
saveOptionCookie("txtFontSize");}
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
setStylesheet("#contentWrapper .fontResizer .button {display:inline;font-size:105%; font-weight:bold; margin:0 1px; padding: 0 3px; text-align:center !important;}\n .fontResizer {margin:0 0.5em;}","fontResizerButtonStyles");
//macro
config.macros.fontSize={};
config.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
var sp = createTiddlyElement(place,"span",null,"fontResizer");
sp.ondblclick=this.onDblClick;
if (params[0])
createTiddlyText(sp,params[0]);
createTiddlyButton(sp,"+","increase font-size",this.incFont);
createTiddlyButton(sp,"=","reset font-size",this.resetFont);
createTiddlyButton(sp,"–","decrease font-size",this.decFont);
}
config.macros.fontSize.onDblClick = function (e)
{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.fontSize.setFont = function ()
{
saveOptionCookie("txtFontSize");
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
}
config.macros.fontSize.incFont=function()
{
if (config.options.txtFontSize < fontSettings.maxSize)
config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.decFont=function()
{
if (config.options.txtFontSize > fontSettings.minSize)
config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.resetFont=function()
{
config.options.txtFontSize=fontSettings.defaultSize;
config.macros.fontSize.setFont();
}
config.paramifiers.font =
{
onstart: function(v)
{
config.options.txtFontSize = v;
config.macros.fontSize.setFont();
}
};
//}}}
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.6 (2006-09-16)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|© 2005-2006 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description
Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.
''Syntax:''
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//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.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].
!Revision history
* v1.0.6 (2006-09-16)
** 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.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features:
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen)
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features:
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs:
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features:
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// ForEachTiddlerPlugin
//============================================================================
//============================================================================
// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {
if (!window.abego) window.abego = {};
version.extensions.ForEachTiddlerPlugin = {
major: 1, minor: 0, revision: 6,
date: new Date(2006,8,16),
source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
copyright: "Copyright (c) abego Software GmbH, 2005-2006 (www.abego-software.de)"
};
// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
TiddlyWiki.prototype.forEachTiddler = function(callback) {
for(var t in this.tiddlers) {
callback.call(this,t,this.tiddlers[t]);
}
};
}
//============================================================================
// forEachTiddler Macro
//============================================================================
version.extensions.forEachTiddler = {
major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};
// ---------------------------------------------------------------------------
// Configurations and constants
// ---------------------------------------------------------------------------
config.macros.forEachTiddler = {
// Standard Properties
label: "forEachTiddler",
prompt: "Perform actions on a (sorted) selection of tiddlers",
// actions
actions: {
addToList: {},
write: {}
}
};
// ---------------------------------------------------------------------------
// The forEachTiddler Macro Handler
// ---------------------------------------------------------------------------
config.macros.forEachTiddler.getContainingTiddler = function(e) {
while(e && !hasClass(e,"tiddler"))
e = e.parentNode;
var title = e ? e.getAttribute("tiddler") : null;
return title ? store.getTiddler(title) : null;
};
config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);
if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// Parse the "in" clause
var tiddlyWikiPath = undefined;
if ((i < params.length) && params[i] == "in") {
i++;
if (i >= params.length) {
this.handleError(place, "TiddlyWiki path expected behind 'in'.");
return;
}
tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the where clause
var whereClause ="true";
if ((i < params.length) && params[i] == "where") {
i++;
whereClause = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the sort stuff
var sortClause = null;
var sortAscending = true;
if ((i < params.length) && params[i] == "sortBy") {
i++;
if (i >= params.length) {
this.handleError(place, "sortClause missing behind 'sortBy'.");
return;
}
sortClause = this.paramEncode(params[i]);
i++;
if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
sortAscending = params[i] == "ascending";
i++;
}
}
// Parse the script
var scriptText = null;
if ((i < params.length) && params[i] == "script") {
i++;
scriptText = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the action.
// When we are already at the end use the default action
var actionName = "addToList";
if (i < params.length) {
if (!config.macros.forEachTiddler.actions[params[i]]) {
this.handleError(place, "Unknown action '"+params[i]+"'.");
return;
} else {
actionName = params[i];
i++;
}
}
// Get the action parameter
// (the parsing is done inside the individual action implementation.)
var actionParameter = params.slice(i);
// --- Processing ------------------------------------------
try {
this.performMacro({
place: place,
inTiddler: tiddler,
whereClause: whereClause,
sortClause: sortClause,
sortAscending: sortAscending,
actionName: actionName,
actionParameter: actionParameter,
scriptText: scriptText,
tiddlyWikiPath: tiddlyWikiPath});
} catch (e) {
this.handleError(place, e);
}
};
// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {
var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);
var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
context["tiddlyWiki"] = tiddlyWiki;
// Get the tiddlers, as defined by the whereClause
var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
context["tiddlers"] = tiddlers;
// Sort the tiddlers, when sorting is required.
if (parameter.sortClause) {
this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
}
return {tiddlers: tiddlers, context: context};
};
// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
return this.getTiddlersAndContext(parameter).tiddlers;
};
// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
// The following properties are supported:
//
// place
// whereClause
// sortClause
// sortAscending
// actionName
// actionParameter
// scriptText
// tiddlyWikiPath
//
// All properties are optional.
// For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
var tiddlersAndContext = this.getTiddlersAndContext(parameter);
// Perform the action
var actionName = parameter.actionName ? parameter.actionName : "addToList";
var action = config.macros.forEachTiddler.actions[actionName];
if (!action) {
this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
return;
}
var actionHandler = action.handler;
actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};
// ---------------------------------------------------------------------------
// The actions
// ---------------------------------------------------------------------------
// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
return;
}
// Perform the action.
var list = document.createElement("ul");
place.appendChild(list);
for (var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var listItem = document.createElement("li");
list.appendChild(listItem);
createTiddlyLink(listItem, tiddler.title, true);
}
};
abego.parseNamedParameter = function(name, parameter, i) {
var beginExpression = null;
if ((i < parameter.length) && parameter[i] == name) {
i++;
if (i >= parameter.length) {
throw "Missing text behind '%0'".format([name]);
}
return config.macros.forEachTiddler.paramEncode(parameter[i]);
}
return null;
}
// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
if (p >= parameter.length) {
this.handleError(place, "Missing expression behind 'write'.");
return;
}
var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
// Parse the "begin" option
var beginExpression = abego.parseNamedParameter("begin", parameter, p);
if (beginExpression !== null)
p += 2;
var endExpression = abego.parseNamedParameter("end", parameter, p);
if (endExpression !== null)
p += 2;
var noneExpression = abego.parseNamedParameter("none", parameter, p);
if (noneExpression !== null)
p += 2;
// Parse the "toFile" option
var filename = null;
var lineSeparator = undefined;
if ((p < parameter.length) && parameter[p] == "toFile") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
return;
}
filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
p++;
if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
return;
}
lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
}
}
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
return;
}
// Perform the action.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
var count = tiddlers.length;
var text = "";
if (count > 0 && beginExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
for (var i = 0; i < count; i++) {
var tiddler = tiddlers[i];
text += func(tiddler, context, count, i);
}
if (count > 0 && endExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);
if (count == 0 && noneExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
if (filename) {
if (lineSeparator !== undefined) {
lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
text = text.replace(/\n/mg,lineSeparator);
}
saveFile(filename, convertUnicodeToUTF8(text));
} else {
var wrapper = createTiddlyElement(place, "span");
wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
}
};
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
return {
place : placeParam,
whereClause : whereClauseParam,
sortClause : sortClauseParam,
sortAscending : sortAscendingParam,
script : scriptText,
actionName : actionNameParam,
actionParameter : actionParameterParam,
tiddlyWikiPath : tiddlyWikiPathParam,
inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
};
};
// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
if (!idPrefix) {
idPrefix = "store";
}
var lenPrefix = idPrefix.length;
// Read the content of the given file
var content = loadFile(this.getLocalPath(path));
if(content === null) {
throw "TiddlyWiki '"+path+"' not found.";
}
// Locate the storeArea div's
var posOpeningDiv = content.indexOf(startSaveArea);
var posClosingDiv = content.lastIndexOf(endSaveArea);
if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
throw "File '"+path+"' is not a TiddlyWiki.";
}
var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
// Create a "div" element that contains the storage text
var myStorageDiv = document.createElement("div");
myStorageDiv.innerHTML = storageText;
myStorageDiv.normalize();
// Create all tiddlers in a new TiddlyWiki
// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
var tiddlyWiki = new TiddlyWiki();
var store = myStorageDiv.childNodes;
for(var t = 0; t < store.length; t++) {
var e = store[t];
var title = null;
if(e.getAttribute)
title = e.getAttribute("tiddler");
if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
title = e.id.substr(lenPrefix);
if(title && title !== "") {
var tiddler = tiddlyWiki.createTiddler(title);
tiddler.loadFromDiv(e,title);
}
}
tiddlyWiki.dirty = false;
return tiddlyWiki;
};
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
//
// (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
var script = context["script"];
var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
var fullText = (script ? script+";" : "")+functionText+";theFunction;";
return eval(fullText);
};
// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
var result = [];
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
tiddlyWiki.forEachTiddler(function(title,tiddler) {
if (func(tiddler, context, undefined, undefined)) {
result.push(tiddler);
}
});
return result;
};
// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
var message = "Extra parameter behind '"+actionName+"':";
for (var i = firstUnusedIndex; i < parameter.length; i++) {
message += " "+parameter[i];
}
this.handleError(place, message);
};
// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? -1
: +1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? +1
: -1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
// To avoid evaluating the sortClause whenever two items are compared
// we pre-calculate the sortValue for every item in the array and store it in a
// temporary property ("forEachTiddlerSortValue") of the tiddlers.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
var count = tiddlers.length;
var i;
for (i = 0; i < count; i++) {
var tiddler = tiddlers[i];
tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
}
// Do the sorting
tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);
// Delete the temporary property that holds the sortValue.
for (i = 0; i < tiddlers.length; i++) {
delete tiddlers[i].forEachTiddlerSortValue;
}
};
// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
displayMessage(message);
};
// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
var message ="<<"+macroName;
for (var i = 0; i < params.length; i++) {
message += " "+params[i];
}
message += ">>";
displayMessage(message);
};
// Internal.
//
// Creates an element that holds an error message
//
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
var message = (exception.description) ? exception.description : exception.toString();
return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};
// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
if (place) {
this.createErrorElement(place, exception);
} else {
throw exception;
}
};
// Internal.
//
// Encodes the given string.
//
// Replaces
// "$))" to ">>"
// "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
var reGTGT = new RegExp("\\$\\)\\)","mg");
var reGT = new RegExp("\\$\\)","mg");
return s.replace(reGTGT, ">>").replace(reGT, ">");
};
// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
//
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
// Remove any location part of the URL
var hashPos = originalPath.indexOf("#");
if(hashPos != -1)
originalPath = originalPath.substr(0,hashPos);
// Convert to a native file format assuming
// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
var localPath;
if(originalPath.charAt(9) == ":") // pc local file
localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(7));
else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(5));
else // pc network file
localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
return localPath;
};
// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
"forEachTiddler");
//============================================================================
// End of forEachTiddler Macro
//============================================================================
//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
var n = prefix.length;
return (this.length >= n) && (this.slice(0, n) == prefix);
};
//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
var n = suffix.length;
return (this.length >= n) && (this.right(n) == suffix);
};
//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
return this.indexOf(substring) >= 0;
};
//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
for (var i = 0; i < this.length; i++) {
if (this[i] == item) {
return i;
}
}
return -1;
};
//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false.
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
return (this.indexOf(item) >= 0);
};
//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
for(var i = 0; i < items.length; i++) {
if (this.contains(items[i])) {
return true;
}
}
return false;
};
//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
//
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null]
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
for(var i = 0; i < items.length; i++) {
if (!this.contains(items[i])) {
return false;
}
}
return true;
};
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... DOM
/*global document */
// ... TiddlyWiki Core
/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink,
displayMessage, endSaveArea, hasClass, loadFile, saveFile,
startSaveArea, store, wikify */
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
A discussion forum can be a handy way of having groups of students upload files. Here's how:
# Make sure that you have Editing switched ''on'' in your Moodle course
# In the week or topic section, select Add activity -> Forum
# Enter name : {{{Upload comic assignment}}}
# Introduction : It's as well to be very specific and intentional here about what you want your students to do. +++[Here's an example]
{{{
1. Print your comic book to PDF using File -> Print -> PDF
2. In the Moodle Forum, click [Add new discussion topic]
3. Subject: type name of you comic book
4. Message : the people in your group and anything else you want to say about the work.
5. Subscription : 'I don't want email copies'
6. Browse to saved PDF file, Open and Upload
7. click [Post to Forum]
}}}
=== You can copy this text to use with your own Forum
# Force subscription : No. You probably don't want students to get email copies of everything in this forum.
# Maximum attachment size : 50Mb should be sufficient.
# Grade : you can grade diectly from this Forum.
# Common module settings: if your students are working in groups and you have setup Groups on Moodle you can enable group mode here.
# [Save and Return]
!Forums
[[Moodle docs|http://docs.moodle.org/en/forum]]
!! Types
!! What is Q&A and when to use
!!Grading issues
!Groups
Using groups with forums
!Choice
Using Choice activity to allow students to choose group membership.
GenerateRssByTagPlugin overwrite the core generateRSS() function. And defines a txtRssTag option : <<option txtRssTag>> to specify the tag to use (defaulted to ''"toRSS"'' ).
Only tiddlers with this specific tag are inluded in the RSSFeed. If no tiddlers are selected then works with the old behaviour. (see ticket #270: http://trac.tiddlywiki.org/tiddlywiki/ticket/270).
Because the generateRSS mechanism should change in TW 2.3 this enhancement should not go in the core .
Hint : You can add {{{<<option txtRssTag>>}}} in AdvancedOptions
/***
|''Name:''|GenerateRssByTagPlugin|
|''Description:''|Only tiddlers with a specific tag are inluded in the RSSFeed. If no tiddlers are selected then works as before. (see ticket #270: http://trac.tiddlywiki.org/tiddlywiki/ticket/270). <br>RssTag: <<option txtRssTag>>|
|''Version:''|1.0.2|
|''Date:''|Apr 20, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#GenerateRssByTagPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.GenerateRssByTagPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 20, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0 (Beta 5)'
};
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.generateRssByTag = function()
{
var s = [];
var d = new Date();
var u = store.getTiddlerText("SiteUrl");
// Assemble the header
s.push("<" + "?xml version=\"1.0\"" + " encoding='UTF-8' " + "?" + ">");
s.push("<rss version=\"2.0\">");
s.push("<channel>");
s.push("<title" + ">" + wikifyPlain("SiteTitle").htmlEncode() + "</title" + ">");
if(u)
s.push("<link>" + u.htmlEncode() + "</link>");
s.push("<description>" + wikifyPlain("SiteSubtitle").htmlEncode() + "</description>");
s.push("<language>en-us</language>");
s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");
s.push("<pubDate>" + d.toGMTString() + "</pubDate>");
s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");
s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
s.push("<generator>TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + "</generator>");
// The body
var tiddlers;
if (config.options.txtRssTag && store.getTaggedTiddlers(config.options.txtRssTag).length > 0)
tiddlers = store.getTaggedTiddlers(config.options.txtRssTag,"modified");
else
tiddlers = store.getTiddlers("modified","[[excludeLists]]");
var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
for (var t=tiddlers.length-1; t>=n; t--)
s.push(tiddlers[t].saveToRss(u));
// And footer
s.push("</channel>");
s.push("</rss>");
// Save it all
return s.join("\n");
};
//
// Initializations
//
bidix.generateRss = generateRss; // backup core version
generateRss = bidix.generateRssByTag; // install new one
config.options.txtRssTag = "toRSS"; // default RssTag. use <<option txtRssTag>> to overwritte
merge(config.optionsDesc,{txtRssTag: "Only tiddlers with this tag will be included in the RSS Feed."});
//}}}
<<faqlist byTitle [[Glossary details]] question hr>>
'Sticky' block?
A block on your Course site or Overview of my courses which is set by the Moodle administrator and cannot be removed.
"My Moodle"
The default page which loads after you log in on the Moodle front page. Also called Overview of my courses . Displays all your courses, together with assignments and Forum postings for each, 'sticky' blocks, and other blocks which you may have added.
Overview of my courses
The title of the "My Moodle" page. Your default page which displays whenever you click on the EISMoodle link.
MySQL
The database management system that ECS is now using to host Moodle
CMS
Course Management System. Also know as Learning Management System (LMS) or Virtual Learning Environment (VLE). Moodle is an example of an Open Source CMS. Commercial varieties include Blackboard and WebCT.
Block
Moodle parlance for the boxes that surround the Course outline on your course home page. These are mostly course management functions. Default blocks:
|!left side |! right side|
|People | Latest News|
|Activities | Upcoming Events|
|Search Forums | Recent Activity|
|Administration | |
|Course Categories | |
!How to make an activity not graded
# In the gradebook select Choose an action -> Categories and items
# click Add category
** Category name : 'Not graded'. No need to set any other parameters. Save.
# Click Category total:Edit ([[screenshot|graphics/grade_notgraded.png]]<<imagebox>>). Choose or type the following:
** Item name : no grade
** Grade type : none
** Hidden : check
** Save changes
# Move gradable activities into this category using the drag'n'drop or up/down arrows
# Select Choose an action -> Grader report. Note that the //Not graded// category has no totals.
!!Grading Glossary entries
Having [[set up a glossary item in the gradebook|Gradebook for glossary :setup]] and being in the gradebook, you are ready to go
# Now select Choose action -> Grader report
** Click on //Surname// to order by second name. You should now [[see something like this|graphics/glossary_grade_entry.png]]<<imagebox>> and the names should be in the same order in the open Glossary window as the Grading window
# Adjust the window widths so that you can see both Glossary and Grading windows at the same time.
# For each student convert the rating for each glossary entry into a number according to the following Ratings to grades table, add them together and type in the grade into the corresponding field in the Grading window. +++[Ratings to grades]>
|!Rating|!Grade|
|well done!| 5|
|word in context for appropriate reference source| 4|
|definition not appropriate| 3|
|assigned reference sources not used| 2|
|word in context not noted| 1|
|entry missing| 0|
=== Thus two glossary entries with 'Well done' will get (5 + 5) = 10 points.
# You can also type in short comments into the field with dotted lines.
# From time to time click //Update//
!!Setting up Gradebook for Glossary
# In the Course Menu click Gradebook.
# Pull down Choose Action -> Categories and items. You'll see the Edit categories and items screen
# Click Add grade item and click Show advanced button. Fill in the fields according to [[this screenshot|graphics/glossary_grade_1.png]]<<imagebox>>. Note:
** Choose grade type //Value// to make summating the grades easier. You can display a letter grade to the student while keeping the grades as numbers.
** Maximum grade. Each glossary entry has 5 ratings and is therefore worth a max of 5 points. Students should have made two glossary entries and thus max grade = 5 x 2 = 10 points.
** Check the //Hidden// box so that grades and invisible until you're ready.
** Save changes. You should see [[this|graphics/glossary_grade_item.png]]<<imagebox>>
# For convenience you should use either the green up/down arrows or drag'n'drop to move the Glossary grades right to the top of the grading list underneath the course title.
The best way to understand how the Moodle gradebook operates is to go through a worked example. Here I take Dan Graves' 2009 Jazz History course.
!!1. Syllabus
Let's look at the syllabus and see the course work that Dan sets and what each item is worth:
| 25%| Class attendance and participation |
| 5%| Original Listening Analysis Project |
| 20%| Historical Research Paper |
| 10%| Cultural/Contextual presentation/discussion leading |
| 20%| Listening Logs |
| 20%| Final Exam |
!!2. Graded items
Dan decided this year that he wanted to do all the grading for the Jazz History course online. In previous years the Listening Logs were done online but not the overall grading.
* Though most, if not all, of the course activities could have been performed online or submitted online Dan decided to make just the Listening Logs an online activity for students. All the other items were "Offline assignment".
* The Moodle Attendance block did not offer sufficient flexibility and so Dan chose to use an Offline assignment for assessing attendance and participation
* Every gradable item was assessed / 100 points (''thank you Dan''!). Not only did this make the grading process more straightforward it meant that it was a lot easier to do mental checks for the weighted grades.
* While it is possible to do grades straight into the gradebook it seemed more tractable in this instance to use dummy Offline assignments so that there are objects in the course to click on.
!!3. Setup and configuration
# Configure course category (''important'') +++[how to do this]>
Go to Gradebook : Choose an action -> ''Edit'' Categories and items
;Category name
: "Jazz History"
; Aggregation
: change from 'simple weighted mean' to //''Weighted mean''//. This allows the weight of each category to work.
; check
: Aggregate only non-empty grades (grade of zero will have a zero grade), and include subcategories
===
# Create and configure grading categories. +++[how to do this]>
In Edit : categories and items (as before)
click Add category
; Category name:
: Class Attendance and Participation (25%) [note: add the %weight into the name]
; Aggregation:
: Simple weighted mean. We want the mean of all activities within this category
; check
: only non-empty grades ''and'' include subcategories
; Item weight:
: enter weight for this category here -- 25
[[screenshot|graphics/grading_add_category.png]]<<imagebox>>
=== Create a category for each of the sections listed in the syllabus. Now we have all the categories present -- [[screenshot|graphics/grading_categories_added.png]]<<imagebox>>
# Create Offline assignments and allocate to appropriate category. +++[how to do this]>
We need an assignment for Final Exam and Attendance and Participation
''Note :'' even though we could do the grading without having an assignment there, it's easier for the faculty to follow this way.
# Go to Course outline and [Turn editing on]
# in the first section, choose Add activity -> Offline Activity.
## name : Attendance and Participation
## type something in Description
## Grade : 100
## disable the Available to & From dates
## hide the course with Visible -> Hide
## Grade category : choose Class Attendance and Participation (25%) :: ''Important''
# now repeat with an Offline assignment for 'Final Exam'.
** don't forget to allocate it to grade category : Final Exam
===
# move assignments into categories if not already there. +++[how to do this]>
Some of the assignments are still marooned outside their Category. Here's how to put them in the right places.
# Go to the Edit categories and Items page in the gradebook
# click the up:down arrow [img[graphics/up_down_arrow.png]] next to Historical Research paper
# click the empty box underneath Research paper, like [[this|graphics/grading_move_item_2category.png]]<<imagebox>>
# done
# Repeat with the others
===
# Reorder categories if neccessary +++[how to do this]>
It would be nice to have the Categories listed in the same order as in the syllabus. This is easily achieved as follows:
# again in Edit Categories and items
# click the [img[graphics/up_down_arrow.png]] next to a ''Category''
# now move it and the contained assignment(s) into the correct relative position
=== Your final layout should look something like [[this|graphics/grading_overview.png]]<<imagebox>>
# Edit Category totals -- change name, max grade, and hidden -- ''important''. +++[how to do this]>
# In Edit Categories and Items
# click the Edit icon for the ''Category total''
** change name to the appropriate name for that Category
** make the max grade = weight allocated for that Category
** choose whether to hide or not-hide this item (can easily change this)
# Repeat for all the categories [[screenshot|graphics/grading_edit_cat_total.png]]<<imagebox>>
===
All the totals should now add up to 100 which is the course total. The numbers are really easy to check in the Grader Report.
;Note about subcategories:
:The Listening Logs had a special layout to handle [[cumulative grades|Cumulative Grades]]. Basically Dan wanted to grade the listening logs at certain points in time and release the cumulative grade to that point. This I achieved by making each grading point a category and then //nesting// them and checking 'aggregate including subcategories'. This has the effect of accumulating all the individual grades right up to the final grading point. ''However'' the category that encompasses all the Listening logs (the 'totalizer' so to say) should ''not'' aggregate all the subcategories since you need only the final grade from the last grading point. Checking this box gives a discrepancy between the final grading point and the overall grade for the category.
!!4. Grading
!Conclusions
Start simple and progress to full blown course grading.
Initially at least, you'll probably feel the need to make backup copies and printouts of the Moodle grades 'just in case'. Here's how:
# To view Grades in order to print. Click Administration : Grades. Then:
** select Choose an action :-> ''View:'' Grader report. Print -- select print to PDF on your Mac.
# To export to Excel. Select Administration : Grades as before, then:
## Select Choose an action :-> ''Export to :'' Excel spreadsheet
## Scroll down the page and click All/none to uncheck all the boxes
## check the first 3 listening logs and the total
## check 'Include feedback in export'
## click [Submit]
## look at preview -- return and adjust as neccessary.
## [Export] and save to file.
# To check the grades/comments of an individual student. Administration : Grades as before, then:
** Choose an action :-> ''View:'' user report
** on the right hand menu pull down to select the individual user.
# Open up the Assignment activity
# Click 'View n submitted assignments' to start grading. [img[graphics/view_submitted_assignments.png]]
# You'll see the [[default grading screen|graphics/grading_screen_default.png]]<<imagebox>>
# Changing preferences. You will probably want to change one or both of these at the bottom right corner:
** Submissions shown per page. The default is 10; change to the number of students in the course (within reason)
** Allow quick grading. Allows you to set the grade and add a comment for all submissions //on this page//. It does ''not'' allow you to upload a response file. [[quickgrade screen|graphics/grading_screen_quickgrade.png]]<<imagebox>>
** Click [Save preferences]
# Click on Grade to grade a student's submitted files OR use [Zip and Download all submissions]
# Don't forget to [Save all my feedback] at regular intervals
!!!Note
''Uncheck'' Send notification emails otherwise students will receive an email message as soon as you Save the feedback!
+++!![using ZIP download]
This is really quite straightforward.
# click on [Zip and Download all submissions]
# this creates a file called //assignment.zip//. Save this in a //new folder// on your local hard drive.
# In the Finder / Windows Explorer double click to unzip. Note the file format : <student username>_<assignment title>_<uploaded filename>.<file format of uploaded file>. For example ; @@harryp_Avoiding underwater ghoulies_agresearch_news_jun2007.pdf@@ This is why you need to restrict the length of the assignment title.
# This will ''not'' download draft papers (ie where students have not clicked [send for marking]).
===
+++!![Grading and returning graded papers]
Click on the [Grade] link for the student to be graded. Follow the procedure //in the order given//
# Browse and Upload the response file (ie the student's corrected assignment file)
# Assign a grade
# Make some general comments
# [Save changes] (returns to assignment) or [Save and show next]
[[screenshot|graphics/grading_screen_individual.png]]<<imagebox>>
The reason to upload the response file first is that the window gets refreshed after the file is uploaded. If you have already selected a grade and typed in comments these will be totally lost on the screen refresh.
===
!!Introduction
The Glossary activity has a part of the Moodle core since the early versions but it seems to have garnered less attention from developers than Forum for example. However, it can be an effective pedagogical tool for student use and its usefulness is enhanced by its flexibility. For example, Categories can be used to label new entries in an existing Glossary and keywords and auto-linking of terms can also be used profitably. The tabbed browsing options make it easy to track entries by author and category as well as by title or date. Glossary can accommodate rating from the Teacher (as well as from students) and commenting on individual entries. However, the ratings do not seem to be designed to interface well with the gradebook. Unlike Forum for example, there is no way to specify in the activity configuration how you want to activity to accumulate ratings for multiple entries. Thus the gradebook makes use of only the most recent rated entry.
So, how can we grade a glossary with two or more rated entries per student?
What follows is a workaround, a rather messy one, but functional.
!!Process
# Create stand alone grade item in Gradebook with a //numeric// scale to contain the Glossary grades. +++[Here's how]
<<tiddler [[Gradebook for glossary :setup]]>>
===
# Set up separate Glossary and Grading windows
** Glossary window : Browse by Author ; sort by Surname ([[screenshot|graphics/glossary_grade_2.png]]<<imagebox>>)
** Grading window : select Choose action -> Grading report ([[screenshot|graphics/grade_grader_report.png]]<<imagebox>>)
# Now +++[do the grading]
<<tiddler [[Gradebook for glossary :grading]]>>
===
!!Concealing activities not to be graded
+++!!![Here's how]
<<tiddler [[Gradebook : activities not graded]]>>
===
Managing large classes of over 40-50 students is not straightforward. Methods that work reasonably well with small classes often do not scale well for large classes. Faculty can be left burned out and exhausted by just the overhead of managing large numbers of students.
How can teachers modify their approach so as not to get 'eaten alive' by the sheer weight of numbers? This single day hands-on workshop intends to provide a 'self-help' forum for faculty who have to teach courses with >40 students. Components:
* Forum for faculty to share ideas
* pedagogy with large classes
* using Moodle to help manage a large course
!! Housekeeping
* Dates : late July, early August
* Location : LBC PC Lab for sessions, Richmond room for lunch
* Time : 9:00am to 5pm ?
* Lunch : provided.
* Coffee break
* Dinner ? : might be nice to have a summing up session over dinner
* Stipend : $150 for 10 - 15 faculty
!! Course Management using Moodle
* tracking student presence and attentiveness using Attendance
* tracking/grading homework assignments using Assignment
* tests / quizzes /exams. How Moodle can help in the way you want to work.
* online quiz. Upfront effort yields ease of use later.
* class lectures -- make available via Moodle
* discussion forums for out of class interaction. Use of groups. Ratings.
* handling student projects -- groups
* student presentations with groups
* making best use of Teaching Assistant:
** take attendance
** rate discussions
** grade tests / quizzes
!! Pedagogy
* reading and reflection. How to get students to reflect on what they've been reading. Use of blogs
* class lectures -- alternatives to powerpoint
* voice annotation of lectures
* different assignments for different groups of students -- groupings
* Reflective forum postings with Q&A forum type. Students don't see what others have written until after they post their own response.
* Using Blogs to accentuate reflective writing.
Normally you will have the grades for assignments and category totals hidden while you do the grading online. Here's how to reveal the hidden grades and what they look like to the students.
To reveal hidden grades. Click Administration : Grades, then:
# Choose an action :-> ''Edit:'' categories and items
# Click on the closed eyeball to reveal the appropriate grades and totals [[example screenshot|graphics/show-hide_grades.png]]<<imagebox>>
# The grades will be revealed to each individual student. [[example screenshot|graphics/example_user_report.png]]<<imagebox>>
All students now need to do is to [[check their gradebook|Checking grades by students]]
/***
| Name|HideWhenPlugin|
| Description|Allows conditional inclusion/exclusion in templates|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#HideWhenPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| [[License]]|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{
window.removeElementWhen = function(test,place) {
if (test) {
removeChildren(place);
place.parentNode.removeChild(place);
}
};
merge(config.macros,{
hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( eval(paramString), place);
}},
showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !eval(paramString), place);
}},
hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAny(params), place);
}},
showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAny(params), place);
}},
hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
}},
showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
}}
});
//}}}
I have extracted HistoryPlugin from [[iplugin.js|http://itw.bidix.info/#iPlugins]], the external file containaing all plugins for [[iTW|http://itw.bidix.info/]], in a stand alone plugin available at http://tiddlywiki.bidix.info/#HistoryPlugin
Enjoy HistoryPlugin
* Attendance -- address [[Attendance issues|http://www.earlham.edu/markp/miss/index.html#%5B%5BAttendance%20issues%5D%5D ]]
* Gradebook I & II. Scales -- alphabetic
* Groups with Forums. Q&A forum.
* RSS feeds -- setting up and using.
* Using the calendar
* Feedback
* Assignment Upload / bulk download / Review
* Notes about students for course/personal/site viewing. Good for mid-term reports?
!!General
# Why use Moodle ? [[Moodle : Benefits]]
# Managing your course in Moodle [[Course Management]]
# Pedagogical benefits [[Pedagogical Pros]]
# Types of Moodle Course [[Course screen-shots]]
# [[Course Outlines]]
# [[Course screen-shots]]
!!Setting up your course
* arrangement of items in the Moodle window:
> @@BLOCKS@@ : boxes generally containing course management functionality such as Administration, Participants. You can add, remove and rearrange these. A single column of blocks on the left or right of the screen will give an overall 2 column layout to your course and allow more space for content in the Outline.
> @@OUTLINE@@ : the main content area of your course organized in chunks labeled with weekly dates (Weekly layout) or numbers (Topics layout)
* Changing settings.
> +++[Administration:Settings]
# don't change Fullname or shortname
# copy summary from syllabus & paste into Summary
# Outline : weekly/topics
# can change the theme for your course
# Groups - setup (forced/not , visible/separate)
# Availability -- @@ADD ENROLMENT KEY@@ [Note : student enrolment]
''Save changes'' - nothing gets saved unless this is done
===
* Assigning roles
>+++[Administration:Assign roles]
* Can add other teachers or non-editing teachers
* Note [[Librarian Moodle support|http://www.earlham.edu/markp/miss/#%5B%5BNew%20role%20%3A%20Librarian%20Moodle%20Support%5D%5D]] and [[Course Assistant|http://www.earlham.edu/markp/miss/#%5B%5BNew%20role%20%3A%20Course%20Assistant%5D%5D]]
===
* Course editing process -
> +++[Turn editing on]
* switch roles to view
* Top section appears
* Add Resources
* Add Activity
* Move items, hide, delete, rearrange
===
* Adding blocks -
> +++[Latest News block]
* Add Latest News block
* Click [Add New Topic] -- read through the screen.
** Note : //Everyone is subscribed to this Forum//
** What this means : postings are emailed to all students in the class
** Note also: [Mail now] box (explain how the posting system works)
* Click News Forum [@@NAVIGATION@@]
* click Update [@@EDIT@@]
* rename Forum name to "Email class" or whatever you like
** Force sunscription : yes
** Read tracking -- what's this? [@@USE HELP@@]
* Save changes. Note what the results.
===
* Add a 'resource' - Syllabus [@@DEFINE RESOURCES@@]
> +++[Upload file]
* Administration : Files
* Upload
* Browse : Upload. [@@FIND the FILE@@] [@@FILE FORMAT@@ for resources]
* Open
* Upload
Note that Files section is invisible to students ===
> +++[Add Resource -> Link to File or Web site]
* type in name "Syllabus"
* enter text into Summary, eg what's in the syllabus : [@@IMPORTANT@@]
* [choose/upload] : popup window to Files.
* ''Choose'' file you just uploaded.
Note : resource name different from filename. Very useful independence.
* Show Advanced : Keep page navigation visible on the same page [check] (helps navigation)
* Common module settings : hide resource if you don't want students to see it just yet
* Save changes
===
* Editing Course Outline
> +++[Edit summary]
Uses a simple HTML editor
* Click on the ''pen'' icon
* type in the topic you cover in week 1 (eg 'Introduction to Hogwarts' )
* press [Enter]
* highlight and format as Heading 2 [@@IMPORTANCE of HEADINGS@@]
* click on Ordered list [@@IMPORTANCE of LISTS@@]
* type a list of things to do (eg care and feeding of owls, etc)
* type in //read Syllabus//
* Save changes
Notice how the text in the Outline is //automatically linked// to the Resource [@@USE of BROWSER TABS in EDITING@@]
===
* Adding Assignments
> +++[Add Activity]
* Difference kinds of assignment (Advanced uploading files, Online Text, Upload single file, Offline activity)
* When are each of these useful
* Go through Upload single file
* Due dates, accept late entries, notes, etc
===
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>Moodleings</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>
!Some comments about the online talk by Martin
''6^^th^^ Nov 2008''
Martin gave us an introduction to Moodle most of which was already fairly common knowledge.
Interesting statistics:
# 330 Moodle sites with more than 10,000 users. Can Blackboard claim the same?
# Open University (UK -- the largest distance educational site in the world) has 3590 courses with 452,483 users. //So much for ~PhP/~MySQL not scaling well, as the Sakai proponents would have us believe//
# Translated into more than 75 languages
!!Community roles : moodle.org
[[Graphic of Roles in support forums on moodle.org|NITLE_dougiamas/moodle_org_usage_small.png]]<<imagebox "Interesting breakdown: fewer teachers & more admins.">>
!!Moodle Economics
;Questions:
:What are NITLE schools doing to support Moodle; financially, via bug fixing, user support, developer support, etc?
:How can we pool our resources to ensure the prospering of this Mission Critical software?
!!Pedagogical focus.
Moodle's declared focus is //pedagogical//. Summary of points:
* in a true collaborative environment we are both teachers as well as learners.
* learn best by the act of creating or expressing things for others to see
* by understanding contexts we can teach in a more transformational way (constructivism)
* learning environment needs to be flexible and adaptable to respond to needs of participants.
Earlier in the conversation Martin dropped what I thought was a bombshell. He posed the question of whether Moodle was successful which could be thought of as a 'no-brainer'. Of course it's successful. But he seemed to suggest that maybe it was not. Later on this throw away comment became more pertinent. What are educators actually doing with Moodle compared with what we'd like to see happen? Or, to put another way, how much Social Constructivist pedagogy actually takes place on Moodle?
To examine this question more closely Martin looked at a progression of activities from 'lower' to 'higher' (he actually showed this from higher to lower):
# Publish content -- Resource +++[Comment]>
This is all 90% of Earlham faculty do with Moodle. How do you address this and move change Obama wise?
===
# Passive Forum -- News +++[Comment]>
Very few faculty use this at Earlham. In other institutions the //Quickmail// module is very popular
===
# Quizzes / Assignments (less management) +++[Comment]>
A case can be made that //course management// in and of itself can be pedagogically beneficial. I have seen an example from a NITLE school where the Quiz has been used as a knowledge self assessment tool( Hope Geology prof). (So how can we promulgate these examples?)
There is a good deal of scope within the Assignment paradigm for pedagogic progress, for example, with uploading corrected assignments.
===
# Wiki, Glossary, Database -- collaborative content. +++[Comment]>
Here the issue is with implementation. The wiki module has been left on a branch to wither since 1.6. The current implementation based on ewiki is almost non-functional. Martin did say that Moodle central are planning to rewrite this for 2.0.
Glossary is an under appreciated activity, perhaps because of lack of models for creative use. It is stable and flexible and has a lot of potential.
Database -- solution looking for a problem?
===
# Use Forum seriously and actively. +++[Comment]>
I have seen interesting conversations about how the functionality of discussion forums affects pedagogy.
The simplicity of creating a forum belies their flexibility. Need more instruction on how to use groups with forums.
The so-called //Q & A// Forum forces all students to post before being able to view any other postings. This is pedagogically powerful but one wonders whether a more descriptive name for this feature might not help promulgate its use.
===
# Combine activities into sequences. +++[Comment]>
This has not been possible until version 2 without using unsupported modules and hacking. Lots of potential.
===
# Think deeper about learning activities.
# Survey module to study / reflect +++[Comment]>
I never saw the reasoning behind this module and I have still to discover models of its beneficial use. Apparently it's meant to measure what students are thinking about.
===
# Peer-review modules like Workshop +++[Comment]>
It's highly ironic that Martin should cite this as an example of higher order use of Moodle since later in the talk he acknowledges that Workshop is "a rats nest of spaghetti code" and is not being actively developed or supported (again since 1.4/1.5).
We really need to address a good working substitute and push for inclusion into the core -- 'Peerlight' seems to have got nowhere.
===
# Sharing ideas, active research, self study. +++[Comment]>
I would argue that Moodle's course based approach is not really consonant with these functions. In fact, [[Elgg|http://elgg.org]] is better suited to these kinds of activities as I discuss in [[New Horizons in Social Networking : Earlham Learning Spaces|http://www.earlham.edu/markp/LSW/#%5B%5BNew%20Horizons%20in%20Social%20Networking%20%3A%20Earlham%20Learning%20Spaces%5D%5D]]
===
![[Moodle two oh]]
![[Moodle 2.0 new features]]
!!New Features
+++[Complete List]>
* Improved internal file handling, including
** Import : support for external repositories
** Export : support for e-portfolios
* Community Hubs
* Improved usability / interface for Gradebook / Roles
* Conditional Activities
* Progress Tracking
* Web servcies API
* New modules : Feedback, Wiki and probably others
* Pages / Weblib / Blocks
* New text editors and better control of formats in all parts of Moodle
* Secure Feeds and Flows
* Backup 2.0
* Site-wide groups
* IMS Common Cartridge
* Blog comments, external blog support
* Messaging improvements
* Improved security / performance
===
In no particular order:
* Progress tracking -- enables the creation of student "learning plans" with competencies and outcomes level as well as course level.
* Expose Web services API accessible via SOAP, REST XML/RPC. Complete Flash interface with Flex driven by Web services. Mash up Moodle with other things.
* @@New WYSIWYG editor -- ~TinyMCE@@ At last a decent editor interface. Martin also mentioned reimplementing a wiki style markup, eg Textile or Markdown
* Martin hinted that the Secure RSS feeds project from the +++[Google summer of code]>
** Original list of projects for [[GSOC 2008 |http://docs.moodle.org/en/Student_projects]]
** [[Code produced by students|http://code.google.com/p/google-summer-of-code-2008-moodle/downloads/list]]
** discussion of [[Moodle Tutorials|http://moodle.org/mod/forum/discuss.php?d=88532]] initiated by a student on the GSOC.
===
would be rolled into the 2.0 core.
* IMS Common Cartridge -- import from this format but export not feasible. IMS is a euro-centric teaching object format.
* external blog support via public RSS feeds.
!! Content / Files
Major changes in how Moodle can handle files. [[File handling graphic|NITLE_dougiamas/file_handling.png]]<<imagebox>>
* Pull content in from Repositories
* Push content out to E-portfolios
!!!Repository
The idea is that you can //upload// a file into Moodle from more than just a local filestore. Apparently there are 15 repository plugins including Google Docs, Alfresco, Dspace, Fedora, and @@SMB@@, even files on an iPhone can be uploaded [[Repository file picker graphic|NITLE_dougiamas/repository_file_picker.png]]<<imagebox>>
+++[Comments]>
* so it should not take a lot of effort to create a repository plugin for Elgg, right? Do these not all need some sort of Single Sign On (SSO)?
* We're still duplicating files here and not addressing the issue of file access security within the Moodle file system itself.
* Also, searching and tagging files should be addressed.
===
!!!ePortfolio
A "Save" button provided for user's content would reveal a menu to choose ePortfolio and file type. Currently [[Mahara|http://www.mahara.org]] is the only eportfolio supported. +++[MD's comment about New Zealand & eportfolio]>
Apparently New Zealand government decided to have a nationwide eportfolio system and Mahara will provide the basis for this. Thus there will be giant portfolio servers to serve every school, college and University.
===
* E-portfolio repository plus interfaces for :
** managing and organising items
** construction of journals, metadata etc to bind items together
** sharing items (to other users or outside)
* Targeted systems:
** [[Mahara|http://www.mahara.org]] from New Zealand
** [[MyStuff|http://www.open.ac.uk/mystuff]] from Open University in the UK
** box.net, Flickr (??), ~MySpace (???), Facebook (???)
+++[File output formats]>
Different formats for different pages:
* HTML
* PDF
* XML
Courses and sections could be:
* IMS LD
* IMS CC
* Moodle backup format
This latter begs the question of how to display a Moodle course without a Moodle installation. If you are constructing a portfolio whether online or not you want to showcase your course, how do you do this? Ans: what is needed is a 'moodle reader' equivalent to Acrobat Reader.
===
!!!Community Hubs
The idea of a community hub [[illustrated here|NITLE_dougiamas/community_hubs.png]]<<imagebox>> is that user accounts, courses and files can be shared between Moodle instances either in different institutions or perhaps more commonly within the same institution.
Opening up courses to the community apparently is a big dream for Martin.
!!Usability
Historically, Martin's approach to User Interface was to get the code working with a good enough user interface, put it out there and hope for constructive comments for how to improve. However, in practice, the user community has not been very helpful in suggesting concrete improvements. Martin particularly requested help with the moodle user interface.
One example he gave was the add/edit courses page in Course Categories. They attached an eye tracking device to the head of a new user to Moodle and observed where he looked on the screen while trying to find the button to add a new course. The programmer had placed the button what was thought to be the logical location but the user ended up looking all over the screen until he found it.
!!!Gradebook user interface
There has been //lots// of discussion about the gradebook interface. The original layout was designed to show //all// the features. This was meant to be for programmers only and a [[report plugin system|http://docs.moodle.org/en/Development:Gradebook_Report_Tutorial]] was designed so that users could have their own customised front end for grade reports. In the event however, these have not be used extensively (I did not even know this functionality was present!) and changes have been made to the default gradebook view. Apparently there are now two moodle coders working on this. The gradebook user interface was the top 10 of UI issues and Martin's point was that it was a good example of trying to please everyone! He encouraged people to visit the Gradebook Forum. [[Popular gradebook issues|http://tracker.moodle.org/browse/MDL/component/10062?selected=com.atlassian.jira.plugin.system.project:component-popularissues-panel]]
!!Wiki
The core wiki (based on dfwiki) has been in a parlous state for some time (since v1.5 in fact). Last year the moodle community voted for Ludo's Catalan (Northern Spain) version of Nwiki to replace the core wiki (also known as 'ewiki'). However, Martin now tells us that this version is also spaghetti code and so moodle central is rewriting the wiki module based on ~OUWiki code (Open University) [[new version announced here|http://moodle.org/mod/forum/discuss.php?d=109642]] with Nwiki features that the community wanted.
+++[other new modules]>
* Feedback
* New Wiki
* New reports
* New filters
* New blocks
* Better organisation of 3^^rd^^ party modules
===
!!!Completion Tracking
The idea of this is to implement sequencing of Activities within a moodle course. The Moodle 'engine' has no concept of course progression and so sequencing is rather important. This enables the instructor to configure the course so that activity #2 can only be started after activity #1 has been completed successfully.
!!On to 2.0
* Increased pedagogical support with wizzards and other stuff. Get input from instructional designers. Add more Ajax, Flash and Flex.
* slicker, smoother, easier interfaces
* Further integrations with other systems
* Better support of standards (as they evolve)
* Continued evolution of the core code to increase flexibility, reduce size, and increase efficiency
!! For Developers
* ''dev.moodle.org'' produced by Humbolt to teach wannabe developers.
* [[demo.moodle.org|http://demo.moodle.org]] is where you can try out Moodle //as an administrator//!!
* Moodle central is also looking for state of the art moodle courses -- contact Helen Foster at support@moodle.org and she will anonymise course backups.
* Moodle.org is to be revamped soon with a new theme
<html>
<h2 id="id7">Benefits of using Moodle</h2>
<p>Why bother with using Moodle? Why not have a course web site? Before Earlham first installed Moodle I taught a course using a website and student blogs. All the content, lab exercises and assignments were located on the website ( <a href="http://www.earlham.edu/~markp/mgmt_2003/">Information Technology and Society</a> ) and the students did their work in their own blog. I <a href="http://www.earlham.edu/~markp/cms/reports_proposals/AECT/ww_round_table.php" title="Weblogs & Websites a symbiotic relationship">wrote up the experience</a> as a roundtable presentation for the <span class="caps">AECT</span> conference 2004. The disadvantages of this approach are worth repeating :</p>
<ol>
<li> To make a good looking site you need have expertise in web design
<ul>
<li>learning curve for html & styles</li>
</ul>
</li>
<li>Large overhead in time to design & create the site.
<ul>
<li>Need to tweak as you go along.</li>
</ul>
</li>
<li>Everything is public :
<ul>
<li>posting grades is problematic since all the students can see each other's grades.</li>
<li>making copyrighted articles available</li>
<li>open to spam harvesting</li>
</ul>
</li>
<li>Handling student input – the web is read only.</li>
</ol>
<p>I found solutions and workarounds for all these problems but at the end of the day I realised that I had manually performed all the functions of a Course Management System (CMS) to produce a very specific learning arena (the website).</p>
<p>In practice the terms 'course management system (CMS)', 'virtual learning environment (VLE)' or 'Learning Management System (LMS)' are used interchangeably for the same kind of software systems. You've all probably heard <em>ad nauseam</em> of Blackboard & WebCT. However, the latter terms hint at functionality concerned with more than just managing a course but enhancing it's pedagogy. We shall cover both of these aspects (and in fact they merge together as one would expect). My article <a href="http://www.earlham.edu/~markp/cms/lit_resources/what_CMS_moodle.php#first">What is Course Management?</a> provides a reasonable overview of the functionality that we can expect from an <span class="caps">LMS</span>.</p>
</html>
<<faqlist byTitle [[Moodle FAQ details]] question hr>>
How can I add a Reference Librarian as a 'teacher' to my course? Also, I want to change the role name to 'reference librarian'.
Click Administration: Teachers. Search for the username of the person you want to add. Then Add Teacher.
To change the 'role' merely delete 'Teacher' from the box and type in 'reference librarian'
Save Changes
How can the color theme be changed for my course?
Administration: Settings. Find 'Force theme' at the bottom of the page and pull down the theme you want.
Save changes.
The only way of seeing what these are like is to experiment!
I want to remove topics or weeks from the Outline. How do you do this?
This operation is not readily apparent.
Go to Administration: Settings -> Number of Weeks/Topics
Reduce the number shown.
So, reducing Number Weeks/topics from 10 to 8 will remove 2 blocks from the bottom of the Outline (make sure that there is nothing in these!)
I'm not doing online grading. How can I make the 'Grades' link disappear on the student's view of my course?
Administration: Settings
Change Show grades to No
How can I let students know about a new resources or assignment on Moodle?
Make a posting in the 'News forum'. All students are subscribed to this and so will get the posting via email.
This is a misnomer -- it would better be called 'Announcements and News'.
To make things even smoother you can paste in a link to the assignment or resource itself.
What is this 'subscription' business in Forums?
'Subscribing' to a forum means that you get sent all the postings as email messages.
This may or may not be convenient. It is certainly not encouraged because it tends to fragment the community building of a discussion forum.
Every time I post to a discussion Forum I get subscribed. How can I change this?
Here again, this is not readily apparent.
Administraion : Edit Profile
From Forum autosubscribe choose 'No:don't automatically subscribe me to forums'
for more details see[[Discussion Forum Subscription problem]]
Why should I use FireFox instead of Internet Explorer or Safari? What's the downside? Are there any special things that need to be done with a new FireFox installation?
Safari won't display the HTML editing bar when in Edit or Update
Internet Explorer often gives an error opening Word or Powerpoint files see [[Problem displaying Word files]]
For the whys and wherefores of Moodle with Firefox see [[Using Moodle with Firefox|http://www.earlham.edu/~markp/cms/user_guides/moodle_tips/moz_firefox.php]]
I need 6 groups of 5 students for this course. How can I set this up, and how do groups work with Activities?
Adnministration : Settings.
Add Groups (more to come).
How can I get rid of the 'blocks' I don't want?
Click Turn editing on
Each block can be moved about with the arrow buttons; use the ''X'' to delete it.
If you make a mistake the block can be found again: in 'blocks' block pull down Add to see a list of potential blocks to display.
How can I change my Moodle site from three columns to two columns and give more space to the Outline?
Delete superfluous blocks, eg Search Forums, Recent Activity, Course Categories.
Move other blocks to the left side of the page. Reorder to suit.
The 'blocks' block will always be present on the right side but when you click Student view it'll disappear.
How can I quickly contact Mark when I'm in Moodle?
Use the Messages system. Either:
Add Messages block to your course. Or,
Go to your Profile and click the Messages button
How can I change the grading scale for an assignment?
Administration : Scales
Click Add New Scale
give it a name
list the items from lowest to highest separated by commas. Eg D,C,B,A
add a description
Save
!!Links to Moodle Documentation
* The canonical [[Moodle Docs wiki|http://docs.moodle.org/en/Main_Page]]
* [[Screencast tutorials on Google video (Assignments)|http://video.google.com/videosearch?q=moodle+assignments&page=1&lv=0&so=0]]
* Very nice set of [[screencast videos (Flash format) for instructors and learners|http://treadwell.cce.cornell.edu/moodle_doc/index.html]]
* Moodle instructors' communities and pedagogical support [[facultyroom.org (Teaching together better with Moodle)|http://facultyroom.org/]]
----
*[[UK Blog about Moodle happenings(Moodlebug)|http://fraser.typepad.com/moodle/]]
* [[Step by step installation of Moodle on a Linux server|http://reallylinux.com/docs/installmoodle.shtml]]
* The [[Wikipedia entry for Moodle|http://en.wikipedia.org/wiki/Moodle]]
! 1. Use of ~ARTStor viewer by Mike Thiedeman
[[Download & install Artstor Offline Image Viewer (OIV)]]
! 2. Using Q&A Forum by Mike Thiedeman.
Pedagogic value
+++![3. Overview of New features]
Use [[Defence Against the Dark Arts|https://moodle.earlham.edu/course/view.php?id=233]] as my example.
* Move items around with drag and drop (AJAX)
* Course Menu : easy access to all weekly / topic sections
** (bug: moving topic sections doesn't stick)
** Configuration : change what is shown and the order
* Feedback
* Books
!! Administration
* [[Course Backup|Backing up a course]]
!! Questions and Comments
!!Enhancements to ~MyMoodle
* Treat course list like a Course outline.
** order by drag'n'drop
** hide unused classes
* hide/reveal assignments due (on //student's// display) OR
* assignment not displayed until From date and disappear after Due date.
* simple, //configurable//, stats display under Course name. Eg:
** number of enrolled students
** date of last activity (do I need to do something?)
** graph of course access by all students over last week/month/since course start. This would indicate how much your students have been accessing the course material. Easy to crunch the data from logs.
===
!!Functionality:
!!!1. Passive reading -- content
Resources:
* uploaded files
* web pages
* links to library resources
* URL links to external sites
!!!2. Activities
* Assignment : simple and advanced file upload, online, offline
* Forum
* Glossary
* Quiz
* ''Feedback'' @@NEW@@
!!!3. Course Management
* News Forum
* Attendance
* Grading
!!!4. Platform for alternative learning solutions
* RSS feed input
* links to Earlham Learning Spaces
Examples of Course formats : [[Course screen-shots]]
[[Moodle Workshop : 2. decisions]]
!Decisions to make
# How much of my course do I want to present on Moodle?
** Syllabus
** Readings + Syllabus
** Readings + Activities
** Readings + (Activities +/- Management)
# Which course layout do I want to use?
** weekly -- easy to follow in a chronological progression
** topics -- more flexible grouping of information
# How much time do I want to spend?
+++!!![Moodle functionality]
<<tiddler [[Moodle Workshop : 1. functionality]]>>
===
+++!!![decisions]
<<tiddler [[Moodle Workshop : 2. decisions]]>>
===
!!REFER TO THE MOODLE COURSE IN CLASS
Students will not look at Moodle unless you tell them to. So, "the homework assignment is in Moodle" or "Read the lastest resource in Moodle" or "I'll have the assignment up on Moodle by Friday"; all these drum home the notion that students should look to your Moodle course for work they need to do.
If you want students to read a resource they need to be told to do this explicitly. I have yet to meet a student who accessed a course and read a resource just because it was there.
Also, use [[News Forum for class announcements]]
Survey result for how Moodle Resources were used:
[img[http://www.earlham.edu/~markp/cms/evaluations/moodle_fall_04/Q9.png]]
Survey result for use of Mioodle outside class time:
[img[http://www.earlham.edu/~markp/cms/evaluations/moodle_fall_04/Q7.png]]
!Moodle 2.0
;Questions asked by everyone. When will it be released, and what will be in it?
:Apparently version 2.0 is due in @@June of 2009@@ +++[comments]>
Whether this will really be stable enough for production use is equivocal. At any rate, an estimated release in June probably means actual release in July which is really too close for comfort for an August start to new semester.
===
By Martin's own admission, the development cycle for Moodle has been chaotic. This came to a head with version 1.7 which as he responded to Ken Newquist later was a rushed and unready release. But since then they have settled into a [[cycle of code release (graphic)|NITLE_dougiamas/moodle_release_cycle_small.png]]<<imagebox>> which has included a 5-6 month period of beta testing.
!!Enlightening comments
* @@For most developers a moodle issue does not exist unless it gets into the Tracker.@@
* The Tracker is the main way to interact with moodle developers, and @@not@@ the support forums. (Although I reckon that many developers also hang out at the Developers Forum). [[Centrality of the tracker (graphic)|NITLE_dougiamas/tracker_centrality.png]]<<imagebox>>
* Martin wants to "teach developers to be more humble". In particular, with regard to User Interface issues.
![[Moodle 2.0 new features]]
!!Optimizing export from Screenflow
The Mac screen recording app, Screenflow, does not seem to permit recording through a fixed size viewport. Thus you have to record the whole screen. When using a large screen such as 1680 x 1050 on a 24" iMac this results in a lot of wasted screen recording when all the action really takes place in the browser. Though Screenflow captures the whole screen you can resize the 'canvas' to cover just the area where the action takes place and then export this as the movie. Here's how I did it :
# Set browser size to 1200 x 900 pixels to obtain a 4:3 aspect ratio on the final video play. One means of doing this is with the Firefox web developer plugin which has an option "Resize : display window size in Title" which will display the current viewport height and width.
# Fire up Screenflow and perform the usability test.
# Resize the canvas and set export preferences.
** I resized the canvas to 1200 x 900px and scooted it around so that the browser filled the whole canvas.
** Then I change the export settings as follows: File -> Export
** Video settings:
*** Frame rate : current
*** key frame : automatic
*** Data Rate : automatic (can also set this to 300 kbps)
*** Compressor : medium
** Sound settings:
*** Format : AAC or 'MPEG low delay AAC' (not sure of the difference)
*** Channels Mono (we're only using a single microphone)
*** Rate 22 ~KHz (single channel)
*** Bit rate : 36 kbps
This produced a 108Mb file from a 45 minute recording.
Here's a screencast of how I configured the canvas and did the export:
> <<divbox 'configure ScreenFlow and export' screenflowDiv 'Configuring Screenflow for export' 1400 700>>
<html>
<div id="screenflowDiv" style="display:none;">
<object width="1400" height="700">
<param name="movie" value="http://www.earlham.edu/markp/moodledocs/graphics/screenflow_export_setup.swf"></param><param name="wmode" value="transparent"></param><embed src="http://www.earlham.edu/markp/moodledocs/graphics/screenflow_export_setup.swf" type="application/x-shockwave-flash" wmode="transparent" width="1400" height="700"></embed>
</object>
</div>
</html>
!!What:
Hands on introduction to Moodleing and associated tasks. We will cover all aspects of supporting faculty from scanning documents to dealing with Moodle.
!!Where and When:
Bolling PC Lab on Monday Dec 1^^st^^ at ''3 pm'' (@@note earlier time@@). We'll finish at 5pm on the dot. [The college does not have a public lab with both ~PCs and Macs to cater for the number of attendees]. We will be using Firefox which is platform independent. If you have access to a portable Mac you could bring that.
!!Preparation
# Since we will be uploading files and manipulating Word documents you will need to bring with you at least two documents in Word format. They can be anything you have available. You can ''either'':
** Copy the documents to your network home drive (here's how for [[Mac users|Access home volume -- Mac]] and [[PC users|Access home drive -- PC]], ''or''
** bring them on a USB thumb drive.
# Make a note of any questions, problems, or issues that you have with Moodle. There will be time to deal with user questions. It would help me a lot to have these emailed to me ahead of the workshop.
Please do ''not'' turn up without documents to upload.
!!Workshop schedule
# [[Scanning|Scanning Best Practices]] (demo). I'll demonstrate how to scan a book/paper with illustrations and how to scan a colour illustration for upload into Moodle. You'll be pointed to [[documentation|Scanning Best Practices]] for these tasks.
# Convert MS Word document into Acrobat PDF. Discuss why PDF is the preferred format. You will use a document you brought with you for this.
# [[Overview of the Moodle system|Introduction to Moodle]], courses and your role.
# How to Upload documents into the Files area. Practice with your own documents.
# How to create a Resource with the uploaded File.[[Resources : Best Practices]]
# How to create a Resource from a Web page. [[Resources : Best Practices]]
# Circumstances under which you might use the Directory feature.
# Questions and answers
Sometimes a teacher may be teaching two sections of a course. In this case it's convenient to have both sections use the same material on Moodle. Here's how you can do this:
!!1. Set up ''forced'' groups
# Administration : Settings
# In Groups :
** Group mode -> //Separate groups// ,
** Force -> //Yes//.
** Save changes
!!2. Administration : Groups
# Click ''Create group'' to create as many class sections as you need. I would advise ''not'' to use an enrolment key for these groups.
# Select a group and click ''Add/remove users''
# Add the students to this section.
# Click ''Back to groups'' when finished.
# You can ''Auto-create'' groups. +++[More details]
* Select members -> Students
* Specify -> this lets you choose either
** the total number of groups you want -- and divides up the students into this number of groups OR
** the number of students per group (members) -- divides up students by groups with fixed number of members.
* Group / Member count. The number applicable to above.
* [''Show Advanced'']
** Allocate members :
*** No allocation -- just create groups but don't add students
*** randomly
*** alphabetically
** Prevent last small group -- if there's a number of groups and a small size one left over, allocate these members to the others. How this works in practice you'll have to experiment.
* Naming scheme : ''@'' represents groups by letter, ''#'' gives group number
;Examples
: 2 groups, allocated alphabetically by first name. [[screenshot|graphics/groups--autocreate_alphabet.png]]<<imagebox>>
: 6 members per group, allocated randomly, named A,B,C [[screenshot|graphics/groups--autocreate_random.png]]<<imagebox>>
===
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Version|2.3.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Slider.prototype.stop|
|Description|show content in nest-able 'slider' or 'floating' panels, without needing to create separate tiddlers for each panel|
!!!!!Configuration
<<<
Enable animation for slider panels
<<option chkFloatingSlidersAnimate>> allow sliders to animate when opening/closing
>(note: This setting is in //addition// to the general option for enabling/disabling animation effects:
><<option chkAnimate>> enable animations (entire document)
>For slider animation to occur, you must also allow animation in general.
Debugging messages for 'lazy sliders' deferred rendering:
<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering
<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered
<<<
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.
Additional optional syntax elements let you specify
*default to open
*cookiename
*heading level
*floater (with optional CSS width value)
*transient display (clicking elsewhere closes panel)
*custom class/label/tooltip/accesskey
*alternate label/tooltip (displayed when panel is open)
*panelID (for later use with {{{<<DOM>>}}} macro. See [[DOMTweaksPlugin]])
*automatic blockquote style on panel
*deferred rendering of panel content
The complete syntax, using all options, is:
//{{{
++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip][altlabel|alttooltip]}}}#panelID:>...
content goes here
===
//}}}
where:
* {{{+++}}} (or {{{++++}}}) and {{{===}}}<br>marks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.
* {{{(cookiename)}}}<br>saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.
* {{{!}}} through {{{!!!!!}}}<br>displays the slider label using a formatted headline (Hn) style instead of a button/link style
* {{{^width^}}} (or just {{{^}}})<br>makes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)
* {{{"*"}}} //(without the quotes)//<br>denotes "transient display": when a click occurs elsewhere in the document, the slider/floating panel will be automatically closed. This is useful for creating 'pulldown menus' that automatically go away after they are used.
* """{{class{[label=key|tooltip][altlabel|alttooltip]}}}"""<br>uses label/tooltip/accesskey. """{{class{...}}}""", """=key""", """|tooltip""" and """[altlabel|alttooltip]""" are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. altlabel/alttooltip specifiy alternative label/tooltip for use when slider/floating panel is displayed.
* {{{#panelID:}}}<br>defines a unique DOM element ID that is assigned to the panel element used to display the slider content. This ID can then be used later to reposition the panel using the {{{<<DOM move id>>}}} macro (see [[DOMTweaksPlugin]]), or to access/modify the panel element through use of {{{document.getElementById(...)}}}) javascript code in a plugin or inline script.
* {{{">"}}} //(without the quotes)//<br>automatically adds blockquote formatting to slider content
* {{{"..."}}} //(without the quotes)//<br>defers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//
//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.//
<<<
!!!!!Examples
<<<
simple in-line slider:
{{{
+++
content
===
}}}
+++
content
===
----
use a custom label and tooltip:
{{{
+++[label|tooltip]
content
===
}}}
+++[label|tooltip]
content
===
----
content automatically blockquoted:
{{{
+++>
content
===
}}}
+++>
content
===
----
all options combined //(default open, cookie, heading, sized floater, transient, class, label/tooltip/key, blockquoted, deferred)//
{{{
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
content
===
}}}
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
content
===
----
complex nesting example:
{{{
+++[get info...=I|click for information or press Alt-I]
put some general information here,
plus a floating panel with more specific info:
+++^10em^[view details...|click for details]
put some detail here, which could in turn contain a transient panel,
perhaps with a +++^25em^*[glossary definition]explaining technical terms===
===
===
}}}
+++[get info...=I|click for information or press Alt-I]
put some general information here,
plus a floating panel with more specific info:
+++^10em^[view details...|click for details]
put some detail here, which could in turn contain a transient panel,
perhaps with a +++^25em^*[glossary definition]explaining technical terms===
===
===
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.07.26 - 2.3.1'' in document.onclick(), propagate return value from hijacked core click handler to consume OR bubble up click as needed. Fixes "IE click disease", whereby nearly every mouse click causes a page transition.
''2007.07.20 - 2.3.0'' added syntax for setting panel ID (#panelID:). This allows individual slider panels to be repositioned within tiddler content simply by giving them a unique ID and then moving them to the desired location using the {{{<<DOM move id>>}}} macro.
''2007.07.19 - 2.2.0'' added syntax for alttext and alttip (button label and tooltip to be displayed when panel is open)
''2007.07.14 - 2.1.2'' corrected use of 'transient' attribute in IE to prevent (non-recursive) infinite loop
''2007.07.12 - 2.1.0'' replaced use of "*" for 'open/close on rollover' (which didn't work too well). "*" now indicates 'transient' panels that are automatically closed if a click occurs somewhere else in the document. This permits use of nested sliders to create nested "pulldown menus" that automatically disappear after interaction with them has been completed. Also, in onClickNestedSlider(), use "theTarget.sliderCookie", instead of "this.sliderCookie" to correct cookie state tracking when automatically dismissing transient panels.
''2007.06.10 - 2.0.5'' add check to ensure that window.adjustSliderPanel() is defined before calling it (prevents error on shutdown when mouse event handlers are still defined)
''2007.05.31 - 2.0.4'' add handling to invoke adjustSliderPanel() for onmouseover events on slider button and panel. This allows the panel position to be re-synced when the button position shifts due to changes in unrelated content above it on the page. (thanks to Harsha for bug report)
''2007.03.30 - 2.0.3'' added chkFloatingSlidersAnimate (default to FALSE), so that slider animation can be disabled independent of the overall document animation setting (avoids strange rendering and focus problems in floating panels)
''2007.03.01 - 2.0.2'' for TW2.2+, hijack Morpher.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2007.03.01 - 2.0.1'' in hijack for Slider.prototype.stop, use apply() to pass params to core function
|please see [[NestedSlidersPluginHistory]] for additional revision details|
''2005.11.03 - 1.0.0'' initial public release
<<<
!!!!!Credits
<<<
This feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.
<<<
!!!!!Code
***/
//{{{
version.extensions.nestedSliders = {major: 2, minor: 3, revision: 1, date: new Date(2007,7,26)};
//}}}
//{{{
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;
if (config.options.chkFloatingSlidersAnimate==undefined) config.options.chkFloatingSlidersAnimate=false;
// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
//}}}
//{{{
config.formatters.push( {
name: "nestedSliders",
match: "\\n?\\+{3}",
terminator: "\\s*\\={3}\\n?",
lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\>]*\\^)?)?(\\*)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
handler: function(w)
{
lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
{
// var defopen=lookaheadMatch[1]
// var cookiename=lookaheadMatch[2]
// var header=lookaheadMatch[3]
// var panelwidth=lookaheadMatch[4]
// var transient=lookaheadMatch[5]
// var class=lookaheadMatch[6]
// var label=lookaheadMatch[7]
// var openlabel=lookaheadMatch[8]
// var panelID=lookaheadMatch[9]
// var blockquote=lookaheadMatch[10]
// var deferred=lookaheadMatch[11]
// location for rendering button and panel
var place=w.output;
// default to closed, no cookie, no accesskey, no alternate text/tip
var show="none"; var cookie=""; var key="";
var closedtext=">"; var closedtip="";
var openedtext="<"; var openedtip="";
// extra "+", default to open
if (lookaheadMatch[1]) show="block";
// cookie, use saved open/closed state
if (lookaheadMatch[2]) {
cookie=lookaheadMatch[2].trim().slice(1,-1);
cookie="chkSlider"+cookie;
if (config.options[cookie]==undefined)
{ config.options[cookie] = (show=="block") }
show=config.options[cookie]?"block":"none";
}
// parse label/tooltip/accesskey: [label=X|tooltip]
if (lookaheadMatch[7]) {
var parts=lookaheadMatch[7].trim().slice(1,-1).split("|");
closedtext=parts.shift();
if (closedtext.substr(closedtext.length-2,1)=="=")
{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
openedtext=closedtext;
if (parts.length) closedtip=openedtip=parts.join("|");
else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
}
// parse alternate label/tooltip: [label|tooltip]
if (lookaheadMatch[8]) {
var parts=lookaheadMatch[8].trim().slice(1,-1).split("|");
openedtext=parts.shift();
if (parts.length) openedtip=parts.join("|");
else openedtip="hide "+openedtext;
}
var title=show=='block'?openedtext:closedtext;
var tooltip=show=='block'?openedtip:closedtip;
// create the button
if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link
var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;
var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);
btn.onclick=onClickNestedSlider;
btn.setAttribute("href","javascript:;");
btn.setAttribute("title",tooltip);
}
else
var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);
btn.innerHTML=title; // enables use of HTML entities in label
// set extra button attributes
btn.setAttribute("closedtext",closedtext);
btn.setAttribute("closedtip",closedtip);
btn.setAttribute("openedtext",openedtext);
btn.setAttribute("openedtip",openedtip);
btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)
btn.keyparam=key; // save the access key letter ("" if none)
if (key.length) {
btn.setAttribute("accessKey",key); // init access key
btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
}
btn.onmouseover=function(event) // mouseover on button aligns floater position with button
{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel,this.sliderPanel.className); }
// create slider panel
var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";
var panelID=lookaheadMatch[9]; if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
panel.button = btn; // so the slider panel know which button it belongs to
btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):"";
panel.setAttribute("transient",lookaheadMatch[5]=="*"?"true":"false");
panel.style.display = show;
panel.style.width=panel.defaultPanelWidth;
panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this,this.className); }
// render slider (or defer until shown)
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
if ((show=="block")||!lookaheadMatch[11]) {
// render now if panel is supposed to be shown or NOT deferred rendering
w.subWikify(lookaheadMatch[10]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
// align floater position with button
if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel,panelClass);
}
else {
var src = w.source.substr(w.nextMatch);
var endpos=findMatchingDelimiter(src,"+++","===");
panel.setAttribute("raw",src.substr(0,endpos));
panel.setAttribute("blockquote",lookaheadMatch[10]?"true":"false");
panel.setAttribute("rendered","false");
w.nextMatch += endpos+3;
if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\n\n"+panel.getAttribute("raw"));
}
}
}
}
)
// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
var startpos = 0;
var endpos = src.indexOf(endtext);
// check for nested delimiters
while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
// count number of nested 'starts'
var startcount=0;
var temp = src.substring(startpos,endpos-1);
var pos=temp.indexOf(starttext);
while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
// set up to check for additional 'starts' after adjusting endpos
startpos=endpos+endtext.length;
// find endpos for corresponding number of matching 'ends'
while (startcount && endpos!=-1) {
endpos = src.indexOf(endtext,endpos+endtext.length);
startcount--;
}
}
return (endpos==-1)?src.length:endpos;
}
//}}}
//{{{
window.onClickNestedSlider=function(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var theLabel = theTarget.firstChild.data;
var theSlider = theTarget.sliderPanel
var isOpen = theSlider.style.display!="none";
// toggle label
theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
// toggle tooltip
theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));
// deferred rendering (if needed)
if (theSlider.getAttribute("rendered")=="false") {
if (config.options.chkDebugLazySliderRender)
alert("rendering '"+theLabel+"':\n\n"+theSlider.getAttribute("raw"));
var place=theSlider;
if (theSlider.getAttribute("blockquote")=="true")
place=createTiddlyElement(place,"blockquote");
wikify(theSlider.getAttribute("raw"),place);
theSlider.setAttribute("rendered","true");
}
// show/hide the slider
if(config.options.chkAnimate && (theSlider.className!='floatingPanel' || config.options.chkFloatingSlidersAnimate))
anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
else
theSlider.style.display = isOpen ? "none" : "block";
// reset to default width (might have been changed via plugin code)
theSlider.style.width=theSlider.defaultPanelWidth;
// align floater panel position with target button
if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
// if showing panel, set focus to first 'focus-able' element in panel
if (theSlider.style.display!="none") {
var ctrls=theSlider.getElementsByTagName("*");
for (var c=0; c<ctrls.length; c++) {
var t=ctrls[c].tagName.toLowerCase();
if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
{ ctrls[c].focus(); break; }
}
}
var cookie=theTarget.sliderCookie;
if (cookie && cookie.length) {
config.options[cookie]=!isOpen;
if (config.options[cookie]!=theTarget.defOpen)
saveOptionCookie(cookie);
else { // remove cookie if slider is in default display state
var ex=new Date(); ex.setTime(ex.getTime()-1000);
document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
}
}
return false;
}
//}}}
//{{{
// click in document background closes transient panels
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);
// call original click handler
if (document.nestedSliders_savedOnClick)
var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
// if click was inside transient panel (or something contained by a transient panel)... leave it alone
var p=target;
while (p)
if ((p.className=="floatingPanel"||p.className=="sliderPanel")&&p.getAttribute("transient")=="true") break;
else p=p.parentNode;
if (p) return retval;
// otherwise, find and close all transient panels...
var all=document.all?document.all:document.getElementsByTagName("DIV");
for (var i=0; i<all.length; i++) {
// if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
// otherwise, if the panel is currently visible, close it by clicking it's button
if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button})
}
return retval;
};
//}}}
//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
if (panelClass=="floatingPanel") {
var left=0;
var top=btn.offsetHeight;
if (place.style.position!="relative") {
var left=findPosX(btn);
var top=findPosY(btn)+btn.offsetHeight;
var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;
if (p) { left-=findPosX(p); top-=findPosY(p); }
}
if (findPosX(btn)+panel.offsetWidth > getWindowWidth()) // adjust position to stay inside right window edge
left-=findPosX(btn)+panel.offsetWidth-getWindowWidth()+15; // add extra 15px 'fudge factor'
panel.style.left=left+"px"; panel.style.top=top+"px";
}
}
function getWindowWidth() {
if(document.width!=undefined)
return document.width; // moz (FF)
if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
return document.documentElement.clientWidth; // IE6
if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )
return document.body.clientWidth; // IE4
if(window.innerWidth!=undefined)
return window.innerWidth; // IE - general
return 0; // unknown
}
//}}}
//{{{
// TW2.1 and earlier:
// hijack Slider animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
// TW2.2+
// hijack Morpher animation handler 'stop' handler so overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
Morpher.prototype.coreStop = Morpher.prototype.stop;
Morpher.prototype.stop = function()
{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
}
//}}}
![[Course request|CourseRequestForm]]
[[Workshop for faculty teaching high enrollment courses|SummerWorkshop]]
!New Stuff
<<tag gradebook>>
<<tag grading>>
* [[Podcasts, iTunes and Moodle]]
* [[What's new in Moodle 2.0|Martin Dougiamas talk with NITLE]]
+++!!![Newish]
[[Effective Powerpoint Presentations]]
[[Change colour of title]]
[[Advanced assignment activity]]
[[Comic Life]]
[[PPT printing Mac|Powerpoint printing for Mac]]
[[Multiple class sections|Multiple Class Sections : Groups]]
===
The best technique is to post an announcement in the News Forum after you have uploaded a new resource or added a new assignment or done something new with the Moodle course.
This posting gets emailed to all the class so they have no excuse for not seeing it. The messages are also saved in one place making it easy to keep track of what you have told the students.
!Description
A vertical TiddlyWiki for publishing.
!Features
Version 1.2.0
*mode management
**<<changeMode Reader>>: browse and navigate into the content in readOnly mode and SinglePageMode .
**<<changeMode Author>>: for managing content (tiddlers, tags and perhaps Menus) and publishing (Save to web) the TiddlyWiki.
**<<changeMode>>: is the default mode when start:safe or plugin errors. This mode has the basic TiddlyWiki presentation and behaviour.
*SinglePageMode and ReadOnly for Reader
*StyleSheet reader oriented
*All [[admin]] stuff masked to reader and author
*Tweaks to ease navigation :
**an admin tag for all admin stuff
**Triangle added to tag button to indicate popup
**new lists ('timeline' 'all' 'tags') without tiddlers or tags tagged 'admin'
**[[systemList]]
**[[systemTool]]
**Latest [[News]]
*AutoWeave in Author mode
*Localizable
**See NewsWikiFR
!Components
all tagged NewsWiki :
*ChangeModePlugin
*SinglePageModePlugin
*NewsWikiTweaks
*IsDirtyPlugin
*SinglePageModePlugin
*CalendarPlugin
*AutoWeavePluginPatched
*''[[admin]] tag'' : has the special meanning to hide to Reader and Author
*''[[systemList]]'' : List all tiddlers tagged with it
*''[[systemTool]]'' : in tiddler view, hide subtitle (modifier, created, modified)
*''<mode><tiddler>'' (like AuthorStyleSheet, ReaderStyleSheet, StyleSheet ...)
!Sources
*Sample :
**http://TiddlyHome.bidix.info/
**http://TiddlyHomeFR.bidix.info/
*Empty :
**http://TiddlyHome.bidix.info/systemServer/NewsWiki
**http://TiddlyHome.bidix.info/systemServer/NewsWikiFR
!toDo
*--[[toRelease]]--
*--French version--
*--In French Version, [[locale.fr-FR]] is loaded after NewsWikiTweaks. NewsWikiTweaksFR should require local.fr-FR--
!History
!!2007/06/05
*Version 1.0.0
!!2007/07/28
*Version 1.2.0
|URL:|http://tiddlyhome.bidix.info/systemServer/NewsWiki.html|
|Description|Repository for NewsWiki system ressources |
|Author:|BidiX|
/***
|''Name:''|NewsWikiTweaks|
|''Description:''|Some tweaks for NewsWiki|
|''Version:''|0.0.1|
|''Date:''|Jun 11, 2007|
|''Source:''|http://TiddlyWiki.bidix.info/#NewsWikiTweaks|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
/***
!Options
***/
//{{{
//Options
config.options.chkAnimate = false;
config.options.txtRssTag = 'toRSS';
//}}}
/***
!tag
***/
//{{{
merge(config.views.wikified.tag,{
labelNoTags: "",
labelTags: ""});
/*
merge(config.macros.tagging,{
label: "",
labelNotTag: "",
tooltip: ""});
*/
createTagButton = function(place,tag,excludeTiddler)
{
var triangle = " "+glyph("downTriangle");
var theTag = createTiddlyButton(place,tag+triangle,config.views.wikified.tag.tooltip.format([tag]),onClickTag);
theTag.setAttribute("tag",tag);
if(excludeTiddler)
theTag.setAttribute("tiddler",excludeTiddler);
return theTag;
}
onClickTag = function(e)
{
if(!e) var e = window.event;
var theTarget = resolveTarget(e);
var popup = Popup.create(this);
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
if(popup && tag) {
var tagged = store.getTaggedTiddlers(tag);
var titles = [];
var li,r;
for(r=0;r<tagged.length;r++) {
if(tagged[r].title != title)
titles.push(tagged[r].title);
}
var lingo = config.views.wikified.tag;
if(titles.length > 0) {
// var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);
// openAll.setAttribute("tag",tag);
// createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
for(r=0; r<titles.length; r++) {
createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);
}
} else {
createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));
}
createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
if (!config.options.chkSinglePageMode) {
var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);
openAll.setAttribute("tag",tag);
}
// createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);
createTiddlyText(h,lingo.openTag.format([tag]));
}
Popup.show();
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.tagChooser.onClick = function(e)
{
if(!e) var e = window.event;
var lingo = config.views.editor.tagChooser;
var popup = Popup.create(this);
var tags = store.getTags("[[admin]]");
if(tags.length == 0)
createTiddlyText(createTiddlyElement(popup,"li"),lingo.popupNone);
for(var t=0; t<tags.length; t++) {
var theTag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
theTag.setAttribute("tag",tags[t][0]);
theTag.setAttribute("tiddler",this.getAttribute("tiddler"));
}
Popup.show();
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
};
//}}}
/***
!tabs
***/
//{{{
config.macros.list.user= {};
config.macros.list.user.handler = function(params)
{
return store.reverseLookup("tags","admin",false,"title");
};
config.macros.userTimeline = {};
config.macros.userTimeline.handler = function(place,macroName,params)
{
var field = params[0] ? params[0] : "modified";
var tiddlers = store.reverseLookup("tags","admin",false,field);
var lastDay = "";
var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1])) : 0;
for(var t=tiddlers.length-1; t>=last; t--) {
var tiddler = tiddlers[t];
var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
if(theDay != lastDay) {
var theDateList = document.createElement("ul");
place.appendChild(theDateList);
createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(config.macros.timeline.dateFormat));
lastDay = theDay;
}
var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink");
theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
}
};
//}}}
/***
!Shadow tiddlers
***/
//{{{
config.shadowTiddlers.GettingStarted =
"To get started with this blank NewsWiki, you'll need to change mode to <<changeMode Author>> or <<changeMode>>\n\n" +
config.shadowTiddlers.GettingStarted;
//}}}
/***
!others
***/
//{{{
config.macros.version.handler = function(place)
{
createTiddlyElement(place,"span",null,null,version.major + "." + version.minor + "." + version.revision + (version.beta ? " (beta " + version.beta + ")" : "") + (version.build ? " (build #" + version.build + ")" : ""));
};
//}}}
!!How Notes work -- what they're for
!!Using Notes to track course happenings
!!Using Notes for midterm reports
!!!Deficiencies
As yet, no reporting features. Cannot aggregate all notes for a class, etc.
Last Updated: 28-Apr-09
Mark H Pearson
Commissariat для Верховного Совета академичного Moodlers
Commissariat for Supreme Soviet of Academic Moodlers
<html><!--Creative Commons License--><a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/"><img alt="Creative Commons License" style="border-width: 0" src="http://creativecommons.org/images/public/somerights20.png"/></a><br/>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/">Creative Commons Attribution-ShareAlike 2.5 License</a>.<!--/Creative Commons License--><!-- <rdf:RDF xmlns="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<Work rdf:about="">
<license rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/" />
<dc:type rdf:resource="http://purl.org/dc/dcmitype/Text" />
</Work>
<License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/"><permits rdf:resource="http://web.resource.org/cc/Reproduction"/><permits rdf:resource="http://web.resource.org/cc/Distribution"/><requires rdf:resource="http://web.resource.org/cc/Notice"/><requires rdf:resource="http://web.resource.org/cc/Attribution"/><permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/><requires rdf:resource="http://web.resource.org/cc/ShareAlike"/></License></rdf:RDF> -->
</html>
These InterfaceOptions for customising TiddlyWiki are saved in your browser
Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)
<<option txtUserName>>
Password: <<option pasUploadPassword>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations
----
Also see
AdvancedOptions
Sometimes a pdf resource will not display in Firefox (may occur when using a PC laptop from home).
To fix this,
* Update the resource,
* scroll down the screen to the 'Window' section and
* click the [[Show Advanced|graphics/resource_show_advanced.png]]<<imagebox>> button
* check [[Keep page navigation visible on the same page|graphics/resource_show_advanced_check.png]]<<imagebox>>
* Save and Display. If the resource does not appear, click the Firefox refresh button to refresh the page
[<img[effectivePPT/slide_popup_menu.png]]
|Slide Layout|how each individual slide gets treated|
|Slide Design|built-in templates for easy use|
|Slide Design -- Color Schemes|simple color schemes to build your own template|
|Slide Design -- Animation Schemes|animate slide elements and transitions in a consistent way|
|Custom Animation|bounce the text in if you really want to|
|Slide Transition|move to the next slide in a transitiony way|
!Legibility
* # bullets per slide - max 6
* # lines in title – max 2
* # lines per bullet – max 2
! Text style
* Newspaper headlines
* Little text per bullet
* Readable fonts
* Complementary and contrasting colours
* Use SLIDE MASTER for uniformity
!Visual Clarity
* Titles : 36 point font
* # fonts – max 2
* Body text : 24 point
* Use Sans Serif fonts
<!--{{{-->
<!--<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
-->
<div id='header' class='header'>
<div id='topMenu' refresh='content' tiddler='TopMenu'></div>
<div id='title'>
<div class='siteTitle' refresh='content' tiddler='SiteTitle'></div>
<div class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></div>
</div>
</div>
<div id='mainMenu'>
<span refresh='content' tiddler='ReaderMainMenu'></span>
<span id='noticeBoard' refresh='content' tiddler='NoticeBoard'></span>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
Pedagogic advantages of Moodle:
* Scaffold for course content -- research has shown that 'chunking' content aids in uptake and retention. The Course Outline format lets you slice and dice your course into weekly chuks or arbitrary Topics.
* Course content linked with activities. Linking subject matter together with work that the student does (either online or offline) drives home the point you're trying to make.
* Peer mediated activities are acknowledged to be powerfully pedagogical. Moodle has a unique combination of discussion Forum, Wiki , and Workshop activities all of which are customizable to suit the teaching situation.
* you can add to your course as you go along.
!!Part 1 - subscribing to a podcast with iTunes
<<divbox 'Subscribe to podcast with iTunes' iTunesDiv 'flash screencast' 964 544>>
<html><div id="iTunesDiv" style="display:none;">
<object width="960" height="540">
<param name="movie" value="http://www.earlham.edu/markp/moodledocs/graphics/podcast_iTunes.swf''></param><param name="wmode" value="transparent"></param><embed src="http://www.earlham.edu/markp/moodledocs/graphics/podcast_iTunes.swf" type="application/x-shockwave-flash" wmode="transparent" width="960" height="540"></embed>
</object>
</div>
</html>
!!Part 2 -- Podcast into Moodle course
<<divbox 'get Podcast audio into Moodle course' podmooDiv 'wait for screencast to load' 964 544>>
<html><div id="podmooDiv" style="display:none;">
<object width="960" height="540">
<param name="movie" value="http://www.earlham.edu/markp/moodledocs/graphics/podcast_into_moodle.swf''></param><param name="wmode" value="transparent"></param><embed src="http://www.earlham.edu/markp/moodledocs/graphics/podcast_into_moodle.swf" type="application/x-shockwave-flash" wmode="transparent" width="960" height="540"></embed>
</object>
</div>
</html>
!!Distributing Powerpoints to students via Moodle
The issue here is how to give students a presentation which opens quickly and prints out well on non-color laser printers. The solution is to print multiple slides and save as PDF.
Here's how:
!!!1. File -> Page Setup
* Make sure that the slides are rotated to landscape as shown:
>[img[graphics/ppt_mac_pagesetup.png]]
* Change header and footer as desired. You can also add page numbers.
!!!2. File -> Print
pulldown ''Print what'':
* Slides -- individual slides 1 / page
* Handouts -- slides grouped in numbers per page
* Notes -- single slide per page with user notes underneath
* Outline -- basically a print of what you see in the Outline. Useful for text only presentations.
Output: //Grayscale// for printing to monochromatic laser printers
[img[graphics/ppt_mac_print.png]]
!!!3. Print to PDF
* Pull down ''PDF'' and print to file. Remember to ''add .pdf extension''
* upload this file into Moodle as the Resource that students can print out.
[[Example|http://www.earlham.edu/markp/moodledocs/sundry/PowerPoint sample for Mark.pdf]] of how 4 slides can be displayed on a single page.
!!Problem: I click on a word file resource and nothing appears.
You are using the Internet Explorer browser with Windows XP. IE's popup blocking will prevent a Word or Powerpoint display. A carefully concealed "[[Information bar|graphics/Moodle_word_IE6_XP2_80.png]]<<imagebox>> " tucks itself away near the top of the browser.
!!Fix :
Even though the 'click here for options' doesn't look like a pulldown menu or link you should pull down the menu & choose Download file. Then you'll see [[this dialog box|graphics/Moodle_IE_screen_popup_300.png]]<<imagebox>>
You'll then be asked whether you want to open or save the file. Choosing 'open' reveals the file within the browser and does ''not'' open MS Word (as you might have expected).
!! Longterm Fix:
Use the Firefox browser. Opening a Word document with FireFox behaves more like you would expect, with a [[dialog box|graphics/Moodle_word_FF_XP2_80.png]]<<imagebox>> asking you to Open or Save.
In this situation 'Open' ''will'' open the file in the MS Word application and 'Save to disk' will save the file to the download folder you set in Tools -> Options.
----
21 Sept 2006
Long filenames can screw up Moodle in several different ways particularly with backup and restore. [[Here's an example|http://www.earlham.edu/markp/ITI_wiki/index.html#%5B%5BLong filename culprits%5D%5D]] of how long files screwed up Ezjail archive.
Here's how they can be generated without realising:
* the filename causing problems: {{{hoqueya_marked_STEP_6_Senior_research_paper_due_TUESDAY_at-7-00_am-_do_not_be_late_Final_Paper_-_Yazdan_edited.doc}}} [[screenshot|graphics/long_filename_causing problems2.png]]<<imagebox>>. This is a teacher's //response// file to a submitted assignment
* filename of submitted assignment from student : {{{Final_Paper_-_Yazdan_edited.doc}}}
* title of the original assignment : {{{STEP 6 Senior research paper due TUESDAY at-7:00 am- do not be late}}}
* the assignments were downloaded with the ZIP function which adds the student's username to the front of the assignment title. The resulting filename is thus a concatenation of : {{{<username><"marked"><assignment name><submitted filename>}}}
;Solution :
: Use short names for the assignment. In this case "Senior research paper" would have been fine.
In other cases such as {{{The_Gift_of_Knowledge-_A_layman_s_look_at_similarities_between_Greek_Mythology_and_Judeo-Christian_religious_texts.doc}}} a student has uploaded this long filename.
;Solution:
: Tell students to use short filenames!
Background: #fff
Foreground: #333
PrimaryPale: #FFBFBF
PrimaryLight: #BF2323
PrimaryMid: #BF2323
PrimaryDark: #660000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #ff0000
<<viewPalette>>
<<search>>
<<tiddler [[New]]>>
!!Starting up
[[Moodle : Benefits]]
+++[Getting started]
<<tag intro>>
===
!!Management
[[Example courses|Course screen-shots]]
!!Teaching
* <<tag outline>>
* <<tag best_practices>>
* <<tag assignment>>
* <<tag resource>>
* <<tag training>>
!!FAQ
[[Moodle|Moodle FAQ]]
[[Glossary]]
[[del.icio.us|del.icio.us FAQ]]
<<calendar thismonth>>
----
<<changeMode Author>>
<<changeMode>>
----
<!--{{{-->
<div id='page'>
<div id='header' class='header'>
<div id='topMenu' refresh='content' tiddler='TopMenu'></div>
<div id='title'>
<div class='siteTitle' refresh='content' tiddler='SiteTitle'></div>
<div class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></div>
</div>
</div>
<div id='sidebar'>
<div id='sidebarOptions'>
<span refresh='content' tiddler='ReaderMainMenu'></span>
<span id='noticeBoard' refresh='content' tiddler='NoticeBoard'></span>
</div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
</div>
<!--}}}-->
[[CommunStyleSheet]]
/***
!!page
***/
/*{{{*/
#page {
border-left: 1px solid [[ColorPalette::TertiaryLight]];
padding: 0 30px 0 30px;
margin-left: auto;
margin-right: auto;
margin-top: 0px;
width: 65em;
position: relative;
text-align: left;
background-color: [[ColorPalette::Background]];
color: [[ColorPalette::Foreground]];
font-family: Verdana,Helvetica, Arial, sans-serif;
}
#page h* {
font-family: Helvetica, Arial, sans-serif;
}
/*}}}*/
<!--{{{-->
<div class='title'>
<span class='title' macro='view title'></span>
<!--<span macro="miniTag">--></span>
</div>
</div>
<div macro="hideWhenTaggedAny systemTool systemList">
<div class='tagged' macro='tags'></div>
<div class='tagClear'></div>
<span class = "subtitle">
<span macro='view created date [[0DD/0MM/YYYY]]'></span> -
<span macro='view modifier'></span>
</span>
</div>
<div class='viewer' macro='view text wikified'></div>
<div macro="showWhenTagged systemList">
<div class='viewer' macro="listByTag '' created ''"></div>
</div>
<!--}}}-->
!!Recording voice audio with Audacity
Instructions appropriate to version 1.26 of Audacity. +++[Note:]
@@Currently@@ Mac versions of Audacity in the Labs do ''not'' export to ~MP3. Use a PC instead.
===
;You will need
:a USB headset with headphones and noise canceling microphone. The built in microphone on Mac and PC laptops really doesn't cut the mustard. There are Logitech headsets available from the Library Circulation desk and ITAM desk. You will need your student ID to borrow one of these.
# Assuming that you have already logged on to the PC, plug the headset into the front USB port. Wait for the PC to register it.
# Start up Audacity from the bottom Quick Launch bar
# Press @@record@@ button to record audio and speak your text slowly and clearly. If things are working properly a new track box will be created and you'll see the wave form of your voice. If not, take a look at Troubleshooting. +++[Audio Control buttons]
<html>
<h2>Audio Control Buttons</h2>
<table border="0" cellpadding="4" cellspacing="0" rules="none">
<tr>
<td width="48"><img src="http://audacity.sourceforge.net/onlinehelp-1.2/images/button_skipstart.png" width="48" height="48"></td>
<td>Skip to Start - moves the cursor to time 0. If you press Play
at this point, you project will play from the beginning.
</td></tr>
<tr>
<td><img src="http://audacity.sourceforge.net/onlinehelp-1.2/images/button_play.png" width="48" height="48"></td>
<td>Play - starts playing audio at the cursor position. If some audio
is selected, only the selection is played.
</td></tr>
<tr>
<td><img src="http://audacity.sourceforge.net/onlinehelp-1.2/images/button_loop.png" width="48" height="48"></td>
<td>Loop - if you hold down the Shift key, the Play button changes to
a Loop button, which lets you keep playing the selection over and
over again.
</td></tr>
<tr>
<td><img src="http://audacity.sourceforge.net/onlinehelp-1.2/images/button_record.png" width="48" height="48"></td>
<td>Record - starts recording audio at the project sample rate
(the sample rate in the lower-left corner of the window).
The new track will begin at the current cursor position, so
click the "Skip to Start" button first if you want the track to
begin at time 0.
</td></tr>
<tr>
<td><img src="http://audacity.sourceforge.net/onlinehelp-1.2/images/button_pause.png" width="48" height="48"></td>
<td>Pause - temporarily stops playback or recording until you
press pause again.
</td></tr>
<tr>
<td><img src="http://audacity.sourceforge.net/onlinehelp-1.2/images/button_stop.png" width="48" height="48"></td>
<td>Stop - stops recording or playing. You must do this before
applying <a href="#menu_effect">effects</a>, saving or exporting.
</td></tr>
<tr>
<td><img src="http://audacity.sourceforge.net/onlinehelp-1.2/images/button_skipend.png" width="48" height="48"></td>
<td>Skip to End - moves the cursor to the end of the last track.
</td></tr>
</table>
</html>
===
** If you need to stop the recording momentarily press @@pause@@
** when you have finished press @@stop@@
** press @@play@@ to play back what you have recorded.
# I made a mistake. ''HELP!'' The best way to fix mistakes is to delete the track (click the close box) and repeat the recording until there are no mistakes. If you really need to edit the track just highlight 'ums' 'errs' and pauses and delete [[screenshot|graphics/audacity_edit.png]]<<imagebox>>
# Saving. You want to ''export'' to ~MP3.
** Select File -> Export to ~MP3.
** Filename : //pronunciation.mp3// [Save to My Documents using the name of the current assignment]
** @@[[Fill in ~ID3 tags|graphics/audacity_id3tags.png]]<<imagebox>>@@. This is how Yasumi keeps track of your recordings in iTunes.
*** Title : enter the title of the moodle assignment, eg //pronunciation check//
*** Artist : your full name
*** Album : due date in this format : Jan-19-2009
*** OK to save.
# Quit Audacity with File -> Exit. Do ''not'' save changes.
+++!![Troubleshooting]
!!!No audio gets recorded.
;Problem:
:I press the Record button but there's no sound recorded.
Solution:
* Select File -> Preferences.
* Select Playback device : USB headset
* Select Recording device : USB headset
* ''Restart'' Audacity
!!!Still no audio getting recorded
;Problem:
: //Mute// button may be switched on by default
Your headset has a ''mute'' button on the control blob which may be switched on (ie red). Press the mute button to switch it off and try recording again.
===
Resources are things that students read either online or print out.
* Web Sites. It's quite easy to link to a web site directly within the Outline or a Web page resource. However, the problem with this is that the destination site replaces the Moodle page and students get taken away from the course. Instead, it's better practice to make all major web references into resources -- that way they'll also get listed in the Resources list. You can take the opportunity to give a brief description of the site (as much for your own benefit as the students) and also model how you want students to cite web urls in their own papers.
* Convert MS Office files (Word, Powerpoint, Excel) into Acrobat format. Advantages:
** Read only. Students cannot easily copy the contents of what you have written (a Word document makes it easy to copy the text)
** Not every student has MS Office on their personal machine. MS Office is rather expensive and many students just don't have it installed (or if they do, it may be a bootlegged copy). Acrobat on the other hand is a free download from [[Adobe|http://adobe.com]].
** File size is generally smaller, epecially with Powerpoint.
** Fewer problems with Internet Exploder [[blocking popups|Problem displaying Word files]]
* Do fill in the Summary field. Suggestions include:
** What's in the file or URL? The resource title may not indicate the contents very adequately.
** Is the URL pointing to a single page of interest or a whole site?
** For uploaded files some information about the file is useful, eg number pages, file size in Mb (gives an idea of download time), and format (eg Acrobat, Web URL, etc).
** Provide a citation to model how you want students to cite the resource in a paper.
# Use Photoshop Elements to scan photos, pictures or other graphics that you want as individual files.
# Use Adobe Acrobat to scan books, Journals, or other printed material. [''Don't'' scan photocopies -- scan the original]
!!Acrobat -- crucial settings
* ''don't'' use the Auto mode : click on 'Cancel' and use Manual mode (the exact prompt will depend upon whether you're using Epson or Canon scanner). Using Auto mode will result in a full color, 300 dpi scan of a complete page weighing in at 15Mb!
* Set Image Type to "Black and White document" or "Grayscale"
* Set resolution to 150 dpi
* Draw crop box around text you want to scan -- don't just scan the whole page
* Add pages until Done
* Use Document -> Rotate pages to turn pages around
* click on Pages tab (on left side) to reveal thumbnail pages and drag & drop to put pages in different order.
!!Photoshop Elements -- crucial settings
* Set image type to color photo
* Set resolution to 96 dpi -- you're only wanting to display on a screen, right?
* Crop crop crop! Be ruthless in cropping away uneeded parts.
* Try Enhance -> Auto Fix to apply quick fix es to your photo. If the result does not look good, merely select Edit -> Undo.
* Use File -> Save to Web to save and adjust the image dimensions. 400 pixels is the largest width you'd want to display on a Moodle page. Save to JPG medium quality.
[[Full gory details|http://www.earlham.edu/~markp/cms/user_guides/acrobat/scanning.php]] of how to scan into Acrobat complete with colourful illustrations.
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Version|2.6.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Description|extend core search function with additional user-configurable options|
The 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.
!!!!!Usage
<<<
This 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.
<<<
!!!!!Configuration
<<<
In additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:
<<option chkSearchTitles>> Search in titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tags
<<option chkSearchFields>> Search in data fields
<<option chkSearchShadows>> Search shadow tiddlers
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by date
<<option chkSearchList>> Show list of matches in [[SearchResults]]
<<option chkSearchIncremental>> Incremental searching
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for SearchOptionsPlugin handling^^
When 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.
<<<
!!!!!Revision History
<<<
''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
''2007.02.13 [2.6.0]'' remove redefinition of config.macros.search.handler since core now includes handling for ENTER key.
''2007.02.08 [2.5.1]'' include 'temporary' tag when creating SearchResults (for use with TemporaryTiddlersPlugin)
''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
''2006.10.10 [2.4.0]'' added support for "search in tiddler data" (tiddler.fields) Default is to search extended data.
''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.
''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.
''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)
''2006.02.01 [2.1.9]'' in Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching
also, 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.
''2006.02.01 [2.1.8]'' in doSearch(), added alert/return if search text is blank
''2006.01.20 [2.1.7]'' fixed setting of config.macros.search.reportTitle so that Tweaks can override it.
''2006.01.19 [2.1.6]'' improved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)
define results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title
''2006.01.18 [2.1.5]'' Created separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.
''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.
''2006.01.15 [2.1.3]'' Added information (date/time, username, search options used) to SearchResults output
''2006.01.10 [2.1.2]'' use displayTiddlers() to render matched tiddlers. This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.
''2006.01.08 [2.1.1]'' corrected invalid variable reference, "txt.value" to "text" in story.search()
''2006.01.08 [2.1.0]'' re-write to match new store.search(), store.search.handler() and story.search() functions.
''2005.12.30 [2.0.0]'' Upgraded to TW2.0
when rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.
''2005.12.26 [1.4.0]'' added option to search for matching text in tiddler tags
''2005.12.21 [1.3.7]'' use \\ to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link. Also, added access key: "O", to trigger "open all" link.
Based on a suggestion by UdoBorkowski.
''2005.12.18 [1.3.6]'' call displayMessage() AFTER showing matching tiddlers so message is not cleared too soon
''2005.12.17 [1.3.5]'' if no matches found, just display message and delete any existing SearchResults tiddler.
''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
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.3]'' tag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches
Based on a suggestion by UdoBorkowski.
''2005.12.14 [1.3.2]'' added "open all matching tiddlers..." link to search results output.
Based on a suggestion by UdoBorkowski.
''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.
''2005.12.01 [1.3.0]'' added chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).
added handling for Enter key so it can be used to start a search.
Based on a suggestion by LyallPearce
''2005.11.25 [1.2.1]'' renamed from SearchTitleOrTextPlugin to SearchOptionsPlugin
''2005.11.25 [1.2.0]'' added chkSearchList option
Based on a suggestion by RodneyGomes
''2005.10.19 [1.1.0]'' added chkSearchTitlesFirst option.
Based on a suggestion by ChristianHauck
''2005.10.18 [1.0.0]'' Initial Release
Based on a suggestion by LyallPearce.
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
<<<
!!!!!Code
***/
//{{{
version.extensions.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};
//}}}
//{{{
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields==undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=false;
if (config.options.chkSearchByDate==undefined) config.options.chkSearchByDate=false;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;
if (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;
if (config.optionsDesc) {
config.optionsDesc.chkSearchTitles="Search in tiddler titles";
config.optionsDesc.chkSearchText="Search in tiddler text";
config.optionsDesc.chkSearchTags="Search in tiddler tags";
config.optionsDesc.chkSearchFields="Search in tiddler data fields";
config.optionsDesc.chkSearchShadows="Search in shadow tiddlers";
config.optionsDesc.chkSearchTitlesFirst="Search results show title matches first";
config.optionsDesc.chkSearchList="Search results show list of matching tiddlers";
config.optionsDesc.chkSearchByDate="Search results sorted by modification date ";
config.optionsDesc.chkSearchIncremental="Incremental searching";
} else {
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchText>> Search in tiddler text";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTags>> Search in tiddler tags";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchFields>> Search in tiddler data fields";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchShadows>> Search in shadow tiddlers";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitlesFirst>> Search results show title matches first";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchList>> Search results show list of matching tiddlers";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchByDate>> Search results sorted by modification date ";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchIncremental>> Incremental searching";
}
if (config.macros.search.reportTitle==undefined) config.macros.search.reportTitle="SearchResults";
//}}}
//{{{
config.macros.search.onKeyPress = function(e)
{
if(!e) var e = window.event;
switch(e.keyCode)
{
case 13: // Ctrl-Enter
case 10: // Ctrl-Enter on IE PC
config.macros.search.doSearch(this);
break;
case 27: // Escape
this.value = "";
clearMessage();
break;
}
if (config.options.chkSearchIncremental) {
if(this.value.length > 2)
{
if(this.value != this.getAttribute("lastSearchText"))
{
if(config.macros.search.timeout)
clearTimeout(config.macros.search.timeout);
var txt = this;
config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
}
}
else
{
if(config.macros.search.timeout)
clearTimeout(config.macros.search.timeout);
}
}
}
//}}}
//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");
if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first
var q = useRegExp ? "/" : "'";
clearMessage();
if (!matches.length) {
if (config.options.chkSearchList) discardSearchResults();
displayMessage(config.macros.search.failureMsg.format([q+text+q]));
} else {
if (config.options.chkSearchList)
reportSearchResults(text,matches);
else {
var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
this.closeAllTiddlers(); story.displayTiddlers(null,titles);
displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
}
}
highlightHack = null;
}
//}}}
//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
var candidates = this.reverseLookup("tags",excludeTag,false,sortField);
// scan for matching titles first...
var results = [];
if (config.options.chkSearchTitles) {
for(var t=0; t<candidates.length; t++)
if(candidates[t].title.search(searchRegExp)!=-1)
results.push(candidates[t]);
if (config.options.chkSearchShadows)
for (var t in config.shadowTiddlers)
if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
}
// then scan for matching text, tags, or field data
for(var t=0; t<candidates.length; t++) {
if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)
results.pushUnique(candidates[t]);
if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)
results.pushUnique(candidates[t]);
if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above
store.forEachField(candidates[t],
function(tid,field,val) { if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]); },
true); // extended fields only
}
// then check for matching text in shadows
if (config.options.chkSearchShadows)
for (var t in config.shadowTiddlers)
if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));
// if not 'titles first', or sorting by modification date, re-sort results to so titles, text, tag and field matches are mixed together
if(!sortField) sortField = "title";
var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }
if (!config.options.chkSearchTitlesFirst || config.options.chkSearchByDate) results.sort(bySortField);
return results;
}
//}}}
// // ''REPORT GENERATOR''
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
var title=config.macros.search.reportTitle
var q = config.options.chkRegExpSearch ? "/" : "'";
var body="\n";
// summary: nn tiddlers found matching '...', options used
body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
body+="^^//searched in:// ";
body+=(config.options.chkSearchTitles?"''titles'' ":"");
body+=(config.options.chkSearchText?"''text'' ":"");
body+=(config.options.chkSearchTags?"''tags'' ":"");
body+=(config.options.chkSearchFields?"''fields'' ":"");
body+=(config.options.chkSearchShadows?"''shadows'' ":"");
if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
body+=" //with options:// ";
body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
}
body+="^^";
// numbered list of links to matching tiddlers
body+="\n<<<";
for(var t=0;t<matches.length;t++) {
var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
body+="\n# "+date+"[["+matches[t].title+"]]";
}
body+="\n<<<\n";
// open all matches button
body+="<html><input type=\"button\" href=\"javascript:;\" ";
body+="onclick=\"story.displayTiddlers(null,["
for(var t=0;t<matches.length;t++)
body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
body+="],1);\" ";
body+="accesskey=\"O\" ";
body+="value=\"open all matching tiddlers\"></html> ";
// discard search results button
body+="<html><input type=\"button\" href=\"javascript:;\" ";
body+="onclick=\"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\" ";
body+="value=\"discard "+title+"\"></html>";
// search again
body+="\n\n----\n";
body+="<<search \""+text+"\">>\n";
body+="<<option chkSearchTitles>>titles ";
body+="<<option chkSearchText>>text ";
body+="<<option chkSearchTags>>tags";
body+="<<option chkSearchFields>>fields";
body+="<<option chkSearchShadows>>shadows";
body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
body+="<<option chkRegExpSearch>>text patterns";
body+="<<option chkSearchByDate>>sort by date";
// create/update the tiddler
var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");
store.addTiddler(tiddler); story.closeTiddler(title);
// use alternate "search again" label in <<search>> macro
var oldprompt=config.macros.search.label;
config.macros.search.label="search again";
// render/refresh tiddler
story.displayTiddler(null,title,1);
store.notify(title,true);
// restore standard search label
config.macros.search.label=oldprompt;
}
if (!window.discardSearchResults) window.discardSearchResults=function()
{
// remove the tiddler
story.closeTiddler(config.macros.search.reportTitle);
store.deleteTiddler(config.macros.search.reportTitle);
}
//}}}
''7 tiddlers found matching '{{{backup}}}'''
^^//searched in:// ''titles'' ''text'' ''tags'' ''fields'' ^^
<<<
# 2008.12.04 12:08 [[Moodle course form]]
# 2008.12.04 12:07 [[Course Id requirement]]
# 2008.12.04 12:00 [[Enrolment issues]]
# 2008.12.01 11:24 [[Access home volume -- Mac]]
# 2008.11.11 12:30 [[Moodle 2.0 new features]]
# 2008.08.20 17:03 [[OptionsPanel]]
# 2007.05.28 09:08 [[GenerateRssByTagPlugin]]
<<<
<html><input type="button" href="javascript:;" onclick="story.displayTiddlers(null,['Moodle course form', 'Course Id requirement', 'Enrolment issues', 'Access home volume -- Mac', 'Moodle 2.0 new features', 'OptionsPanel', 'GenerateRssByTagPlugin'],1);" accesskey="O" value="open all matching tiddlers"></html> <html><input type="button" href="javascript:;" onclick="story.closeTiddler('SearchResults'); store.deleteTiddler('SearchResults'); store.notify('SearchResults',true);" value="discard SearchResults"></html>
----
<<search "backup">>
<<option chkSearchTitles>>titles <<option chkSearchText>>text <<option chkSearchTags>>tags<<option chkSearchFields>>fields<<option chkSearchShadows>>shadows<<option chkCaseSensitiveSearch>>case-sensitive <<option chkRegExpSearch>>text patterns<<option chkSearchByDate>>sort by date
!!Fall 08 workshop details
|Mon| [[1 Sept|01/09/2008]]|[[Dive into Moodle]]|
|Tues| [[2 Sept|02/09/2008]]|[[Attendance]]|
|Wed| [[3 Sept|03/09/2008]]|[[Dr M's Surgery]]|
|Thurs| [[4 Sept|04/09/2008]]|[[Advanced assignment]] -- upload, bulk download, return|
|Fri| [[5 Sept|05/09/2008]]|[[Forums, Groups & Choice]]|
|Tues| [[9 Sept|09/09/2008]]|[[Feedback]] / [[Notes]]|
!!Location
* After hours Lab in Lilly lobby
!!Time
* 16:00 -- 17:00 or 4 pm -- 5pm
''Bring your portable computer if you can''
<<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<closeAll>><<changeMode Reader>><<changeMode Author>><<changeMode>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Version|2.2.3|
|Author|Eric Shulman - ELS Design Studios|
|[[License]]|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|
|Description|Display tiddlers one at a time with automatic update of URL (permalink). Also, option to always open tiddlers at top of page|
Normally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.
!!!!!Usage
<<<
SinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.
Even when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode, which forces tiddlers to always open at the top of the page instead of being displayed following the tiddler containing the link that was clicked.
<<<
!!!!!Configuration
<<<
When installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior. For convenience, these checkboxes are also included here:
<<option chkSinglePageMode>> Display one tiddler at a time
<<option chkTopOfPageMode>> Always open tiddlers at the top of the page
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''SinglePageModePlugin'' (tagged with <<tag [[systemConfig]]>>)
^^documentation and javascript for SinglePageMode handling^^
When installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior. However, if you have customized your AdvancedOptions, you will need to ''manually add these checkboxes to your customized tiddler.''
<<<
!!!!!Revision History
<<<
''2007.02.06 [2.2.3]'' in Story.prototype.displayTiddler(), use convertUnicodeToUTF8() for correct I18N string handling when creating URL hash string from tiddler title (based on bug report from BidiX)
''2007.01.08 [2.2.2]'' use apply() to invoke hijacked core functions
''2006.07.04 [2.2.1]'' in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.
''2006.06.01 [2.2.0]'' added chkTopOfPageMode (TPM) handling
''2006.02.04 [2.1.1]'' moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals
''2005.12.27 [2.1.0]'' hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers
''2005.12.27 [2.0.0]'' Update for TW2.0
''2005.11.24 [1.1.2]'' When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts
''2005.10.14 [1.1.1]'' permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them
''2005.10.14 [1.1.0]'' added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.
''2005.10.09 [1.0.1]'' combined documentation and code in a single tiddler
''2005.08.15 [1.0.0]'' Initial Release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageMode= {major: 2, minor: 2, revision: 3, date: new Date(2007,2,6)};
if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSinglePageMode>> Display one tiddler at a time";
if (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;
config.shadowTiddlers.AdvancedOptions += "\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page";
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
if (!config.options.chkSinglePageMode)
{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
if (config.lastURL == window.location.hash)
return;
// var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));
var tiddlerName = decodeURI(window.location.hash.substr(1));
tiddlerName=tiddlerName.replace(/\[\[/,"").replace(/\]\]/,""); // strip any [[ ]] bracketing
if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);
}
if (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
{
if (config.options.chkSinglePageMode) {
// window.location.hash = encodeURIComponent(convertUnicodeToUTF8(String.encodeTiddlyLink(title)));
window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
config.lastURL = window.location.hash;
document.title = wikifyPlain("IsDirty") + wikifyPlain("SiteTitle") + " - " + title;
story.closeAllTiddlers();
if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
}
if (config.options.chkTopOfPageMode) { story.closeTiddler(title); window.scrollTo(0,0); srcElement=null; }
this.SPM_coreDisplayTiddler.apply(this,arguments);
}
if (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)
{
// suspend single-page mode when displaying multiple tiddlers
var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;
var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;
this.SPM_coreDisplayTiddlers.apply(this,arguments);
config.options.chkSinglePageMode=saveSPM; config.options.chkTopOfPageMode=saveTPM;
}
//}}}
Everything you wanted to know about Moodle but were afraid to ask ...
http://www.earlham.edu/markp/moodledocs
!MASTER SLIDE is the TEMPLATE for ALL SLIDES
<<slideShow noClicks forceRefresh>> - A simple slide show that keeps the TW style
<<slideShow style:'MySSStyleSheet' clock:'+'>> - A themed slide show with a clock showing the presentation elapsed time
<<slideShow repeat clock:'-20'>> - A looping slide show with a 20 minutes countdown clock
<<slideShow slidePause:1000>> - A timed slideshow that runs once
<<slideShow slidePause:1000 repeat>> - A timed looping slideshow
-s-
!The [[SlideShowPlugin]]
Press F11 to go fullscreen and adjust the font sizes with Ctrl++ Ctrl+- (or Ctrl+mousewheel).
This plugin was developed by Paulo Soares and Clint Checketts.
{{Comment{This block is not shown in the slide show.
@@Don't show me!!!@@}}}
-s-
!How slides are separated
In a tiddler, you start each slide with the markup {{{-s-}}}
-s-
Slides don't have to have titles like this poor one
-s-
!A slide with subsections and a long title
Check to TOC below to see how this slide title is abbreviated.
!!Section 1
This is a section
!!!Subsection 1.1
This is a subsection
!!!Subsection 1.2
This is another subsection
!!!!Subsubsection 1.2.1
This is a subsubsection
-s-
!Using the keyboard
The following keys are defined:
*Left arrow - previous overlay
*Down arrow - previous slide
*Right arrow - next overlay
*Up arrow - next slide
*Home - first slide
*End - last slide
*Escape - exit slide show
*Spacebar - pause/resume slide show in auto advance mode
-s-
!Slide show parameters
*The slide show can be themed by providing a ~StyleSheet ({{{<<slideShow style:'MyStyleSheet'>>}}})
*By default, there is a clock at bottom of the browser window that displays the current time. This clock can also show the presentation elapsed time with {{{<<slideShow clock:'+'>>}}} or a countdown clock with {{{<<slideShow clock:'-20'>>}}} (for 20 minutes). In these two cases, if you click on the clock display it will be restarted
*The slide show can be set to loop ({{{<<slideShow repeat>>}}})
*You can set it so each slide changes after X milliseconds ({{{<<slideShow slidePause:X>>}}}) (auto advance mode)
*Use auto start mode to begin the slideshow the moment the tiddler is opened ({{{<<slideShow autostart>>>}}})
*You can disable overlays with {{{<<slideShow noOverlays>>}}}
*These parameters can be mixed and matched in any order: {{{<<slideShow slidePause:1000 repeat>>}}} is the same as {{{<<slideShow repeat slidePause:1000>>}}}
-s-
!Overlays
To see how incremental display works use the left and right mouse buttons.
{{Overlay1{You can}}} {{Overlay2{present things}}} {{Overlay1{in an arbitrary order!!!}}}
{{Overlay3{Its a bit harder with lists but it works:}}}
<html>
<ol>
<li class="Overlay4">First item</li>
<li class="Overlay5">Second item</li>
<li class="Overlay4">Last item</li>
</ol>
</html>
{{Comment{You can hide comments on a slide that won't display in the slide show}}}
<!--{{{-->
<div id='displayArea'>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/***
|''Name:''|SlideShowPlugin|
|''Description:''|Creates a simple slide show type display|
|''Version:''|1.5.3|
|''Date:''|Sep 12, 2007|
|''Source:''|http://www.math.ist.utl.pt/~psoares/addons.html|
|''Documentation:''|[[SlideShowPlugin Documentation|SlideShowPluginDoc]]|
|''Author:''|Paulo Soares and [[Clint Checketts|http://www.checkettsweb.com]]|
|''License:''|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.1.0|
***/
//{{{
config.macros.slideShow = {label: "slide show", maxTOCLength: 30};
config.macros.slideShow.messages = {gotoLabel: "Go to slide:"};
config.views.wikified.slideShow = {text: "slide show", tooltip: "Start slide show"};
config.views.wikified.slideShow.quit = {text: "end", tooltip: "Quit the slide show"};
config.views.wikified.slideShow.firstSlide = {text: "<<", tooltip: "first slide"};
config.views.wikified.slideShow.previousSlide = {text: "<", tooltip: "previous slide"};
config.views.wikified.slideShow.nextSlide = {text: ">", tooltip: "next slide"};
config.views.wikified.slideShow.lastSlide = {text: ">>", tooltip: "last slide"};
config.views.wikified.slideShow.resetClock = {text: " ", tooltip: "reset"};
config.formatters.push( {
name: "SlideSeparator",
match: "^-s-+$\\n?",
handler: function(w) {
createTiddlyElement(w.output,"hr",null,'slideSeparator');
}
});
function changeStyleSheet(tiddlerName) {
setStylesheet(store.getRecursiveTiddlerText("StyleSheetColors"),"StyleSheetColors");
setStylesheet(store.getRecursiveTiddlerText("StyleSheetLayout"),"StyleSheetLayout");
setStylesheet(store.getRecursiveTiddlerText(tiddlerName == null ? "StyleSheet" : tiddlerName,""),"StyleSheet");
}
//Excellent (and versatile) reparser created by Paul Petterson for parsing the paramString in a macro
function reparse( params ) {
var re = /([^:\s]+)(?:\:((?:\d+)|(?:["'](?:[^"']+)["']))|\s|$)/g;
var ret = new Array();
var m;
while( (m = re.exec( params )) != null ) ret[ m[1] ] = m[2]?m[2]:true;
return ret;
}
function getElementsByClass(searchClass,node,tag) {
var classElements = new Array();
if ( node == null ) node = document;
if ( tag == null ) tag = '*';
var els = node.getElementsByTagName(tag);
var elsLen = els.length;
var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
var j=0;
for (var i = 0; i < elsLen; i++) {
if ( pattern.test(els[i].className) ) {
classElements[j] = els[i];
j++;
}
}
return classElements;
}
// 'keys' code adapted from S5 which in turn was adapted from MozPoint (http://mozpoint.mozdev.org/)
function keys(key) {
with(config.macros.slideShow){
if (document.getElementById('contentWrapper').className == "slideShowMode"){
if (!key) {
key = event;
key.which = key.keyCode;
}
switch (key.which) {
case 32: // spacebar
if(time>0){
if(autoAdvance){
clearInterval(autoAdvance);
autoAdvance = null;
} else {
autoAdvance=setInterval("GoToSlide(1)", time);
}
}
break;
case 34: // page down
case 39: // rightkey
GoToSlide("n");
break;
case 40: // downkey
GoToSlide(-1);
break;
case 33: // page up
case 37: // leftkey
GoToSlide("p");
break;
case 38: // upkey
GoToSlide(1);
break;
case 36: // home
GoToSlide("f");
break;
case 35: // end
GoToSlide("l");
break;
case 27: // escape
endSlideShow();
break;
}
}
return false;
}
}
function clicker(e) {
if (!e) var e = window.event;
var target = resolveTarget(e);
//Whenever something is clicked that won't advance the slide make sure that the table of contents gets hidden
if (target.getAttribute('href') != null || isParentOrSelf(target, 'toc') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object') || isParentOrSelf(target, 'slideFooter') || isParentOrSelf(target, 'navigator')){
//Don't hide the TOC if the indexNumbers (which trigger the index) is clicked
if(isParentOrSelf(target,'indexNumbers') || isParentOrSelf(target,'jumpInput')){
return true;
}
showHideTOC('none');
return true;
}
//Advance a slide if the TOC is visible otherwise make sure that the TOC gets hidden
if ((!e.which && e.button == 1) || e.which == 1) {
if (document.getElementById('toc').style.display != 'block'){
GoToSlide("n");
} else {
showHideTOC('none');
}
}
if ((!e.which && e.button == 2) || e.which == 3) {
if (document.getElementById('toc').style.display != 'block'){
GoToSlide("p");
} else {
showHideTOC('none');
}
return false;
}
}
function isParentOrSelf(element, id) {
if (element == null || element.nodeName=='BODY') return false;
else if (element.id == id) return true;
else return isParentOrSelf(element.parentNode, id);
}
function GoToSlide(step) {
var new_pos;
var slideHolder = document.getElementById('slideContainer');
//The parse float ensures that the attribute is returned as a number and not a string.
var cur_pos = parseFloat(slideHolder.getAttribute('currentslide'));
var numberSlides = parseFloat(slideHolder.getAttribute('numberSlides'));
switch (step) {
case "f":
new_pos=0;
break;
case "l":
new_pos=numberSlides-1;
break;
case "n":
var numberOverlays = parseFloat(slideHolder.childNodes[cur_pos].getAttribute('numberOverlays'));
var currentOverlay = parseFloat(slideHolder.getAttribute('currentOverlay'));
if(numberOverlays==0 || currentOverlay==numberOverlays){
if(noClicks==false) new_pos=cur_pos+1;
} else {
var className="Overlay"+currentOverlay;
var overlay=getElementsByClass(className,slideHolder.childNodes[cur_pos]);
for(var i=0; i<overlay.length; i++) {overlay[i].className=className+' previousOverlay';}
currentOverlay++;
slideHolder.setAttribute('currentOverlay',currentOverlay);
className="Overlay"+currentOverlay;
overlay=getElementsByClass(className,slideHolder.childNodes[cur_pos]);
for(i=0; i<overlay.length; i++) {overlay[i].className=className+' currentOverlay';}
return false;
}
break;
case "p":
var numberOverlays = parseFloat(slideHolder.childNodes[cur_pos].getAttribute('numberOverlays'));
var currentOverlay = parseFloat(slideHolder.getAttribute('currentOverlay'));
if(numberOverlays==0 || currentOverlay==0){
if(noClicks==false) new_pos=cur_pos-1;
} else {
var className="Overlay"+currentOverlay;
var overlays=getElementsByClass(className,slideHolder.childNodes[cur_pos]);
for(var i=0; i<overlays.length; i++) {overlays[i].className=className+' nextOverlay';}
currentOverlay--;
className="Overlay"+currentOverlay;
overlays=getElementsByClass(className,slideHolder.childNodes[cur_pos]);
for(i=0; i<overlays.length; i++) {overlays[i].className=className+' currentOverlay';}
slideHolder.setAttribute('currentOverlay',currentOverlay);
return false;
}
break;
default:
new_pos=cur_pos+step;
}
if(slideShowCircularMode && new_pos == numberSlides) new_pos=0;
if(slideShowCircularMode && new_pos<0) new_pos=(numberSlides - 1);
if(step!=0 && new_pos>=0 && new_pos<numberSlides) {
slideHolder.childNodes[cur_pos].style.display='none';
slideHolder.childNodes[new_pos].style.display='block';
slideHolder.setAttribute('currentslide',new_pos);
var numberOverlays = parseFloat(slideHolder.childNodes[new_pos].getAttribute('numberOverlays'));
if(step=="p"){
var currentOverlay=numberOverlays;
var state=' previousOverlay';
} else {
var currentOverlay=0;
var state=' nextOverlay';
}
slideHolder.setAttribute('currentOverlay',currentOverlay);
if(numberOverlays>0) {
for(var i=1; i<=numberOverlays; i++){
var className="Overlay"+i;
var overlays=getElementsByClass(className,slideHolder.childNodes[new_pos]);
for(var j=0; j<overlays.length; j++) {overlays[j].className=className+state;}
}
if(step=="p"){
var className="Overlay"+numberOverlays;
var overlays=getElementsByClass(className,slideHolder.childNodes[new_pos]);
for(var j=0; j<overlays.length; j++) {overlays[j].className=className+' currentOverlay';}
}
}
new_pos++;
var indexNumbers = document.getElementById('indexNumbers');
indexNumbers.firstChild.data = new_pos+'/'+numberSlides;
if((new_pos==numberSlides) && !slideShowCircularMode && autoAdvance) clearInterval(autoAdvance);
return true;
}
return false;
}
function tocShowSlide(e) {
if (!e) var e = window.event;
var target = resolveTarget(e);
var slide = target.getAttribute('slideNumber');
var cur_pos = document.getElementById('slideContainer').getAttribute('currentslide');
var step = slide-cur_pos;
if(step!=0) GoToSlide(step);
showHideTOC('none');
return;
}
//Toggle the display of the table of contents
function showHideTOC(display){
var toc = document.getElementById('toc');
//Reset the input box
document.getElementById('jumpInput').value = "";
if (display == null || display.length == null){
if (toc.style.display == 'none' || toc.style.display == ''){
toc.style.display = 'block';
document.getElementById('jumpInput').focus();
} else {
toc.style.display = 'none';
}
} else {
toc.style.display = display;
if (display == 'block')
document.getElementById('jumpInput').focus();
}
}
function padZero(x){return (x>=10 || x<0 ? "" : "0")+x;}
function setClock(){
var actualTime = new Date();
var newTime = actualTime.getTime() - clockStartTime;
newTime = clockMultiplier*newTime+clockInterval+clockCorrection;
actualTime.setTime(newTime);
newTime = padZero(actualTime.getHours()) + ":" + padZero(actualTime.getMinutes())+ ":" + padZero(actualTime.getSeconds());
var clock = document.getElementById('slideClock');
clock.firstChild.nodeValue = newTime;
}
function resetClock(){
var time = new Date(0);
if(clockStartTime>time){
var startTime = new Date();
clockStartTime=startTime.getTime();
}
}
var title;
var place;
var autoAdvance=null;
var slideClock=null;
var noOverlays=false;
var noClicks=false;
var forceRefresh=false;
var time = 0;
var slideShowCircularMode;
var slideShowStyleSheet;
var slideShowParams;
var clockMultiplier;
var clockInterval;
var clockCorrection=0;
var clockStartTime;
var openTiddlers;
config.macros.slideShow.handler = function(aPlace,macroName,params,wikifier,paramString,tiddler){
if(tiddler instanceof Tiddler){
var lingo = config.views.wikified.slideShow;
if (!e) var e = window.event;
place = aPlace;
title = tiddler.title;
params = reparse(paramString);
var onclick = function(){config.macros.slideShow.onClickSlideShow(params);};
createTiddlyButton(aPlace,lingo.text,lingo.tooltip,onclick);
}
}
config.macros.slideShow.onClickSlideShow = function(newParams) {
// if(typeof(newParams)=="number") newParams=slideShowParams;
openTiddlers = new Array;
var viewer=document.getElementById('tiddlerDisplay');
for(var i=0; i<viewer.childNodes.length; i++){
var name = viewer.childNodes[i].getAttribute('tiddler');
openTiddlers.push(name);
}
document.oncontextmenu = function(e){return false;}
clockMultiplier = 1;
clockInterval = 0;
var startTime = new Date(0);
slideShowCircularMode = false;
time = 0;
slideShowStyleSheet = null;
if(newParams['style']){
slideShowStyleSheet = eval(newParams['style']);
}
if(newParams['repeat']){
slideShowCircularMode = true;
}
if(newParams['noClicks']){
noClicks = true;
}
if(newParams['forceRefresh']){
forceRefresh = true;
}
if(newParams['slidePause'] > 0){
time = newParams['slidePause'];
}
if(newParams['clock']){
clockCorrection=startTime.getTimezoneOffset()*60000;
startTime = new Date();
var clockType= eval(newParams['clock']);
if(clockType != '+') {
clockMultiplier = -1;
clockInterval = -clockType*60000;
}
}
clockStartTime=startTime.getTime();
if(newParams['noOverlays']){
noOverlays = true;
}
clearMessage();
//Attach the key and mouse listeners
document.onkeyup = keys;
document.onmouseup = clicker;
story.refreshTiddler(title,"SlideShowViewTemplate",true);
createSlides(newParams);
slideClock=setInterval("setClock()", 1000);
if(time>0) autoAdvance=setInterval("GoToSlide(1)", time);
story.closeAllTiddlers(title);
toggleSlideStyles();
return;
}
config.macros.slideShow.endSlideShow=function(){
var showHolder = document.getElementById('slideShowWrapper');
showHolder.parentNode.removeChild(showHolder);
document.oncontextmenu = function(e){};
if(autoAdvance) clearInterval(autoAdvance);
if(slideClock) clearInterval(slideClock);
noClicks=false;
story.refreshTiddler(title,null,true);
story.closeAllTiddlers();
toggleSlideStyles();
story.displayTiddlers(null,openTiddlers,DEFAULT_VIEW_TEMPLATE);
document.onmouseup = function(){};
}
function isInteger(s){
var i;
for (i = 0; i < s.length; i++){
// Check that current character is number.
var c = s.charAt(i);
if (((c < "0") || (c > "9"))) return false;
}
// All characters are numbers.
return true;
}
function jumpInputToSlide(e){
if (!e) {
e = window.event;
e.which = e.keyCode;
}
if(e.which==13){
var jumpInput= document.getElementById("jumpInput").value;
if(isInteger(jumpInput)){
var step=jumpInput-document.getElementById('slideContainer').getAttribute('currentslide')-1;
if (GoToSlide(step)){
showHideTOC('none');
}
}
}
return;
}
//Used to shorten the TOC fields
function abbreviateLabel(label){
var maxTOCLength = config.macros.slideShow.maxTOCLength;
if(label.length>maxTOCLength) {
var temp = new Array();
temp = label.split(' ');
label = temp[0];
for(var j=1; j<temp.length; j++){
if((label.length+temp[j].length)<=maxTOCLength){
label += " " + temp[j];
} else {
label += " ...";
break;
}
}
}
return label;
}
function createSlides(newParams){
var lingo = config.views.wikified.slideShow;
//Remove dblClick on edit function
var theTiddler = document.getElementById("tiddler"+title);
theTiddler.ondblclick = function() {};
// Grab the 'viewer' element and give it a signature so the show can be resumed if stopped
var tiddlerElements = theTiddler.childNodes;
var viewer;
for (var i = 0; i < tiddlerElements.length; i++){
if (tiddlerElements[i].className == "viewer") viewer = tiddlerElements[i];
}
viewer.id = 'slideShowWrapper';
//Hide the text that comes before the first H1 element (I think I may put this into a cover page type thing)
while(viewer.childNodes.length > 0 && viewer.firstChild.nodeName.toUpperCase() != "HR" && viewer.firstChild.className!="slideSeparator") {
viewer.removeChild(viewer.firstChild);
}
//Cycle through the content and each time you hit an H1 begin a new slide div
var slideNumber = 0;
var slideHolder = document.createElement('DIV');
slideHolder.id = "slideContainer";
slideHolder.setAttribute('currentslide',0);
while(viewer.childNodes.length > 0){
//Create a new slide a append it to the slide holder
if (viewer.firstChild.nodeName.toUpperCase() == "HR" && viewer.firstChild.className=="slideSeparator"){
slideNumber++;
var slide = document.createElement('DIV');
slide.id = "slideNumber"+slideNumber;
slide.className = "slide";
if (slideNumber > 1) {
//slideHolder.setAttribute('currentslide',0);
slide.style.display='none';
} else {
slide.style.display='block';
}
slideHolder.appendChild(slide);
viewer.removeChild(viewer.firstChild);
} else {
if(viewer.firstChild.nodeName=="SPAN" && viewer.firstChild.className=="" && viewer.firstChild.hasChildNodes()) {
var anchor=viewer.firstChild.nextSibling;
for (var ii=0;ii<viewer.firstChild.childNodes.length;ii++) {
var clone=viewer.firstChild.childNodes[ii].cloneNode(true);
viewer.insertBefore(clone,anchor);
}
viewer.removeChild(viewer.firstChild);
} else {
slide.appendChild(viewer.firstChild);
}
}
}
//Stick the slides back into the viewer
viewer.appendChild(slideHolder);
slideHolder.setAttribute('numberSlides',slideNumber);
//Create the navigation bar
var slidefooter = createTiddlyElement(viewer,"DIV","slideFooter","slideFooterOff");
var navigator = createTiddlyElement(slidefooter,"SPAN","navigator");
//Make it so that when the footer is hovered over the class will change to make it visible
slidefooter.onmouseover = function () {slidefooter.className = "slideFooterOn"};
slidefooter.onmouseout = function () {slidefooter.className = "slideFooterOff"};
//Create the control button for the navigation
var onClickQuit = function(){config.macros.slideShow.endSlideShow();};
createTiddlyButton(navigator,lingo.quit.text,lingo.quit.tooltip,onClickQuit);
createTiddlyButton(navigator,lingo.firstSlide.text,lingo.firstSlide.tooltip,first_slide);
createTiddlyButton(navigator,lingo.previousSlide.text,lingo.previousSlide.tooltip,previous_slide);
createTiddlyButton(navigator,lingo.nextSlide.text,lingo.nextSlide.tooltip,next_slide);
createTiddlyButton(navigator,lingo.lastSlide.text,lingo.lastSlide.tooltip,last_slide);
createTiddlyButton(navigator,lingo.resetClock.text,lingo.resetClock.tooltip,resetClock,"button","slideClock");
var indexNumbers = createTiddlyElement(slidefooter,"SPAN","indexNumbers","indexNumbers","1/"+slideNumber)
indexNumbers.onclick = showHideTOC;
var toc = createTiddlyElement(slidefooter,"UL","toc");
var ovl=1;
for (var i=0;i<slideHolder.childNodes.length;i++) {
if(!noOverlays) {
var ovl=1;
while(1){
var className="Overlay"+ovl;
var overlays=getElementsByClass(className,slideHolder.childNodes[i]);
if(overlays.length>0){
for(var j=0; j<overlays.length; j++) {overlays[j].className+=' nextOverlay';}
ovl++;
} else {break;}
}
}
slideHolder.childNodes[i].setAttribute("numberOverlays",ovl-1);
slideHolder.setAttribute("currentOverlay",0);
//Loop through each slide and check the header's content
var tocLabel = null;
for (var j=0;j<slideHolder.childNodes[i].childNodes.length;j++) {
var node = slideHolder.childNodes[i].childNodes[j];
if(node.nodeName=="H1" || node.nodeName=="H2" || node.nodeName=="H3" || node.nodeName=="H4") {
var htstring = node.innerHTML;
var stripped = htstring.replace(/(<([^>]+)>)/ig,"");
tocLabel = abbreviateLabel(stripped);
var tocLevel="tocLevel"+node.nodeName.charAt(1);
var tocItem = createTiddlyElement(toc,"LI",null,tocLevel);
var tocLink = createTiddlyElement(tocItem,"A",null,"tocItem",tocLabel);
tocLink.setAttribute("slideNumber",i);
tocLink.onclick=tocShowSlide;
}
}
}
//Input box to jump to s specific slide
var tocItem = createTiddlyElement(toc,"LI",null,"tocJumpItem",config.macros.slideShow.messages.gotoLabel);
var tocJumpInput = createTiddlyElement(tocItem,"INPUT","jumpInput");
tocJumpInput.type="text";
tocJumpInput.onkeyup=jumpInputToSlide;
}
var next_slide= function(e){GoToSlide(1);}
var first_slide= function(e){GoToSlide("f");}
var previous_slide= function(e){GoToSlide(-1);}
var last_slide= function(e){GoToSlide("l");}
function toggleSlideStyles(){
var contentWrapper = document.getElementById('contentWrapper');
if (contentWrapper.className == "slideShowMode"){
contentWrapper.className = "";
window.applyPageTemplate();
setStylesheet("#backstageShow{display: block;}","SlideShowStyleSheet");
changeStyleSheet();
} else{
contentWrapper.className = "slideShowMode";
window.applyPageTemplate("SlideShowPageTemplate");
setStylesheet(store.getRecursiveTiddlerText("SlideShowStyleSheet"),"SlideShowStyleSheet");
if(slideShowStyleSheet) changeStyleSheet(slideShowStyleSheet);
}
}
config.shadowTiddlers.SlideShowPageTemplate="<!--{{{-->\n<div id='displayArea'>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->";
config.shadowTiddlers.SlideShowViewTemplate="<!--{{{-->\n<div class='title' macro='view title'></div>\n<div class='viewer' macro='view text wikified'></div>\n<!--}}}-->";
config.shadowTiddlers.SlideShowStyleSheet = "/***\n!Slide Mode Styles\n***/\n/*{{{*/\n#backstageShow{\n display: none !important;\n}\n\n#contentWrapper.slideShowMode #slideContainer{\n display: block;\n}\n\n#contentWrapper.slideShowMode .Comment{\n display: none;\n}\n\n#contentWrapper.slideShowMode .nextOverlay{\n visibility: hidden;\n}\n\n#contentWrapper.slideShowMode .currentOverlay{\n visibility: visible;\n}\n\n#contentWrapper.slideShowMode .previousOverlay{\n visibility: visible;\n}\n\n#jump{\n text-align: right;\n}\n\n.slideFooterOff #navigator{\n visibility: hidden;\n}\n\n.slideFooterOn #navigator{\n visibility: visible;\n}\n\n#contentWrapper.slideShowMode #slideClock{\n cursor: pointer; margin: 0 5px 0 5px; border: 1px solid #db4\n}\n\n#contentWrapper.slideShowMode,\n #contentWrapper.slideShowMode #displayArea{\n width: 100%;\n font-size: 1.5em;\n margin: 0 !important;\n padding: 0;\n}\n\n#slideContainer{\n display: none;\n}\n\n.indexNumbers{\n cursor: pointer;\n}\n\n#navigator{\n visibility: hidden;\n bottom: 0;\n}\n\n#toc{\n display: none;\n position: absolute;\n font-size: .75em;\n bottom: 2em;\n right: 0;\n background: #fff;\n border: 1px solid #000;\n text-align: left;\n}\n\nul#toc, #toc li{\n margin: 0;\n padding: 0;\n list-style: none;\n line-height: 1em;\n}\n\n.tocJumpItem{\n margin-right: 2em;\n}\n\n.tocJumpItem input{\nmargin-right: 1em;\n border: 0;\n}\n\n#toc a,\n#toc a.button{\n display: block;\n padding: .1em;\n}\n\n#toc .tocLevel1{\nfont-size: .8em;\n}\n\n#toc .tocLevel2{\n margin-left: 1em;\n font-size: .75em;\n}\n\n#toc .tocLevel3{\n margin-left: 2em;\nfont-size: .75em;\n}\n\n#toc .tocLevel4{\n margin-left: 3em;\nfont-size: .65em;\n}\n\n#toc a{\n cursor: pointer;\n}\n\nh1{\n min-height: 1em;\n}\n\n.slide h1{\n min-height: 0;\n}\n\n/* The '>' selector is ignored by IE6 and earlier so the proper rules are given */\n#slideFooter{\n position: fixed;\n bottom: 2px;\n right: 2px;\n width: 100%;\n text-align: right;\n}\n\n/* This is a hack to trick IE6 and earlier to put the navbar on the bottom of the page */\n* html #slideFooter {\n position: absolute;\n width: 100%;\n text-align: right;\n right: auto; bottom: auto;\n left: expression( ( -20 - slideFooter.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );\n top: expression( ( -10 - slideFooter.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );\n}\n\n\n\n/*}}}*/";
config.shadowTiddlers.SlideShowPluginDoc="The documentation is missing. It is available [[here|http://www.math.ist.utl.pt/~psoares/addons.html#SlideShowPluginDoc]].";
//}}}
!Description
This plugin turns a TiddlyWiki tiddler into a simple slide show type display. Most features that are usually found in presentation software are available. It should work in a way that does not interfere with TiddlyWiki. When you close the slide show you get back to your good old TW.
This plugin has been tested in Firefox and Internet Explorer. Let me know if something seems broken.
!Usage
To use this plugin you //must// be using TiddlyWiki 2.0. Some optional features (as the incremental display) require version 2.0.8 or higher. To install the plugin copy the tiddlers SlideShowPlugin, SlideShowPageTemplate and SlideShowViewTemplate to your TW, label the first one with the //systemConfig// tag, save the TW and refresh the browser.
To make a slide show simply drop {{{<<slideShow>>}}} at the beginning of a tiddler and use {{{--s--}}} to start each slide.
If you move your mouse over the bottom of the browser window you will see a few navigation buttons, a clock and a table of contents that shows up when you click the slide number.
Any block of text marked as {{{{{Comment{For my eyes only!}}}}}} will not be displayed in the slide show.
See these and other features in this [[SlideShowExample]].
!Incremental display
A succession of overlays (or layers) can be defined in each slide by marking blocks of text with {{{{{Overlay1{...some text...}}}}}}, {{{{{Overlay2{...some text...}}}}}}, {{{{{Overlay3{...some text...}}}}}}, ...
To costumize the way overlays are shown you can redefine the following CSS classes
*contentWrapper.slideShowMode .previousOverlay
*contentWrapper.slideShowMode .currentOverlay
*contentWrapper.slideShowMode .nextOverlay
in a ~StyleSheet. The default style simply hides the next overlays and shows the current and the previous ones as normal text.
!Slide show parameters
*The slide show can be themed by providing a ~StyleSheet ({{{<<slideShow style:'MyStyleSheet'>>}}})
*By default, there is a clock at bottom of the browser window that displays the current time. This clock can also show the presentation elapsed time with {{{<<slideShow clock:'+'>>}}} or a countdown clock with {{{<<slideShow clock:'-20'>>}}} (for 20 minutes). In these two cases, if you click on the clock display it will be restarted
*The slide show can be set to loop ({{{<<slideShow repeat>>}}})
*You can set it so each slide changes after X milliseconds ({{{<<slideShow slidePause:X>>}}}) (auto advance mode)
*To not use the mouse to navigate through the presentation use {{{<<slideShow noCLicks>>>}}}. This is useful when there are clickable elements in the presentation
*{{{<<slideShow forceRefresh>>>}}} forces a refresh of the presentation tiddler (useful when a presentation is built from separate tiddlers using the {{{<<tiddler>>}}} macro)
*You can disable overlays with {{{<<slideShow noOverlays>>}}}
*These parameters can be mixed and matched in any order: {{{<<slideShow slidePause:1000 repeat>>}}} is the same as {{{<<slideShow repeat slidePause:1000>>}}}
!Slide show navigation
You can navigate through a slide show using the keyboard or the mouse. To quickly move to titled sections you can use the table of contents.
!!Mouse navigation
Left (right) clicking on a slide jumps to the next (previous) overlay. To move to the beginning of the next or previous slide you must use the navigation bar at the bottom of the browser's window. If there are no overlays defined both operations are equivalent.
!!Keyboard navigation
The following keys are defined:
*Left arrow - previous overlay
*Down arrow - previous slide
*Right arrow - next overlay
*Up arrow - next slide
*Home - first slide
*End - last slide
*Escape - exit slide show
*Spacebar - pause/resume slide show in auto advance mode
!Revision history
*1.5.3
**fix for ~TW2.2
**forceRefresh and noClicks
**removed autoStart feature
**templates are now in shadow tiddlers
*1.5.2 13/02/2007
**fixed a conflict with TW pageFooter
*1.5.1 10/11/2006
**added SlideShowPageTemplate and SlideShowViewTemplate. This way, the plugin no longer requires a standard TW layout. Thanks to Andrew Lister for the idea.
*1.5.0 18/09/2006
**fixed restoring stylesheet on exit
**changed (again!) the way how slides are separated (slide shows prepared for previous versions must be fixed)
*1.4.0 20/04/2006
**changed the way how slides are separated (slide shows prepared for previous versions must be fixed)
**now works with content included with the {{{<<tiddler>>}}} macro
**added incremental display (overlays)
**improved documentation
**assorted small fixes
*1.3.1 10/03/2006
**removed empty slide titles
**fixed wrong numberSlides when slides have div's
**fixed wrong time in Windows
*1.3.0 26/02/2006
**restore open tiddlers on exit
**fixed problem with markup in headers (should work with NestedSlidersPlugin)
**added slide comments (blocks of text in the tiddler that don't show up in the presentation)
*1.2.1 28/01/2006
**pause timed slideshow with spacebar
**added clock with 3 different modes
**fixed bugs with style and abbreviation options
**general cleanup
*1.2.0 07/01/2006
**added a resume feature
**added themes support
*1.1.5 14/12/2005
**added mouse support
**cleaned up navbar generation
*1.1.0 12/12/2005
**added support for IE
**added key listeners
*1.0.0 11/12/2005
**initial release
!Todo
*Time code is still very hackerish and unreliable.
<!--{{{-->
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<!--}}}-->
/***
''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''
|Name|SplashScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#SplashScreenPlugin|
|Version|0.21 |
|Requires|~TW2.08+|
!Description:
Provides a simple splash screen that is visible while the TW is loading.
!Installation
Copy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.
!Customizing
Once the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.
!History
* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release
!Code
***/
//{{{
var old_lewcid_splash_restart=restart;
restart = function()
{ if (document.getElementById("SplashScreen"))
document.getElementById("SplashScreen").style.display = "none";
if (document.getElementById("contentWrapper"))
document.getElementById("contentWrapper").style.display = "block";
old_lewcid_splash_restart();
if (splashScreenInstall)
{if(config.options.chkAutoSave)
{saveChanges();}
displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");
}
}
var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
{var siteTitle = store.getTiddlerText("SiteTitle");
var splasher='\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
if (! store.tiddlerExists("MarkupPreHead"))
{var myTiddler = store.createTiddler("MarkupPreHead");}
else
{var myTiddler = store.getTiddler("MarkupPreHead");}
myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);
store.setDirty(true);
var splashScreenInstall = true;
}
//}}}
This is an issue when text is pasted in from MS Word. Somehow line endings (CR LF?) get inserted at intervals into the pasted text (I suspect every 255 characters). Clicking on Toggle HTML source doesn't help because the line ending chars are invisible AND don't get acted upon until the text box is saved. What I've done in the past is to make a note of the words just before the newline and then return to the editor and delete the space and reinsert it. This always fixes the problem but it's very tedious.
So, the issue is very definitely Word format and selecting the text and clicking the 'Clean Word HTML' button does not help. Note that this never happens when text is typed stright into the HTML area box.
The solution is to use a true text editor to create your text. Text pasted in from Jedit for example always wraps properly. For documents already in Word format I think you'll find that doing a File -> Save As and choosing text format (either DOS or Windows) and then selecting, copying and pasting into HTMLArea will fix the problem. Finally, I have found that one can fix existing text blocks with errant new lines by cutting the text, pasting into Text editor and then highlighting this and copying and pasting back in to the original box.
!!Student's Guide to Moodle
* Logging in
* Enroll into course
** Finding course
** Using 'Enrolment Key'
* Profile
** Mugshot
* Using Resources
* Completing Assignments
* Discussing in Forums
/*{{{*/
.myPasOptionInput {background:[[ColorPalette::SecondaryPale]]; }
body {font-size:.8em; font-family:verdana,arial,helvetica; margin:0; padding:0;}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}
body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}
hr {height:1px;}
a {text-decoration:none;}
dt {font-weight:bold;}
ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}
.txtOptionInput {width:11em;}
#contentWrapper .chkOptionInput {border:0;}
.externalLink {text-decoration:underline;}
.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}
.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}
/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
#mainMenu .tiddlyLinkExisting,
#mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}
.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}
#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;}
#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}
.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}
#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}
.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}
.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}
.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}
#contentWrapper {display:block;}
#splashScreen {display:none;}
#displayArea {margin:1em 17em 0em 14em;}
.toolbar {text-align:right; font-size:.9em;}
.tiddler {padding:1em 1em 0em 1em;}
.missing .viewer,.missing .title {font-style:italic;}
.title {font-size:1.6em; font-weight:bold;}
.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}
.tiddler .button {padding:0.2em 0.4em;}
.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}
.footer {font-size:.9em;}
.footer li {display:inline;}
.annotation {padding:0.5em; margin:0.5em;}
* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}
.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}
.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}
.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}
.sparkline {line-height:1em;}
.sparktick {outline:0;}
.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}
* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}
.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
!Workshop for faculty teaching high enrollment courses
According to figures extracted from the Banner system, for large classes with over 40 students in the past academic year:
* there were 15 classes in the Fall, 16 in the Spring, for a total 31
* six faculty taught large classes in //both// Fall and Spring
And this year is fairly typical. Teaching Consultant Jonathan Diskin, and Instructional Technologist, Mark Pearson, have been discussing ways to address some of the problems that arise when teaching classes of this size which may be less apparent with smaller class sizes.
With this in mind we are proposing an all day workshop at the beginning of August which will address such issues as:
* Tailoring the syllabus to be manageable with large numbers of students:
** how many written assignments?
** how much reading to assign?
** how to assess reading?
* How to use Teaching Assistants effectively
* How to prevent or at least minimize plagiarism and cheating
* How to successfully engage large groups of students
* How to handle student projects
* Group assignments — how to make them really work
We do not have pre-packaged answers. Rather, we need your ideas in order to tailor the workshop to meet your interests and needs. Questions for attendees
* Would you be willing to bring a syllabus to share? What are its strong and weak points?
* What ideas have worked for you? What things have flopped?
* What are the pressing issues for you?
* Would you like to know more about how Moodle can assist in course management and pedagogy (leading to separate workshop sessions)?
!!!Outcomes
We hope that the success of this workshop will be measured by the renewed confidence with which you will come away in order to tackle the next large class you teach. We expect that you will take home with you at least one new or renewed idea to change your course for the better.
!!!A word about course management (moodle)
While Moodle may come up as an approach to address some topic of course management or pedagogical nature it is not intended that this be an instructional workshop about Moodle. Rather, one or more hands-on Moodle workshops will be provided as follow up where faculty can implement the ideas and suggestions which emerge. This will be our plan unless there is demand from faculty for some focus on the practicality of implementation in which case we will take a demonstration view.
!OUTLINE: Workshop for faculty teaching high enrollment courses
June 17, 2009 For Tuesday August 4th
;Participant list so far:
:Jay Roberts
:Lori Watson
:Vince Punzo
:Bill Buskirk
:Owen Traylor
:Julie May
:(Chuck Yates?)
;People we will contact to see if they can join us:
:Meg Streepey
:Dan Graves
:Amy Mulnix
:Someone from psych?
This workshop will explore both pedagogical and course management practices for teaching larger courses.
Before we begin the workshop we will ask for some general input from potential participants about their interests. We will ask folks to come to the workshop with one or more ''SYLLABI'' from past or upcoming courses.
!!OUTLINE OF UNITS
!!!1) 9 – 10 am: Opening sharing and overview:
Explaining the structure and flow of the workshop.
Review of syllabi and folks explaining what courses they have taught or will teach.
;OPENING QUERY:
:what do you think are the strengths and weaknesses of your syllabus and course design?
;Goals:
:general group bonding and generation of questions and issues for examination.
Models of LARGE COURSES:
* Single teacher, no labs or outside sections.
* Single teacher one or more ~TAs w/ or w/out outside sections
* Single teacher with labs
* Mutliple teachers w/ or w/out labs and outside sectons
We could have faculty discuss these models as they discuss their courses: Bill B, Lori W, Vince P etc.?
!!!2) 10 – 12 am: Pedagogical Issues
JAY:
<<<
general comments about course objectives for larger courses: issues and strategies.
Course design and student involvement/attachment.
Discussion/Presentation: how to engage students? Mix of lecture, smaller group activity, kinds and amounts of work:
<<<
JAN SIMS on writing assignments.
Establishing a sense of shared purpose
!!!3) 12 – 1: LUNCH:
!!!4) 1 – 3: Course Management Issues
How to use ~TAs, Moodle and other means to organize and learn about your class.
* Pros and Cons of Using TA’s: Psych Model, general info.
* Assessment: Tests and quizzes: ways to get diagnostic information about understanding, engagement, and cheating.
* Using Moodle: specific relevant applications:
** Gradebook
** Attendance
** Quizzes
** Feedback
!!!5) 3 – 4:30: Toward Conclusions
* Preventing silent failure
* Establishing a sense of shared purpose (again)
* Student interaction with one another
* How to organize and structure a syllabus
* Modes of assessment
SHARING from participants about what has worked, what needs improvement etc.
Reflections on how each person might change their syllabus.
!!!6) 4:30 – 5: Assessment and the Future
Assess this workshop.
How might we usefully follow up on this workshop?
See also [[Summer Workshop : email to faculty]]
These are questions that Moodle support people have been called upon to act upon. You need to be able to translate from the user's request to the action that you or the user needs to take with Moodle.
+++!![Mark's list]
* Course creation: you will need to be able to show faculty how to use the Course create form to submit a new course request or course restore request +++[details]>
<<tiddler [[Course create details]]>>
===
* Best practices with [[Resources|Resources : Best Practices]] and [[scanning|Scanning Best Practices]]. Also checkout +++[SFX]>
!!!Linking to papers via SFX
* a quick 'how to' find a paper on SFX and use in Moodle, with an example
===
* Best practices for [[Assignments|Assignments : Best Practices]]. Difference between 'advanced uploading of files' and 'simple file upload' -- when to use each.
* In class presentations. Use of Forum for uploading PPT presentations. Either individual students or groups. Can also use Offline Assignment.
* Group projects. Use of Forums or community on ELS for sharing of files in Groups.
* Use of Assignment for take home exam.
* Group discussions -- grading the Forum with "ratings"
* Online quiz.
* tracking attendance using Attendance
* Using ~TAs to rate Forum posts, grade assignments etc. (Use of roles)
===
<<tiddler [[Support topics : Neal & Amy]]>>
!!Practice with your own course
We are all agreed that in order to support Moodle competently you really have to operate your own class on Moodle. You can circumvent the problem of not having your own class to work with by volunteering to create a complete moodle course for a favourite faculty person!
!! Other innovative pedagogical techniques
;Glossary
: have students define terms at the beginning and end of the semester.
;Q&A forum
:accent on //reflection// rather than 'me too', 'I agree' type postings. Students don't see what has been posted by others until they have made a posting themselves.
+++!![Neal's list]
* Can you make it so my (secretary, admin asst, TA) can upload files? (i.e. course assistant role)
* Can I upload a (video, audio) file? -- how to play audio & video files effectively.
* How can I do an online discussion? (i.e. forums).
* Can I have students submit (weekly discussion questions, reading log, etc.) and then grade them online? (assignment)
* Can I put up something and not let students see it? (i.e. hide resource, assignment)
* I want to put up copyrighted materials; is this OK? (i.e. enrolment key .... fair use discussion)
* I want to get on the bandwagon and teach with technology; teach me how to use Moodle (i.e. caveats about when/why to use Moodle and what other options might exist).
===
+++!![Amy's list]
* I'm having trouble uploading a file/video. (Possible troubleshooting -- incomplete upload form with omitted description, or File too big, morphs into having Aaron manually place file, and/or helping them resize for smaller resolution.) [Also: large files on course backups prevent successful course restore]
* I think I taught this course in Moodle before but I can't remember when. How can I use some of the content but change it around? (Gets into faulty faculty memory, and teaching them how to edit the layout and content.) [Also: Finding and restoring previous year's courses]
* I want to do an assignment and have it private at first, but then after I've graded I'd like the students to be able to see each others work. (Gets into explaining about the multiple types of assignments) [?
* How can I assign group projects? [can use Forums and //OU Wiki// -- ''new''. Also think about use of Glossary] How can I tell who did what in group work? [You have to understand how 'groups' work -- telling who did what is automatic.] [Also: can I assign one version to one group and a different version of the same assignment to a different group? Yes -- use 'groupings']
* I have a repeating assignment, like a weekly journal. What's the easiest way to set that up? [Use //Sharing cart// -- ''new feature'']
* How can I add graphics or photos that display automatically? Can I change the colors?
* Sometimes when I type an email to my students Moodle will automatically link to things I describe, like my syllabus, but other times it doesn't. Why does it do this and how can I control it? (Gets into differences between Moodle Resource names and file names, and why that's important).
* I'd like to set up a Moodle site and give access to some off-campus members. (High ability high school students, community members in music ensembles, committee or conference work outside the college). How can I do that? What permissions will they have? (The difference in guest with key access verses creating usernames for non-Earlham members).
===
/***
|''Name:''|~TaggerPlugin|
|''Version:''|1.0.1 (2006-06-01)|
|''Source:''|http://tw.lewcid.org//#TaggerPlugin|
|''Author:''|SaqImtiaz|
|''Description:''|Provides a drop down listing current tiddler tags, and allowing toggling of tags.|
|''Documentation:''|[[TaggerPluginDocumentation]]|
|''Source Code:''|[[TaggerPluginSource]]|
|''~TiddlyWiki:''|Version 2.0.8 or better|
***/
// /%
config.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;}\n"+".tagger #toggleButton {padding-left:2px; padding-right:2px; margin-right:1px; font-size:110%;}\n"+"#nestedtagger {background:#2E5ADF; border: 1px solid #0331BF;}\n"+".popup .listTitle {color:#000;}\n"+"","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]]";
// %/
''If you want this documentation available offline, copy this tiddler to your TW.''
!Description:
The tagger plugin is a result of combining key features from the dropTags and tagAdder macro's. However, since it departs somewhat from the interface tagAdder users will be familiar with, I'm making this available as a new plugin alongside tagAdder.
Tagger provides a dropdown list of the current tiddler tags, along with the ability to toggle them. Further it can optionally display a list of tags in the dropdown, which can be addded to the tiddler.
*Clicking on ''[x]'' and ''[ ]'' removes and adds the tag respectively.
*Clicking on the tag text displays the tag dropdown for that tag, listing tiddlers tagged with it.
*The ''Create new tag'' lets you quickly type in a new tag not in the list.
*Click on this button to see the dropdown: <<tagger>>
Further note that each tag dropdown has a ''Rename tag'' option. This can be used to quickly rename a tag in the entire TW, also rename it's tiddler if it exists.
//''tagAdder, dropTags and the future''
- tagAdder will no longer will be developed, but will remain available. I encourage all tagAdder users to upgrade to tagger.
- dropTags will still be developed for those users that dont want the 'tag editing' features.//
!Examples & Usage:
*At it's simplest, using tagger is as simple as {{{<<tagger>>}}} <<tagger>>
**This gives a dropdown with the current tiddler tags, followed by all the tags in the TW.
*You can also use a list of specified tags instead of all tags in the TW, by specifying a source tiddler.
**{{{<<tagger source:TagsDB>>}}} <<tagger source:TagDataBase>>
*You can also display ONLY the current tiddler tags
**{{{<<tagger taglist:false>>}}} <<tagger taglist:false>>
*To exclude tags from the list: {{{<<tagger exclude:"excludeLists Tag2 [[Tag with spaces]]">>}}} <<tagger exclude:"excludeLists Tag2 [[Tag with spaces]]">>
*For a custom button label: {{{<<tagger label:"custom label">>}}} <<tagger label:"custom label">>
*For a custom tooltip: {{{<<tagger tooltip:"custom tooltip">>}}} <<tagger tooltip:"custom tooltip">>
!CSS and Styling:
For those wishing to customize the popup appearance:
*the main popup has a class and id of popup has with all other popups.
*the nested tag popups have an id of nestedpopup
!Advanced Users:
You can change the global defaults for tagger, like the button label, the tags to exclude or whether to display the taglist or not, by editing the ''config.tagger.defaults'' section in the code.
!To Do:
*code optimization
*possibly a 'delete this tag' option.
!History
*version 1.0.1 (2006-06-01): fixed conflicts with QuickOpenTag (TagglyTagging) and AutoTagger.
List of tiddlers imported from the 'old moodle dox:
<<<
Advanced upload : zip download
Advanced uploading files
Assignments : Best Practices
Best Practices
Course Management
Course Management tips
Course Outline : 1. Introduction
Course Outline : 2. Choose
Course Outline : 3. Best Practices
Course Outlines
Course screen-shots
Introduction to Moodle
Moodle : Benefits
Moodle Links
Moodle in class
News Forum for class announcements
Outlines : 4. Innovative
Pedagogical Pros
Problem displaying Word files
Resources : Best Practices
Scanning Best Practices
course naming
<<<
<<<
Glossary
Glossary details
Moodle FAQ
Moodle FAQ details
del.icio.us FAQ
del.icio.us setup
using RSS with del.icio.us
using del.icio.us
Spurious newlines in text box
Student Guide
searching with del.icio.us
<<<
!Documentation for TiddlyLightBoxPlugin
''Credits:''
This 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.
''Concept:''
I 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.
''Installation:''
Copy 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!
''Usage:''
There are 3 macros provide to facilitate setting up macros.
1. ''{{{<<imagebox>>}}}''
The 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>>}}}.
Eg: {{{[img[cactus-thumb.jpg]cactus.jpg]]}}}
[img[cactus-thumb.jpg][cactus.jpg]]<<imagebox>>
Let's try a text link: {{{[[click me|triad.jpg]]<<imagebox>>}}}
[[click me|triad.jpg]]<<imagebox>>
This macro also accepts some optional parameters in this order:
2. description text
3. width ( as a number, like 500)
4. height (as a number, like 300)
Also, 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".
Let's try one more, with a title and a custom size:
{{{[img[cubicles-thumb.jpg][cubicles.jpg]]<<imagebox 'Office space' 300 300>>}}}
[img[cubicles-thumb.jpg][cubicles.jpg]]<<imagebox 'Office space' 300 300>>
----
2. ''{{{<<divbox>>}}}''
The 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.
You can create such a div in any tiddler by wrapping it in html tags, but using the MarkupPostBody tiddler might be the better option.
The 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 ''>>}}}
The next parameter is the id of the div to display: {{{<<tiddlerbox label theID>>}}}
These two parameters are a must for the divbox macro. There are also 3 more optional parameters, just like the imagebox macro:
3. description text
4. width ( as a number, like 500) OR className
5. height (as a number, like 300)
As an example, lets display this hidden div which I have written inline:
{{{<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">>}}}
<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">>
----
3.''{{{<<tiddlerbox>>}}}''
This 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.
The 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.
Let's give it a go:
{{{<<tiddlerbox "menu" "MainMenu" "Thats my main menu, and the links work!">>}}}
<<tiddlerbox "menu" "MainMenu" "Thats my main menu, and the links work!">>
or
{{{<<tiddlerbox "menu" "Sidebar" "Thats my sidebar!" 300 500>>}}}
<<tiddlerbox "sidebar" "Sidebar" "Thats my sidebar!" 300 500>>
-----
''CSS Styling:''
The 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!
I'll post a diagram showing the structure of the lightbox later, to faciliate css styling.
----
''Features comparison with ~DC3Lightbox:''
Missing:
* IE transparency filters
* ability to create own lightbox containers
*call back functions on closing lightbox
Added:
*macros for TW usage
*optimized for TW environment
*ability to display Tiddlers in lightboxes
*preloading of images, to avoid layout problems
*removed need for manually creating styles tiddler and adding html markup.
*fixed bug with regards to selects displaying over the lightbox!
----
''To Do''
* fixed positioning of lightbox so it scrolls with the page!
*possible light weight animation for images
* optional preloading of images
* resizing of images to fit the viewport when larger.
* optional automatic lightboxing of all links to images.
*grabbing description from image alt text.
* improved support for inline html content.
!!Images in a lightbox:
[img[cactus-thumb.jpg][cactus.jpg]]<<imagebox>>
Let's try a text link:
[[click me|triad.jpg]]<<imagebox>>
----
!Html div in a lightbox:
<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">>
----
!Tiddlers in a lightbox:
Let's give it a go:
<<tiddlerbox "menu" "MainMenu" "Thats my main menu, and the links work!">>
<<tiddlerbox "sidebar" "Sidebar" "Thats my sidebar!" 300 500>>
----
[[Full Documentation|TiddlyLightBoxDoc]]
[[TiddlyLightBoxPlugin]]
/***
|''Name:''|TiddlyLightBox|
|''Date:''|Jan 1, 2006|
|''Version:''|1.0 beta|
|''Author:''|Saq Imtiaz|
|''Location:''|http://tw.lewcid.org/#TiddlyLightBoxPlugin|
|''Documentation:''|http://tw.lewcid.org/#TiddlyLightBoxDocs|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''Based on:''|DC3.LightBox<br>Light Box Gone Wild <br>Ibox|
!!Code
***/
//{{{
config.macros.imagebox ={};
config.macros.imagebox.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
var e = place.lastChild;
e.onclick = function(){TiddlyLightBox.initBox('image',this,params[1],params[2],params[0]);return false;};
}
config.macros.divbox ={};
config.macros.divbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
if (params[0]!=".")
createTiddlyButton(place,params[0],params[0],function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;});
else
{
var e = place.lastChild;
e.onclick = function(){TiddlyLightBox.initBox('html',params[1],params[3],params[4],params[2]);return false;};
}
}
config.macros.tiddlerbox ={}
config.macros.tiddlerbox.handler = function (place,macroName,params,wikifier,paramString,tiddler)
{
config.macros.divbox.handler(place,macroName,[params[0],"tiddler:"+params[1],params[2],params[3],params[4]]);
return false;
}
store.addNotification("TiddlyLightBoxStyles",refreshStyles);
if (!window.TiddlyLightBox)
window.TiddlyLightBox = {};
var loadingImage = "indicator.gif";
window.TiddlyLightBox =
{
_curBox: null, // [sentinel]
lightBoxHtml : '<div id="lightBoxOverlay" onclick="TiddlyLightBox.hideBox()" style="display:none"></div><div id="lightboxprogress" style="display:none;"><img src=\''+loadingImage+'\' alt=\'loading\' 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>',
createBoxWrapper : function()
{
var wrapper = createTiddlyElement(document.getElementsByTagName("body")[0],"div","tiddlyLightBoxWrapper");
wrapper.innerHTML = this.lightBoxHtml;
},
initBox : function(contentType,url,w,h,text)
{
if (this._curBox)
return;
this.showProgress();
this.hideSelects("hidden");
this.showBg();
this._curBox = true;
this.sizeTheBox(contentType,w,h);
if (contentType == 'image')
this.showImage(url,text);
else if (contentType == 'html')
this.showHtml(url,text);
return false;
},
sizeTheBox : function(contentType,w,h)
{
var box = document.getElementById("lightBoxContent");
if (w && isNaN(parseInt(w)))
{
addClass(box,w);
}
else if (w ||h || contentType == 'html')
{
box.style.width = w? w+ "px" : "450px";
box.style.height = h? h+ "px" : "280px";
if (contentType=='image')
setStylesheet("#lightBoxContent img{height:100%;width:100%;}","lightBoxImageSizeHack");
}
},
showProgress : function()
{
var progress = document.getElementById("lightboxprogress");
progress.style.display='';
this._center(progress);
},
hideProgress: function()
{
var progress = document.getElementById("lightboxprogress");
progress.style.display='none';
},
//this function lifted from Lightbox Gone Wild
hideSelects: function(visibility)
{
var selects = document.getElementsByTagName('select');
for(i = 0; i < selects.length; i++)
{
selects[i].style.visibility = visibility;
}
},
showBg: function()
{
var overlay = document.getElementById('lightBoxOverlay');
if (config.browser.isIE)
{
overlay.style.height = Math.max(document.documentElement.scrollHeight,document.documentElement.offsetHeight);
overlay.style.width = document.documentElement.scrollWidth;
}
overlay.style.display = 'block';
},
showImage: function (url,text)
{
imgPreloader = new Image();
imgPreloader.onload = function ()
{
var lb = document.getElementById("lightBoxContent");
lb.innerHTML = "<img src="+url+">";
lb.onclick = function(){TiddlyLightBox.hideBox();return false;};
TiddlyLightBox.posBox(text);
};
imgPreloader.src = url;
},
showHtml : function(theID,text)
{
var lb = document.getElementById("lightBoxContent");
if (theID.indexOf("tiddler:")==-1)
lb.innerHTML = document.getElementById(theID).innerHTML;
else
{
wikify(store.getTiddlerText(theID.replace("tiddler:","")),lb);
lb.className='tiddler';
}
lb.style.overflow = "auto";
this.posBox(text);
},
posBox: function(text)
{
this.setTitle(text);
this.hideProgress();
var lb = document.getElementById("lightBox");
lb.style.display = "";
lb.style.visibilty = "hidden";
lb.style.position = "absolute";
this._center(lb);
if(!TiddlyLightBox._curBox) return;
lb.style.visibility = "visible";
lb.style.display = "block";
},
setTitle: function(text)
{
document.getElementById("lightBoxTitle").innerHTML= (text==undefined)? '': text;
},
_center: function(lb)
{
var lbSize = new TiddlyLightBox.getElementSize(lb);
lb.style.left = (Math.round(findWindowWidth()/2) - (lbSize.width /2) + findScrollX())+'px';
lb.style.top = (Math.round(findWindowHeight()/2) - (lbSize.height /2) + findScrollY())+'px';
},
//this function lifted from Ibox
getElementSize : function(elem)
{
this.width = elem.offsetWidth || elem.style.pixelWidth;
this.height = elem.offsetHeight || elem.style.pixelHeight;
},
hideBox: function()
{
if(!this._curBox)
return;
document.getElementById("tiddlyLightBoxWrapper").innerHTML= this.lightBoxHtml;
setStylesheet("","lightBoxImageSizeHack");
this._curBox = null;
return false;
}
}
TiddlyLightBox.createBoxWrapper();
Story.prototype.findContainingTiddler = function(e)
{
while(e && (!hasClass(e,"tiddler") || !e.getAttribute("tiddler")))
e = e.parentNode;
return(e);
}
config.shadowTiddlers.TiddlyLightBoxStyles="/*{{{*/\n#lightBoxOverlay {\n position:absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 90; \n background-color: #000;\n -moz-opacity: 0.75;\n opacity: .75;\n filter: alpha(opacity=75);\n}\n#lightBoxOverlay[id]{ \n position: fixed;\n}\n\n#lightboxprogress { \n margin:0;padding:0;\n position: absolute;\n z-index:95;\n}\n\ndiv.lightBox {\n background: #fff;\n color: #fff;\n border: 4px solid #525252;\npadding:20px 20px 25px 20px; position:absolute; z-index:99;\n}\n\n#lightBoxClose {text-align:right; color:#000; font-size:1.0em; position:absolute; bottom:6px; right:20px;}\n#lightBoxClose a{color:#666; border-bottom:1px solid #666;cursor:pointer;}\n#lightBoxClose a:hover {color:#111; border-bottom:1px solid #666; cursor:pointer; background:transparent;}\n\n#lightBoxContent {border:1px solid #525252;color:#000; background:#fff;}\n#lightBox .tiddler {background:#fff;}\n\n#lightBoxContent img {border:0;margin:0;padding:0;display:block;cursor:pointer;}\n\n#lightBoxTitle {padding:0px; font-weight:bold; position:absolute; left:20px;bottom:6px; font-size:1.1em; color:#000;}\n\n/*}}}*/";
//}}}
[[About]]<<tag HowTo>><<tag training>><<tag grading>><<tag support>><<tag intro>>
<html>
<iframe src="http://www.google.com/calendar/embed?showPrint=0&showCalendars=0&showTz=0&mode=AGENDA&height=480&wkst=1&bgcolor=%23ffffff&src=d9r42g8gq3n5qf6gl92invd0ng%40group.calendar.google.com&color=%23A32929&ctz=America%2FNew_York" style=" border-width:0 " width="640" height="480" frameborder="0" scrolling="no"></iframe>
</html>
For the course //~JAPN303 - Advanced Japanese Speaking// you will be recording phrases on the computer and uploading into the Moodle course. Yasumi has written the instructions for what to record in each assignment. What follows is the 'how' to record your voice to a digital file and then upload the file to the assignment.
<<tiddler [[Recording with Audacity]]>>
!! Uploading into the Moodle course
Having recorded the phrases for your assignment:
# Click on the appropriate Pronunciation Assignment in the Moodle course ''Advanced Japanese Speaking''
# Browse to My Documents
# In filename field type ''*.mp3'' to display the audio files only and
# Select the appropriate file. Click Open.
# Click Upload this file. You should see the response //File uploaded successfully// and then [Continue]
** Once the file has been uploaded, clicking on it will attempt to open it up in iTunes.
# That's all
We now have a more orthogonal way of naming courses so that they will be easily identifiable.
> {{{Short name = [dept][course #]:[graduation year][semester code]}}}
where [semester code] = 10 for ''Fall semester'' and = 20 for ''Spring semester''
examples:
> ~MATH120:200810 is the ~MATH120 course held in Fall 2007
> ~BIOL111-3:200810 is section 3 of ~BIOL111 (Eco Bio) from Fall 2007
Note that where there iis only a single section, the number '-1' is omitted, otherwise the section number is appended as shown.
<<faqlist byTag del.icio.us title hr>>
<html>
<h1 id="id8">Social Bookmarking with Del.icio.us : Getting Set Up</h1>
<p>Have you ever been in a situation where you've been using a Lab computer and have found a really useful website? But all your Firefox bookmarks are on your personal machine in the dorm. I'll bet you end up emailing the <span class="caps">URL</span> to yourself and then having to open it up on your laptop.</p>
<p>What if you could bookmark a web site and have it available anywhere? And tag it with some keywords to make it easy to find? And then find web sites that other people have bookmarked with the same tag? </p>
<p>You can do all this with the social bookmarking site <a href="http://del.icio.us">del.icio.us</a> . Del.icio.us documentation is here: <a href="http://del.icio.us/about/">What's it all about?</a></p>
<h2 id="id9">1. Register for an account</h2>
<p>For the purposes of this class you will create a single account for each group of three students. This account can have any name. So, the first thing to do is to agree upon a name to use for your del.icio.us account and a password that you all will use (do not use anyone's Earlham password). Note: this certainly does not prevenet you from creating your own personal delicious account.</p>
<ol>
<li>Browse to <a href="http://del.icio.us">del.icio.us</a> and click on the Register link.</li>
<li>In the <strong>username</strong> field type the account name you have agreed upon. If the name is in use by someone else you'll have to modify it.</li>
<li>Type in the password and then do it again. Make it memorable, short and <strong>not</strong> a password you use elsewhere.</li>
<li>Type in the email address of one person in the group — this may be an earlham.edu address or google mail or yahoo mail. Mail collection on gmail is a lot faster than at earlham.edu.</li>
<li>Type in the letters shown and click email (an anti-spam measure)</li>
</ol>
<p>To make sure that real users are joining the site (and not spammers) delicious sends an email to the email address which you then click on to activate the account. This is fairly commonplace with web sites that require registration.</p>
<h3 id="id10">Example.</h3>
<p>Spiggy Topes' group The Turds registers with the username 'SpiggyTopes' :</p>
<p><img src="graphics/register_delicious.png" /></p>
<h2 id="id11">2. Install delicious toolbar buttons</h2>
<ol>
<li>Make sure the Bookmarks toolbar is displayed. Select View -> Toolbars & Bookmarks toolbar should be checked.</li>
<li>Go to the del.icio.us help page and then to <a href="http://del.icio.us/help/buttons">bookmarklet buttons for any browser</a></li>
<li>Drag 'post to del.icio.us' and 'my del.icio.us' buttons and drop them individually onto the bookmarks toolbar.</li>
<li>If you are using Firefox on your own machine (PC or Mac) you can install the <a href="http://del.icio.us/help/firefox/extension">firefox extension</a> which will make life a lot easier.</li>
</ol>
<h2 id="id12">3. Activate del.icio.us account</h2>
<p>Although the process of registering to delicious does log you in, you still need to activate your account. Here's what to do:</p>
<ol>
<li>In a new browser tab, open up squirrelmail (or the webmail location for the email address you used, eg gmail).</li>
<li>You should find a message from 'del.icio.us Verification' with the subject 'Please Complete Your del.icio.us Registration'. (If you don't see this, either it's been filtered into spam or it has not been received yet).</li>
<li>Open up the message and you can safely click on the link provided.</li>
<li>This will take you to the Verify page where you can add buttons again if you forgot before.</li>
</ol>
<h2 id="id13">4. Let your comrades know</h2>
<ul>
<li>Send an email to the other members of your group with the group's username and password. Now you can all log on at the same time!</li>
</ul>
<h2 id="id14">5. Add other group names to your delicious 'network'</h2>
<p>Back to the delicious tab:</p>
<ol>
<li>from the list in the delicious wiki or on the board, add the other delicious groups to your network
<ul>
<li>Click 'your network' and enter name. Click add.</li>
</ul>
</li>
</ol>
<p>You are now ready to bookmark socially!</p>
</html>
The social bookmarking site, [[del.icio.us|http://del.icio.us]] is ideal for discovering quality web sites since people usually only bookmark sites they consider to be worthwhile.
You can easily find useful sites by expressing your search in the form of a tag or combination of tags. For example, finding blogs about a topic is quite easy:
* Browse to del.icio.us, and login.
* in the search box type in ''blog+gardasil'' and click Search to find relevant blogs
* to see all websites tagged with ''gardasil'' click the tag underneath the 'Evil Slutopia' link.
* click the //save this// link to save the page in your own bookmarks and tag it with your own tags (you might add the class tag for example).
* That's it!
<html>
<h1 id="id7">Using <span class="caps">RSS</span> with del.icio.us</h1>
<h2 id="id8">Sharing tagged bookmark lists using <span class="caps">RSS</span></h2>
<ol>
<li>On 'your favourites' page find the tag you want to share, eg <span class="caps">GEOS211</span> tag. You will see at the top of the page:
<p><img src="graphics/delicious_markp_geostag.png" /></p>
</li>
<li>Click on the <u>all</u> link:
<p><img src="graphics/delicious_all_geostag.png" /></p>
</li>
<li>At the bottom of the page is the <span class="caps">RSS</span> feed button:
<p><img src="graphics/delicious_rss_geostag.png" /></p>
</li>
<li>Rt-click on this and Copy Link Location</li>
</ol>
<p>Now you can use the <span class="caps">RSS</span> block in your Moodle course to display these links which refresh every time the list is updated.</p>
</html>
<html>
<h1 id="id7">Social Bookmarking with Del.icio.us : Using del.icio.us</h1>
<ul>
<li>Browse to a web site of interest — eg <a href="http://www.nps.gov/">http://www.nps.gov/</a></li>
<li>Find a page relating to a National Park you may travel to.</li>
<li>Click the 'Post to delicious' bookmark
<ul>
<li>add any notes that you wish</li>
<li>in the tags field type in any descriptor tags you feel apply to that site. Single words separated by spaces.</li>
<li>Add the <span class="caps">GEOS211</span> tag so that this can be shared by the class</li>
</ul>
</li>
</ul>
<p><img src="graphics/delicious_bookmark.png" /></p>
<p>As you bookmark more sites your store of tags will grow and you'll find that many are also used by other people.</p>
<h2 id="id8">Finding out what other people have tagged</h2>
<p>Delicious can be as good a way of finding quality web sites as Google since sites that are tagged are often of high quality.</p>
<ul>
<li>Go to the delicious main page and type 'geology' into the search field and hit search. Compare results with a Google search. Which gets the better results?</li>
<li>Now try 'geology+Indiana' and you'll find all the sites containing these two tags. </li>
<li>Now try 'feldspar' and see what you get. You can add this to you personal bookmarks by clicking 'save this'.</li>
</ul>
<h2 id="id9">Settings</h2>
<p>You can do a lot of useful things here.</p>
<ul>
<li>import bookmarks allows you to upload and import your current bookmarks into delicious and tag them there.</li>
<li>list delicious tags in your blog or Moodle.</li>
</ul>
<h3 id="id10">Your Network</h3>
<p>Click 'your network' and add the other groups. Now you'll be able to see what they have bookmarked and tagged.</p>
</html>
//{{{
config.macros.version.handler = function(place)
{
createTiddlyElement(place,"span",null,null,version.major + "." + version.minor + "." + version.revision + (version.beta ? " (beta " + version.beta + ")" : "") + (version.build ? " (build #" + version.build + ")" : ""));
};
readOnly = false;
config.options.chkBackstage = true;
config.macros.changeMode.lingo.modeName[''] = 'Admin';
config.options.txtRssTag = 'toRSS';
config.options.chkGenerateAnRssFeed = true;
//}}}