! Before you Start\n* 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.\n! Powerpoint setup\n# Adjust your working space to create more room by removing fluff. 3 panes:\n** Sidebar : tabs Outline | Slides\n** Slide display\n** Notes\n# Know which toolbars you have active.\n** Standard\n** Formatting\n** Draw\n** PDF
!!Install Skype\n# browse to http://skype.com\n# download the version for your OS\n# Do the 1,2,3. Note that you need administrator privs to install on Windows XP or Mac OS X.\n# Create a Skype account -- use <first name><last name>. The name may be taken so, try <firstname><middle initial><last name>. Or add a number at the end. You can use your earlham email address, but do ''not'' use your Earlham password -- think of another memorable one.\n# Fill in the rest of the fields especially the State you're in (IN) not the 'state' you're in.
<html>\n\n<h3 id="id4">Visibility</h3>\n\n<p>Both students and faculty have expressed a desire not to have to see all of last semester's courses when they log in to Moodle. Currently, the courses that you teach or are enrolled in appear listed in your "Overview of my courses" page (note the <span class="caps">URL</span> : https://moodle.earlham.edu/my ). Moreover, all the Assignments and Forums that have been set are listed within each course. This makes for a rather cluttered page.</p>\n\n<p>Note that the category that each course is in does not appear on this page — moving the courses to a different category (eg Archives) does not affect their visibility. </p>\n\n<p>For students there are two options : </p>\n\n<ol>\n <li>Make course unavailable to students. This is the simplest option and is achieved by going to Administration:Settings and changing Availablity to 'This course is not available to students'. The course then disappears from the student's Overview of my courses page. However, if there are assignments or forums present in the course it will still be visible as before to the faculty — only if there are none of these will the course name link turn to grey.</li>\n <li>Unenroll all students. This involves opening Adminstration : Students, selecting all the students and clicking -> . You will end up with 0 enrolled students. But, here again, the course will still be visible to faculty. When students are unenrolled from the course the following information is deleted:\n <ul>\n <li>All forum posts made for that course</li>\n <li>All assignment documents uploaded into the course</li>\n <li>Any grading information</li>\n <li>Any information about the student particular to that course (eg access logs)</li>\n </ul>\n <p>The course can be setup so that students are automatically unenrolled after a certain number of days from it's starting point. This may be the most convenient way to operate.</p>\n </li>\n</ol>\n\n<p>For faculty there are also two options to make a course not appear on the Overview of my courses' page:</p>\n\n<ol>\n <li>delete it entirely (after backing up of course) or </li>\n <li>remove the teacher from the list of assigned teachers (Adminstration : Teachers).</li>\n</ol>\n\n<p>These have implications for retrieval and access of old courses, archiving together with course ownership, and course creation.</p>\n</html>
!! Using Skype\n* To find a Skype partner you should do a search. Look for the person's email address in Indiana. \n* Look through Tools -> Options and switch the video off for the time being. Most students won't have video capabilities.\n* To change your password select File -> My Skype Account -> Change password\n
<html>\n<h3 id="id5">Retrieval / Access for old courses</h3>\n\n<p>My original thought was that all courses not currently being taught could be moved to an 'Archive' category. The students would be unenrolled (or the course made unavailable to them) and faculty could easily 'import' the contents of a previous course into the current one if desired. The new [[id system|Banner termcode]] guarantees that each course is unique and would help in finding the old course.</p>\n</html>\nThe layout would look something like:\n[img[graphics/archive_cat.png]]\n{{{JPNS343:0710 Modern Japanese Literature}}}\n
!! Troubleshooting problims\n* Installation. Make sure that you have administrative priviliges on the PC/Mac you're installing on.\n* Sound. Don't use the internal speakers because you will get feedback from the microphone. Use a headset or earbuds. Make sure that your PC/Mac system has the right sound input/output enabled.\n* no sound at all. The microphone on the headset may be muted.\n* 'choppy' audio or connection problems. Fill in the [[Skype problem report]].
!!!Archiving\nWhy archive a course? So that it can be reused at a later date. We are probably not interested in the old student data so the backup can be made without student data (or better, students are unenrolled before archiving) but we do want to have a record of ownership of the course, ie who was the original creator. (This has implications for course assessment by FAC as well).\n\nThe archiving process could involve making backups of the course ''with'' student data as well as without. If it were possible to 'hide' old courses from view these could be retained online for easy reuse.\n\nBefore the course backup (with or without user data) the course would need to be renamed so that the year and semester it was taught could be easily determined without having to open it up. This can be achieved by prepending the [[Moodle course id]] to the beginning of the Title. Thus "Principles of Chemistry L and L 10am" would become "CHEM111-2:0710 Principles of Chemistry L and L 10am"
<html>\n<h3 id="id7">Processes and Course Creation</h3>\n\n<ul>\n <li>Access to old or archived courses is only really needed at the point that the course is created. Although <span class="caps">FAC</span> might need to gain access to old archived courses (would they need student data for these courses as well?)</li>\n <li>There needs to be an automated system that backs up a course at the end of the semester, hides it from students (or unenrols them), archives in some known place and then gives faculty the option of deleting it to remove it from their sight</li>\n <li>At the point that a faculty needs a new course it would be good to have an interactive system that:\n <ol>\n <li>presents a list of courses being taught in the following semester to choose which one to create. Course named and ided automatically.</li>\n <li>Option for Weekly or Topics outline (can be changed later)</li>\n <li>Option for enrolling pre-registered students.</li>\n <li>Option to import an archived course from a list presented. The list would consist of those courses taught by that prof in previous years (therefore the name of the teacher must appear in the filename of the backup file).</li>\n </ol>\n </li>\n</ul>\n</html>
!!Create slide presentation\nYou can use the OIV to assemble a series of JPG images (or JPEG2000) together images piulled from the ARTstor database itself.\n!!! Advantages compared to Powerpoint\n* View images side by side for comparison\n* Zoom in for extra detail\n!!! JPG settings\n* Medium quality, 1200 pixels on longest side (ht or width). Scale other side accordingly.\n* Class use by Prof : 150 dpi (dots per inch)\n* Student use : 96 dpi\n
!!Download the ARTstor Off-line Image Viewer (OIV) to your computer:\n# Finding ARTstor:\n## On the Earlham home page, select โInformation Services,โ then โLibrariesโ\n## On the Library page, โInformation Resources,โ select โAll Databasesโ\n## On the next page, select โARTstorโ\n## or go to [[ARTstor home page|http://www.artstor.org/info/]]\n# If you are accessing ARTstor from off campus you will be asked to enter your E.C. Username and password. click login\n** Read [[this note|http://www.artstor.org/info/using_artstor/use/remote_access.jsp]] about Remote Access and the Offline Image Viewer (OIV)\n# On the ARTstor front page that comes up, click [Launch] on the right of the page\n# On the ARTstor Search page, on the right, first time, click [register] and follow onscreen instructions to register as an ARTstor user. If you cannot remember your password click the [password] link. \n# After you have registered the first time, click [Logon] on the home page and provide logon information.\n** Note that the browser ''will not'' save the login information.\n# Now select Tools -> Download Offline Viewer. Accept Terms and Conditions and follow the onscreen instructions to download the viewer to your computer.\n\n----\nThanks to Mike Thiedeman <<email thiedmi at earlham dot edu>> for the content
!!Install the Offline Image Viewer (OIV)\n* Find where you saved the OIV installer file (OIV_2.6_Win_Install.zip) or (OIV_2.6_Mac_Install.zip)\n* Double-click and follow the installation instructions.\n* If the OIV fails to start up it may be that you don't have Java installed on your PC/Mac. Check the \n<<tiddlerbox "system requirements" "ARTstor : system requirements OIV" "System requirements for running Offline Image Viewer">>\n----\nThanks to Mike Thiedeman <<email thiedmi at earlham dot edu>> for the content
!!Offline Image Viewer : System requirements\nThe system requirements are listed [[here on the Artstor site|http://www.artstor.org/info/using_artstor/tech/system_requirements.jsp]].\nBasically, you need :\n* Java system installed. Use the [[java tester|http://javatester.org/version.html]] to see whether your machine has Java. Download [[Java for Windows|http://java.com/en/download/windows_xpi.jsp]]. Java is built in to Mac OS X.\n* Flash Player\n* Popup blocking disabled for www.artstor.org\n* Cookies enabled.\n\nYou will ''not'' be able to run the Offline Image Viewer on Windows 95, 98 or ME or Mac OS-9 or earlier.
!!Viewing collections of images from Moodle using the OIV:\nIn Moodle, simply click on the ARTstor collection in a given block. The OIV presentation of images will be downloaded to your computer desktop. Use the OIV to open the collection of images and to view them. It is an excellent tool.\n\n!!Searching ARTstor for images:\nOn the ARTstor home page, logon, then enter your search term and run a search.\n\nARTstor is still in its infancy at this time, so it is somewhat uneven in coverage and quality, although it is being improved constantly. Some areas are well covered, others are covered inadequately or not at all at this time. You will want to explore to find what is available that you might find useful now.\n\nE.g., from the first unit of this course, Japanese Arts, entering the term โHoryujiโ will bring up a very comprehensive collection of images, about 250 images! On the other hand, the term โMurojiโ will bring up only one image at this time.\n\n----\nThanks to Mike Thiedeman <<email thiedmi at earlham dot edu>> for the content
!ARTstor with Mike Thiedeman\n\n<<faqlist byTag ARTstor title hr>>\n\n----\nThanks to Mike Thiedeman <<email thiedmi at earlham dot edu>> for the content
!!1. Create Assignment\nAdvantages of [[Advanced uploading files]]\n# When creating the assignment, choose //Advanced uploading of files//\n# Make sure to state explicitly the number of submissions required.\n!!2. Grading and downloading as Zip\n# Open the assignment and click the link //View n submitted assignments//\n* You'll see a grading screen like [[this|graphics/Test_ZIP_submissions_grading.png]]<<imagebox>>\n* To download all the student's submitted files, click ''Zip and download all submissions''\n<<<\n!!!Note:\n* 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.\n* 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">>\n<<<\n* Click the 'Grade' link for the submission you want to grade.\n## 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.\n## 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">>\n## Click 'Save and show next' button.\n## When you have finished click the 'Save all my feedback' for good measure.\n!!3. What the student sees\nWhen 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>>\n!!4. 'Quick' grading\nChecking 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:\n# @@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.\n# 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.\n
!!Features\nThe most flexible assignment type is "Advanced uploading of files". This enables a number of useful features:\n* Multiple file submissions - +++[caveat]>\nNote 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.===\n\n* Ability for the student to delete files uploaded by mistake and re-upload the correct file. \n* The //Notes// allows students to state their excuses along with their submitted files.\n* 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'' ">>\n* Teachers have the option of marking up the submitted files and returning them to students.\n* Note that the "Upload single file" choice does not allow any of these options.
!! Setting up Arabic on Windows XP\nIn order to input Arabic characters from right to left and 'joined up' you need to set up your system:\n# Select Start -> Settings -> Control Panel -> Regional and Language Options.\n# ''Regional Options'' tab . Customize :- Arabic(Jordan)\n# ''Languages'' tab. Details : Text Services and Input Languages : [[Settings -- choose Arabic|graphics/arabic_settings.png]]<<imagebox>> (Jordan)\n!! Using Arabic\n* Choose [[AR from the taskbar|graphics/arabic_language_bar.png]]<<imagebox>>\n* OR press <Alt><Shift> to bring up the AR symbol
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?). \nAdvantages:\n* Can be flexible about offline, online or inline types of assignment.\n* Can enforce due date.\n* 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.\n!!!Suggested procedure:\n* You'll often have your assignment as a document -- just copy the text and paste it into the assignment Description box.\n* Include specific directions for students to either upload the document or print it out and hand in.\n* Make sure that you are explicit about the due date. You can prevent late entries if you want to.\n
|>|>|>|>|>|>| !August 2007 |\n|Su|Mo|Tu|We|Th|Fr|Sa|\n||||1|2|3|4|\n|5|6|7|8|9|10|11|\n|12|13|!14|15|!16|!17|18|\n|19|!20|21|22|23|24|25|\n|26|27|28|29|30|31||\n\n|!Day|!Date|!time|!duration|!Location|!Topic|\n|Tues|Aug 14|10 am|2 hrs|Bolling PC Lab|[[Introduction to Moodle]]|\n|Thurs|Aug 16|2 pm|2 hrs|''Wildman PC Lab''|[[New features|New Features Session : 8-16-07]]|\n|Fri|Aug 17|10 am|2 hrs|Bolling PC Lab|Advanced|\n|Mon|Aug 20|2 pm|2 hrs|Bolling PC Lab|Refresher -- new features|\n\n!!! Introduction to Moodle\nFor :\n> New teaching faculty, teachers wanting to use Moodle for the first time, those wanting a refresher\nCovers: \n* What Moodle can do for your course [[Moodle : Benefits]]\n* Assessment of instructional technology appropriate to how you want to teach your course - [[Course Technology Inventory|CTIF]]\n* [[Getting going|Getting Started]] with your course\n!!! New features\nFor :\n> Faculty who have used Moodle or done the Intro session\nCovers:\n* New features of Moodle (eg upload & review Assignment type, Roles & capabilities)\n* How to recycle last year's course\n* Scanning tips and tricks to make your resources more student friendly.\n!!!Advanced\n* Moodle and blogging -- the Earlham's [[new blogging system|http://elgg.barnabas.earlham.edu]], Elgg.\n* How [[Social Bookmarking|del.icio.us FAQ]] can enhance web research projects\n* Using [[Moodle Wiki|Wiki FAQ]] for group projects\n* Discussion Forums and Groups
A unique label used in the Banner system consisting of:\n\n<graduation year><semester code>\n\nwhere semester code: \n| 10 | Fall semester |\n| 20 | Spring semester |\n\nThus 200610 is the Fall semester 2005, and 200720 is the Spring semester 2007.
<<faqlist byTag best_practices title hr>>
!EC blogs\n* [[Signing up]]\n* [[set up account]]\n* the [[Toolbar|ECBlogs : Toolbar]]\n\n<<faqlist byTag ECBlogs hr>>\n
<html>\n<h1 id="id1">Course Technology Inventory Form (CTIF) for Faculty </h1>\n\n<p>This form is to help you decide what "technology" you want to use.</p>\n<!-- here's where the form hidden fields are hidden -->\n<form name="CTIF" method="post" action="http://www.earlham.edu/jb-cgi/jitterbug-report-form.pl">\n <input type="hidden" name="notify_email" value="vromano@knox.edu">\n <input type="hidden" name="jitterbug_email" value="vromano@knox.edu">\n <input type="hidden" name="subject" value="Course Technology Inventory Form (CTIF)">\n\n<h3 id="id2">General</h3>\n\n<table cellpadding="5" cellspacing="0">\n<tr>\n <td>Course name :</td><td><input type="text" name="course_name" size="30"></td>\n</tr> \n<tr><td>Course code :</td><td><input size="30" type="text" name="course_code"></td>\n</tr>\n</table>\n<h3>Schedule :</h3>\n<table cellpadding="5" cellspacing="0">\n<tbody>\n <tr>\n <td colspan="5"> daily classes (check all appropriate) :</td>\n </tr>\n <tr>\n <th> Mon</th>\n <th> Tue</th>\n <th> Wed</th>\n <th> Thurs</th>\n <th> Fri</th>\n </tr>\n <tr align="center">\n <td><input type="checkbox" name="course_day" value="Monday"/></td>\n <td><input type="checkbox" name="course_day" value="Tuesday"/></td>\n <td><input type="checkbox" name="course_day" value="Wednesday"/></td>\n <td><input type="checkbox" name="course_day" value="Thursday"/></td>\n <td><input type="checkbox" name="course_day" value="Friday"/></td>\n </tr>\n</tbody>\n</table>\n\n<h2 id="id3">Moodle</h2>\n\n<p>In what ways would you like to use Moodle with your course? The following suggestions provide some options you may wish to explore:</p>\n\n<h3 id="id4">Make resources available outside of class time.</h3>\n<p>Check all applicable</p>\n<input type="checkbox" name="resources" value="syllabus"/>Syllabus\n<br /><input type="checkbox"" name="resources" value="handouts"/>Course handouts\n<br /><input type="checkbox" name="resources" value="instructions"/>Instructions for course readings\n<br /><input type="checkbox" name="resources" value="scanned_documents"/>Scanned documents to be read\n<br /><input type="checkbox"" name="resources" value="powerpoint"/>Lecture Powerpoint presentations\n\n\n<h3 id="id5">Course Outline</h3>\n<p>Select the statement which most closely aligns with how you want to present your course</p>\n<input type="radio" name="outline" value="reflect_course">Make the outline reflect the way I want to teach the course.<br />\n<input type="radio" name="outline" value="just_syllabus">I just want to place my syllabus into the Outline to give students a guide for what's going on in the course<br />\n<input type="radio" name="outline" value="all_on_moodle">I want the Outline to reflect <strong>everything</strong> I do in the course. I plan to do all the course activities using Moodle.<br />\n<input type="radio" name="outline" value="display_readings">I want to use the Course Outline simply as a vehicle for displaying online readings.<br />\n<p>Other ways that you might employ the Course Outline :<br />\n<textarea cols="50" rows="5" name="outline_other"> </textarea>\n\n<h3 id="id6">Discussion Forums</h3>\n\n<p>Do you want to use Moodle's Forum activity?</p>\n<input type="checkbox" name="forums" value="discuss_problems"/>I want to have students post and discuss problems course material before/after class.\n<br /><input type="checkbox" name="forums" value="extend_discussion"/>I want to extend classroom discussion outside class time</li>\n<br /><input type="checkbox" name="forums" value="roleplay"/>Role play — students post as a historical / literary / positional character\n<br /><input type="checkbox" name="forums" value="response"/>One student posts and other respond to question (in groups)\n\n\n<h4 id="id7">Rate discussion postings</h4>\n<p>Postings can be rated (ie graded); this tends to improve the rate of particpation. Each discussion Forum can be rated separately</p>\n\n<input type="checkbox" name="rating" value="group"/>by other students in group\n<br /><input type="checkbox" name="rating" value="ta"/>by T.A\n<br /><input type="checkbox" name="rating" value="faculty"/>by faculty\n<br /><input type="checkbox" name="rating" value="not_rated"/>posts not rated (Note : unmonitored discussion forums don't tend to get used)\n\n<h4 id="id8">Rating Scale:</h4>\n<p>If you want to rate postings, what scale would you like to use?</p>\n<input type="radio" name="scale" value="numeric"/>numeric (eg 1-10)\n<br /><input type="radio" name="scale" value="designed"/>a scale I make up (eg Perfect, on the right track, not acceptable)\n<br /><input type="radio" name="scale" value="unrated"/>no scale because not rated.\n<p>\nSelf designed scale : <input size="50" name="scale_self" type="text">\n</p>\n<h4 id="id9">Forums and groups</h4>\n<p>If you plan to use groups with your discussions there are two options:</p>\n\n<select name="forum_groups">\n <option value="separate_groups">I want students to see postings from only their own group (separate groups)</option>\n <option value="visible_groups">Discussion postings from all groups should be visible (visible groups)</option>\n</select>\n\n<h3 id="id10">Group work</h3>\n<p>There are many options when it comes to working with groups on Moodle</p>\n<input type="checkbox" name="group_work" value="choice_activity"/>I'd like students to be able to choose their fellow group members (Choice activity)<br />\n<input type="checkbox" name="group_work" value="create_groups"/>I want to create groups and allocate students myself (Administration : groups)<br />\n<input type="checkbox" name="group_work" value="change_composition"/>I want to change group composition midway through the semester (can't be done)<br />\n<input type="checkbox" name="group_work" value="upload_project"/>I want students to be able to upload a group project as a group.<br />\n<input type="checkbox" name="group_work" value="wiki"/>I want to have students create a group web site (wiki)\n\n\n<h3 id="id11">Peer Review</h3>\n<p>Student's reviewing each other's work is known to be very pedagogically effective</p>\n\n<input name="peer_review" type="radio" value="group_non">I want groups to review each other's work (Forum:groups -- non-anonymous)<br />\n<input name="peer_review" type="radio" value="indiv_non">I want individuals to review each other's work (Forum / Wiki -- non-anonymous)<br />\n<input name="peer_review" type="radio" value="anon">I want students to review each other's work <strong>anonymously</strong> (Workshop)\n<p> </p>\n<p>Your name : <input name="faculty_name" size="40" type="text">\n<p>Your email address : <input name="faculty_email" size="40" type="text">\n\n<p><input type="submit" name="submit" value="Submit Form"> \n <input type="reset" name="reset" value="Clear Form"></p>\n</form>\n</html>
Background: #fff\nForeground: #000\nPrimaryPale: #E3DFD4\nPrimaryLight: #C7A896\nPrimaryMid: #7C0800\nPrimaryDark: #7C0800\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #333\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
This is an email from Barry Bandstra to the NITLE-IT mailing list on 12/20/06:\n<<<\nHope College has been using Moodle since Fall 2003 and and we have retained all the courses and users in existence since then within one instance of it. That amounts to a few hundred courses by now and more than 5,000 users. We're probably crazy, but it has worked so far and the system response is as snappy as ever.\n\nIn order to keep things navigable, we divide our course categories into academic divisions, then departments, then courses. We keep all the courses of the current semester within this structure. In addition, we have a category called "Archived Courses" and sub-categories within that designed by term (e.g. Fall 2006, Summer 2006, Spring 2006). When a term is finished (as is Fall 2006 as of right now), we move those courses into the archive category.\n\nThis approach has the advantage of keeping past materials readily available for faculty, as well as student data in those courses. When an instructor wants to reuse a past course, either he/she or tech support uses Backup/Restore to create a complete clone of the earlier course minus user data, it gets renamed, and becomes the current course. All the while the past course remains completely intact. Having all the courses in one place makes them easily accessible, and faculty and student profile data carries over from one semester to the next. Once the third-party portfolio module matures to the point we can use it, having students records all there will be very beneficial for multiple reasons, including assessment.\n\nAn interesting use of the course archive just came up a few weeks ago. Our foreign language programs are currently preparing for their State of Michigan program accreditation in connection with teacher education. The State wants to see course syllabi. For our Latin, French, German, and Spanish courses in Moodle we are just giving them URLs, and with guest access without the key turned on, the accreditors can view the syllabi, including supporting documents. Not that this couldn't be done if there were multiple instances of one's LMS for past semesters, but this makes it very straightforward.\n\nOne of the questions we ask ourselves is, how long can we keep adding records to the database (MySQL for us) before we start seeing performance degradation. That may be the biggest issue we'll have to deal with regarding our strategy. But so far so good.\n\nBTW -- you can go to http://courses.hope.edu if you wish to see our directory structure (as well as any courses that allow guest access without the key).\n<<<
!!How Moodle can help manage your course.\n* syllabus -- view syllabus as a timeline (weekly format) or as collection of topics (Topic outline)\n* making web resources, copyrighted articles, scans from books, periodicals etc available \n* putting handouts online for easy access\n* getting in touch with all your students\n** News Forum\n** Profiles / Messaging\n* 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, \n* Reminding students of classwork and homework.
!!Moodle Course page\nGet rid of inessential visual distractions. Present the Course Outline to highlight the important stuff for students to pay attention to:\n* delete blocks you're not using.\n* shuffle blocks to one side (left or right). Convert 3 col to 2 column layout\n* 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]\n!!Integrate Moodle use into course syllabus\nBe 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.\n* refer to [[Moodle in class]]\n* when you add a resource or assignment, be sure to inform your students via the [[News Forum|News Forum for class announcements]]\n* try to follow the [[Resources : Best Practices]]\n!!Homework assignments / grading\n* try to follow [[Assignments : Best Practices]]\nThe Moodle gradebook operates only with assignments or other Moodle Activities. \n* You can create a 'dummy' offline activity hidden from students to record in class participation\n* 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.\n\n'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:\n\n| Assignments |Inline, Offline, Online, Upload and Review |\n| Chat |synchronous online chat room to talk with students |\n| Choice |Quick poll (to choose groups or whatever) |\n| Forum |online Discussion forum |\n| Glossary |create searchable list of definitions |\n| Lesson |Display content with brief questions to test comprehension |\n| Quiz |Mulitple choice, short answer, many other formats. Use for testing or revision |\n| Wiki |Electronic whiteboard. The best way to accomplish a group web site. |\n| Workshop |Peer assessment activity. Students assess and grade each other's work |\n\nStudents found the Course Outline helpful:\n[img[http://www.earlham.edu/~markp/cms/evaluations/moodle_fall_04/Q8.png]]\nfrom [[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.\n\nThe Course Outline comes in two major forms:\n# Weekly\n# Topics\nChoosing which Outline to use:\n!!!1. Weekly outline\nThe 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.\n!!!2. Topics outline\nHere 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]]\n!!How to choose the Outline\nOn the main course page click Administration : Settings:\n* 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>>\n* 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.\n* Don't forget to Save changes.\n!!Changing the number of topics/weeks\nYou 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:\n!!!!before formatting \n[img[graphics/before_refresher_small.png][graphics/before_refresher.png]]<<imagebox "Course Outline before formatting">>\n\n!!!!after formatting\n[img[graphics/after_refresher_small.png][graphics/after_refresher.png]]<<imagebox "Course Outline after formatting">>\n\n''FORMAT'' for readability:\n* use headings -- the example uses heading 2 (h2)\n* don't be afraid to leave blank lines create white space\n* make liberal use of bullet / number lists\n* 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)\n
<<faqlist byTag Outline title hr>>
!!A. What you need before restoring\n# A Moodle course to restore into. If this does not already exist contact Neal Baker, Amy Bryant or Mark Pearson.\n# The name of the course you want to restore\n# The ''id'' and ''number'' of the course to restore -- eg WMNS375\n# The year that the course was used with moodle. So, academic year 07-08, 06-07, 05-06, etc\n!! B. Find the course backup file you want to use\nCourse backup naming convention. Here's a typical list of course backup files.\n{{{\n 63,290,342 backup-eng482_200820-20080730-0953.zip\n 32,823,477 backup-eng484_200810-20080730-0959.zip\n 9,370,517 backup-eng488_200820-20080730-1003.zip\n 4,624,021 backup-wmns150_200810-20080808-0945.zip\n 75,884,114 backup-wmns200_200810-20080808-0946.zip\n 33,181,677 backup-wmns375_200810-20080808-0946.zip\n 334,586,804 backup-wmns340_200810-20080808-0946.zip\n}}}\nThe filename can be broken down into:\n>{{{'backup'-<COURSE ID><COURSE #>_<YEAR><SEMESTER CODE>-<backup date and time>.zip}}}\nWhere semester code : 10 = Fall, 20 = Spring\n<<<\n''If your course backup zip file > 128Mb'' (eg~WMNS340 in the listing above) you will ''not'' be able to upload it in the restore process. The Moodle system admin will need to copy this file. Contact [[ITC member|Instructional Technology Collaborative]] for help.\n<<<\n!!C. Course Backup Locations\n;Academic year 07 - 08\n:look first in Groups on 'Rahu' G: ''old_moodle_courses'' +++[how do I get to Groups?]\n \n# On Windows: open Windows Explorer and \n**browse to Groups on 'Rahu' G:\n# On Mac : open Finder, \n** Select Go -> Connect to server and type in smb://rahu.earlham.edu. \n** You'll be invited to login with your Earlham username and password. \n**Select Groups to mount on the desktop\n\n=== Can't find it there? +++[here's what to do next]\n \n# Open [[moodle-old.earlham.edu|http://moodle-old.earlham.edu]] and login.\n# Open your desired course which should be listed\n# Open Administration:Files and then ''backupdata'' folder. \n# Click on the ZIP file and save it to your local drive.\n\n===\n\n; Academic year 06 - 07\n: Open [[moodle-old.earlham.edu/0607|http://moodle-old.earlham.edu/0607]]. Then follow +++[these instructions]\n \n# Login and open the course. \n# Open Administration:Files and then ''backupdata'' folder. \n# Click on the ZIP file and save it to your local drive.\n===\n\n;Academic year 05 - 06\n: Open [[moodle-old.earlham.edu/0506|http://moodle-old.earlham.edu/0506]] and follow the same instructions as above\n\nYou should now have the course that you want to restore either on your desktop or on G:\sold_moodle_courses\n!! D. Restore into this year's course\n# Navigate to this year's course.\n# In Adminstration block click the Restore link and browse & upload the file you have just saved.\n!!! Restore Process\nOn the backup file click the Restore link\n* Continue : yes\n* List of course components that will be restored. If you have made changes and want to add the restored stuff choose 'Restore to current course, add' otherwise delete the current course (the name will be retained). Choose None for User Data:\n> [img[graphics/restore_procedure.png]]\n> Other choices: User files : no, Course files : yes\n* Role mappings. Make sure you map the Teacher as shown:\n>[img[graphics/restore_procedure_role_mapping.png]]\nClick [Continue] , the screen fills with information about stuff restored. Finally, at the bottom of the screen you'll get [Restore Completed Successfully] and you've done it!\n\n!Problems?\nCheck out [[Problems with new Moodle]]\n\n
!!Course creation and restore : typical issues\nHere is a typical email:\n<<<\nMark,\n Find below the course numbers for the courses I will be teaching spring semester. I should have past Moodle Courses for Ancient and IP. The Topics Course: Socrates and the Tradition is new.\n\n~PHIL155/~CLAS155 : Ancient Greek Philosophy\n~INTP150 : Families, Friends and Enemies\n~PHIL480/~CLAS480 : Topic: Socrates and the Tradition\n<<<\nIssues arising:\n* All the Philosophy courses should already be present in the Moodle PHIL department listing. In fact, none are. \n!!!Ancient Greek Philosophy\n* Checking last year's Moodle [[0607:PHIL|https://moodle.earlham.edu/0607/course/category.php?id=37]] we find that Ancient Greek Philosophy is not there either. So, let's look in the [[0506 moodle|https://moodle.earlham.edu/0506/course/category.php?id=45]] where we do find it in the Philosophy category. But there's no course backup file:\n** Click Administration : Backups to create a course backup (no user data, no user files, uncheck all unused modules).\n** download this to local drive\n!!! Families Friends and Enemies\n* This course does not seem to exist either in [[0506 moodle|graphics/kevin_miles_courses_0506.png]] or [[0607 moodle|graphics/kevin_miles_courses_0607.png]].\n* This has however been created in Moodle 0708. [[INTP150-9|https://moodle.earlham.edu/course/view.php?id=587]] Check that the Teacher is correct (admin : Assign roles)\n* we'll create a 'backupdata' directory in Files and upload the Ancient Greek course backup into this. Then we can restore into the Philosophy category\n!!!Socrates and Tradition\n* We'll create this one from scratch:\n** Short name -- {{{PHIL480:200820}}} (<banner id>:<graduation year><semester> where 10=fall, 20=spring)\n** Full name -- {{{PHIL480:200820 - Topic: Socrates and the Tradition}}}\n** Weekly format, 16 weeks starting 6-Jan-2008\n** Assign roles : Teacher - search for username then ''<-''\n!!!Now let's:\n* Upload Ancient Greek course backup into ~INTP150-9\n** Go to Families ... Administration : Files : backupdata\n** Upload file : browse : upload course backup\n* Click Restore [[error -- screenshot|graphics/course_restore_error.png]]<<imagebox>>\n<<<\n!!!!Interlude : fix Backup Issues\n* go back to the course on 0506 Moodle.\n* this time we'll uncheck all the Activities that are not used [[screenshot|graphics/course_restore_km_2go.png]]<<imagebox>>\n* download to local drive, then upload back into Files: backupdata of INTP150-9 (we use the backupdata dir so that .ZIP files show up as restorable).\n<<<\n* Restore newly uploaded course backup [[it works|graphics/course_restore_success.png]]<<imagebox>> but since it's coming from v1.5 Moodle there may be UTF character issues.\n* Settings :\n** Restore to : New course (in Philosophy)\n** Short name : PHIL155:200820\n** PHIL155:200820 - Ancient Greek Philosophy\n** Course Start Date : 6 Jan 2008 (first Sunday of starting week)\n** role mappings : leave defaults\n* Go to the course and remember to ''Assign roles'' and add the Teacher (the teacher's name does not come across with the old course backup since we saved it with no user data (we didn't want all the student names))\n!!Tidying Up\n* Image links do break unfortunately since they are all absolute URLs linked to the old course id. The solution is to update the summary, click the HTML button <> and substitute the old course id (in this case '301') with the current one (792).\n* email the faculty telling what's gone on and informing him/her that the course backup he thought existed does not.\n
!!What do Moodle courses look like?\nHere are some examples:\n* [[simple topics outline|graphics/example_course_screens/simple_topics.png]]<<imagebox>>\n* [[simple topics formatted nicely|graphics/example_course_screens/simple_topics2.png]]<<imagebox>>\n* [[weekly outline|graphics/example_course_screens/weekly_outline.png]]<<imagebox>>\n* [[complex schedule with reading and listening|graphics/example_course_screens/complex_schedule_read_listen.png]]<<imagebox>>\n** [[flash audio player|graphics/example_course_screens/flash_audio_player.png]]<<imagebox>>\n* [[using graphics in Outline|graphics/example_course_screens/graphics_outline.png]]<<imagebox>>\n* [[japanese language with playlist|graphics/example_course_screens/audio_player_japanese.png]]<<imagebox>>\n* [[combining dates and topics|graphics/example_course_screens/combine_date_topics_outline.png]]<<imagebox>>\n* [[combining dates and topics -- another example|graphics/example_course_screens/combine_date_topics_outline2.png]]<<imagebox>>
!!STEP 1\nDecide whether you want to save all the student work which has been uploaded into your course, such as assignments, forum discussions or other stuff your students may have uploaded. This is termed user data. Probably you'll not want to save this user data. \nNote that if you are planning to restore the course in a new issue of Moodle you should ''not'' under any cicumstances save User data (the course may fail to restore or will restore with last year's students enrolled. Nasty)\n\n# Select Adminstration : backup\n# click [[None for user data|graphics/backup_nouserdata.png]]<<imagebox>>\n# Uncheck the [[following Activities|graphics/backup_options.png]]<<imagebox>> :\n** Chats\n** Databases\n** Hot Potatoes Quizzes\n** Journals\n** Lessons\n** ~SCORMs/~AICCs\n** Surveys\n** Wikis\n** Workshops\n** ''ULPGC Assignment'' (if present)\n# Pulldowns:\n** Metacourse: no\n** Users : none\n** Logs : no\n** User files : no\n** Course files : yes\n# click [Continue]\n!!STEP 2\n* The filename used for backup has the format : backup-<short name>-<year><month><day>-<time>.zip, for example backup-enpr_111-20050802-1550.zip. \n* If the short name does not contain the graduation year+semester (ie 200610 fall semester, 200620 spring semester) then add this. So enpr_111 becomes ~ENPR111:200610.\n* Do read the notice. Even though it may be in red type this is probably what you want to do. If you realize that you have made a mistake then click [Cancel] at the bottom of the page.\n> Backup Details: List of Activity types and number of instances.\n> A zero means that nothing was present and nothing gets backed up.\n*Click [Continue]\n!!STEP 3\nNow the system performs the backup job and writes the compressed data into the backup zip file shown in the previous step.\nWhen the job has finished you should see 'backup completed successfully'.\nClick [Continue]\n!!STEP 4\nThe backup file is now placed in the backup data folder within Files.\nTo download to your own computer:\n# Right-click (or Command-click Mac) on the backup file.\n# Choose Save Link As (Firefox) or Save Target As (I.E) and save in your My Documents or Documents folder.\n# The download may take some time depending upon the size of the backup file.\n
Here are some examples that show the usage of tiddler data, as provided by the DataTiddlerPlugin.\n<<forEachTiddler\n where\n 'tiddler.tags.contains("DataTiddlerExample")'\n>>\n
/***\n|''Name:''|DataTiddlerPlugin|\n|''Version:''|1.0.6 (2006-08-26)|\n|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nEnhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).\n\nSuch tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. \n\n''//Example: "Table with all December Expenses"//''\n{{{\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\n}}}\n//(This assumes that expenses are stored in tiddlers tagged with "expense".)//\n<<forEachTiddler\n where\n 'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'\n write\n '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\sn"'\n>>\nFor other examples see DataTiddlerExamples.\n\n\n\n\n''Access and Modify Tiddler Data''\n\nYou can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. \n\nThese values can be accessed and modified through the following Tiddler methods:\n|!Method|!Example|!Description|\n|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n\nAlternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.\n|!Method|!Description|\n|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|\n|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|\n|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|\n|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|\n|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|\n//(For details on the various functions see the detailed comments in the source code.)//\n\n\n''Data Representation in a Tiddler''\n\nThe data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. \n\n//''Data Section Example:''//\n{{{\n<data>{"isVIP":true,"user":"John Brown","age":34}</data>\n}}}\n\nThe data section is not displayed when viewing the tiddler (see also "The showData Macro").\n\nBeside the data section a tiddler may have all kind of other content.\n\nTypically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.\n\n\n''Saving Changes''\n\nThe "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.\n\n\n''Notifications''\n\nNo notifications are sent when a tiddler's data value is changed through the "setData" methods. \n\n''Escape Data Section''\nIn case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.\n\n\n''The showData Macro''\n\nBy default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:\n\n''Syntax:'' \n|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|\n|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|\n|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\n\n!Revision history\n* v1.0.6 (2006-08-26) \n** Removed misleading comment\n* v1.0.5 (2006-02-27) (Internal Release Only)\n** Internal\n*** Make "JSLint" conform\n* v1.0.4 (2006-02-05)\n** Bugfix: showData fails in TiddlyWiki 2.0\n* v1.0.3 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.2 (2005-12-22)\n** Enhancements:\n*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.\n*** Improved (JSON) error messages.\n** Bugs fixed: \n*** References are not updated when using the DataTiddler.\n*** Changes to compound objects are not always saved.\n*** "~</data>" is not rendered correctly (expected "</data>")\n* v1.0.1 (2005-12-13)\n** Features: \n*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed\n** Bugs fixed: \n*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)\n* v1.0.0 (2005-12-12)\n** initial version\n\n!Code\n***/\n//{{{\n//============================================================================\n//============================================================================\n// DataTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Ensure that the DataTiddler Plugin is only installed once.\n//\nif (!version.extensions.DataTiddlerPlugin) {\n\n\n\nversion.extensions.DataTiddlerPlugin = {\n major: 1, minor: 0, revision: 6,\n date: new Date(2006, 7, 26), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) {\n TiddlyWiki.prototype.getTiddler = function(title) { \n var t = this.tiddlers[title]; \n return (t !== undefined && t instanceof Tiddler) ? t : null; \n };\n}\n\n//============================================================================\n// DataTiddler Class\n//============================================================================\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nfunction DataTiddler() {\n}\n\nDataTiddler = {\n // Function to stringify a JavaScript value, producing the text for the data section content.\n // (Must match the implementation of DataTiddler.parse.)\n //\n stringify : null,\n \n\n // Function to parse the text for the data section content, producing a JavaScript value.\n // (Must match the implementation of DataTiddler.stringify.)\n //\n parse : null\n};\n\n// Ensure access for IE\nwindow.DataTiddler = DataTiddler;\n\n// ---------------------------------------------------------------------------\n// Data Accessor and Mutator\n// ---------------------------------------------------------------------------\n\n\n// Returns the value of the given data field of the tiddler.\n// When no such field is defined or its value is undefined\n// the defaultValue is returned.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.getData = function(tiddler, field, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataValue(t, field, defaultValue);\n};\n\n\n// Sets the value of the given data field of the tiddler to\n// the value. When the value is equal to the defaultValue\n// no value is set (and the field is removed)\n//\n// Changing data of a tiddler will not trigger notifications.\n// \n// @param tiddler either a tiddler name or a tiddler\n//\nDataTiddler.setData = function(tiddler, field, value, defaultValue) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler+ "("+t+")";\n }\n\n DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);\n};\n\n\n// Returns the data object of the tiddler, with a property for every field.\n//\n// The properties of the returned data object may only be read and\n// not be modified. To modify the data use DataTiddler.setData(...) \n// or the corresponding Tiddler method.\n//\n// If no data section is defined a new (empty) object is returned.\n//\n// @param tiddler either a tiddler name or a Tiddler\n//\nDataTiddler.getDataObject = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.getTiddlerDataObject(t);\n};\n\n// Returns the text of the content of the data section of the tiddler.\n//\n// When no data section is defined for the tiddler null is returned \n//\n// @param tiddler either a tiddler name or a Tiddler\n// @return [may be null]\n//\nDataTiddler.getDataText = function(tiddler) {\n var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;\n if (!(t instanceof Tiddler)) {\n throw "Tiddler expected. Got "+tiddler;\n }\n\n return DataTiddler.readDataSectionText(t);\n};\n\n\n// ---------------------------------------------------------------------------\n// Internal helper methods (must not be used by code from outside this plugin)\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// The original JSONError is not very user friendly, \n// especially it does not define a toString() method\n// Therefore we extend it here.\n//\nDataTiddler.extendJSONError = function(ex) {\n if (ex.name == 'JSONError') {\n ex.toString = function() {\n return ex.name + ": "+ex.message+" ("+ex.text+")";\n };\n }\n return ex;\n};\n\n// Internal.\n//\n// @param t a Tiddler\n//\nDataTiddler.getTiddlerDataObject = function(t) {\n if (t.dataObject === undefined) {\n var data = DataTiddler.readData(t);\n t.dataObject = (data) ? data : {};\n }\n \n return t.dataObject;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {\n var value = DataTiddler.getTiddlerDataObject(tiddler)[field];\n return (value === undefined) ? defaultValue : value;\n};\n\n\n// Internal.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n var oldValue = data[field];\n \n if (value == defaultValue) {\n if (oldValue !== undefined) {\n delete data[field];\n DataTiddler.save(tiddler);\n }\n return;\n }\n data[field] = value;\n DataTiddler.save(tiddler);\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns its text\n// (as a String).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readDataSectionText = function(tiddler) {\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n if (matches === null || !matches[2]) {\n return null;\n }\n return matches[2];\n};\n\n// Internal.\n//\n// Reads the data section from the tiddler's content and returns it\n// (as an internalized object).\n//\n// Returns null when no data is defined.\n//\n// @param tiddler a Tiddler\n// @return [may be null]\n//\nDataTiddler.readData = function(tiddler) {\n var text = DataTiddler.readDataSectionText(tiddler);\n try {\n return text ? DataTiddler.parse(text) : null;\n } catch(ex) {\n throw DataTiddler.extendJSONError(ex);\n }\n};\n\n// Internal.\n// \n// Returns the serialized text of the data of the given tiddler, as it\n// should be stored in the data section.\n//\n// @param tiddler a Tiddler\n//\nDataTiddler.getDataTextOfTiddler = function(tiddler) {\n var data = DataTiddler.getTiddlerDataObject(tiddler);\n return DataTiddler.stringify(data);\n};\n\n\n// Internal.\n// \nDataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {\n var index = s.indexOf(subString, startIndex);\n while ((index > 0) && (s[index-1] == '~')) { \n index = s.indexOf(subString, index+1);\n }\n return index;\n};\n\n// Internal.\n//\nDataTiddler.getDataSectionInfo = function(text) {\n // Special care must be taken to handle "<data>" and "</data>" texts inside\n // a data section. \n // Also take care not to use an escaped <data> (i.e. "~<data>") as the start \n // of a data section. (Same for </data>)\n\n // NOTE: we are explicitly searching for a data section that contains a JSON\n // string, i.e. framed with braces. This way we are little bit more robust in\n // case the tiddler contains unescaped texts "<data>" or "</data>". This must\n // be changed when using a different stringifier.\n\n var startTagText = "<data>{";\n var endTagText = "}</data>";\n\n var startPos = 0;\n\n // Find the first not escaped "<data>".\n var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);\n if (startDataTagIndex < 0) {\n return null;\n }\n\n // Find the *last* not escaped "</data>".\n var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);\n if (endDataTagIndex < 0) {\n return null;\n }\n var nextEndDataTagIndex;\n while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {\n endDataTagIndex = nextEndDataTagIndex;\n }\n\n return {\n prefixEnd: startDataTagIndex, \n dataStart: startDataTagIndex+(startTagText.length)-1, \n dataEnd: endDataTagIndex, \n suffixStart: endDataTagIndex+(endTagText.length)\n };\n};\n\n// Internal.\n// \n// Returns the "matches" of a content of a DataTiddler on the\n// "data" regular expression. Return null when no data is defined\n// in the tiddler content.\n//\n// Group 1: text before data section (prefix)\n// Group 2: content of data section\n// Group 3: text behind data section (suffix)\n//\n// @param tiddler a Tiddler\n// @return [may be null] null when the tiddler contains no data section, otherwise see above.\n//\nDataTiddler.getDataTiddlerMatches = function(tiddler) {\n var text = tiddler.text;\n var info = DataTiddler.getDataSectionInfo(text);\n if (!info) {\n return null;\n }\n\n var prefix = text.substr(0,info.prefixEnd);\n var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);\n var suffix = text.substr(info.suffixStart);\n \n return [text, prefix, data, suffix];\n};\n\n\n// Internal.\n//\n// Saves the data in a <data> block of the given tiddler (as a minor change). \n//\n// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. \n// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.\n//\n// Notifications are not send. \n//\n// This method should only be called when the data really has changed. \n//\n// @param tiddler\n// the tiddler to be saved.\n//\nDataTiddler.save = function(tiddler) {\n\n var matches = DataTiddler.getDataTiddlerMatches(tiddler);\n\n var prefix;\n var suffix;\n if (matches === null) {\n prefix = tiddler.text;\n suffix = "";\n } else {\n prefix = matches[1];\n suffix = matches[3];\n }\n\n var dataText = DataTiddler.getDataTextOfTiddler(tiddler);\n var newText = \n (dataText !== null) \n ? prefix + "<data>" + dataText + "</data>" + suffix\n : prefix + suffix;\n if (newText != tiddler.text) {\n // make the change in the tiddlers text\n \n // ... see DataTiddler.MyTiddlerChangedFunction\n tiddler.isDataTiddlerChange = true;\n \n // ... do the action change\n tiddler.set(\n tiddler.title,\n newText,\n config.options.txtUserName, \n config.options.chkForceMinorUpdate? undefined : new Date(),\n tiddler.tags);\n\n // ... see DataTiddler.MyTiddlerChangedFunction\n delete tiddler.isDataTiddlerChange;\n\n // Mark the store as dirty.\n store.dirty = true;\n \n // AutoSave if option is selected\n if(config.options.chkAutoSave) {\n saveChanges();\n }\n }\n};\n\n// Internal.\n//\nDataTiddler.MyTiddlerChangedFunction = function() {\n // Remove the data object from the tiddler when the tiddler is changed\n // by code other than DataTiddler code. \n //\n // This is necessary since the data object is just a "cached version" \n // of the data defined in the data section of the tiddler and the \n // "external" change may have changed the content of the data section.\n // Thus we are not sure if the data object reflects the data section \n // contents. \n // \n // By deleting the data object we ensure that the data object is \n // reconstructed the next time it is needed, with the data defined by\n // the data section in the tiddler's text.\n \n // To indicate that a change is a "DataTiddler change" a temporary\n // property "isDataTiddlerChange" is added to the tiddler.\n if (this.dataObject && !this.isDataTiddlerChange) {\n delete this.dataObject;\n }\n \n // call the original code.\n DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);\n};\n\n\n//============================================================================\n// Formatters\n//============================================================================\n\n// This formatter ensures that "~<data>" is rendered as "<data>". This is used to \n// escape the "<data>" of a data section, just in case someone really wants to use\n// "<data>" as a text in a tiddler and not start a data section.\n//\n// Same for </data>.\n//\nconfig.formatters.push( {\n name: "data-escape",\n match: "~<\s\s/?data>",\n\n handler: function(w) {\n w.outputText(w.output,w.matchStart + 1,w.nextMatch);\n }\n} );\n\n\n// This formatter ensures that <data>...</data> sections are not rendered.\n//\nconfig.formatters.push( {\n name: "data",\n match: "<data>",\n\n handler: function(w) {\n var info = DataTiddler.getDataSectionInfo(w.source);\n if (info && info.prefixEnd == w.matchStart) {\n w.nextMatch = info.suffixStart;\n } else {\n w.outputText(w.output,w.matchStart,w.nextMatch);\n }\n }\n} );\n\n\n//============================================================================\n// Tiddler Class Extension\n//============================================================================\n\n// "Hijack" the changed method ---------------------------------------------------\n\nDataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;\nTiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;\n\n// Define accessor methods -------------------------------------------------------\n\n// Returns the value of the given data field of the tiddler. When no such field \n// is defined or its value is undefined the defaultValue is returned.\n//\n// When field is undefined (or null) the data object is returned. (See \n// DataTiddler.getDataObject.)\n//\n// @param field [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n// @return [may be null, undefined]\n//\nTiddler.prototype.data = function(field, defaultValue) {\n return (field) \n ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)\n : DataTiddler.getTiddlerDataObject(this);\n};\n\n// Sets the value of the given data field of the tiddler to the value. When the \n// value is equal to the defaultValue no value is set (and the field is removed).\n//\n// @param value [may be null, undefined]\n// @param defaultValue [may be null, undefined]\n//\nTiddler.prototype.setData = function(field, value, defaultValue) {\n DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);\n};\n\n\n//============================================================================\n// showData Macro\n//============================================================================\n\nconfig.macros.showData = {\n // Standard Properties\n label: "showData",\n prompt: "Display the values stored in the data section of the tiddler"\n};\n\nconfig.macros.showData.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the optional "JSON"\n var showInJSONFormat = false;\n if ((i < params.length) && params[i] == "JSON") {\n i++;\n showInJSONFormat = true;\n }\n \n var tiddlerName = story.findContainingTiddler(place).id.substr(7);\n if (i < params.length) {\n tiddlerName = params[i];\n i++;\n }\n\n // --- Processing ------------------------------------------\n try {\n if (showInJSONFormat) {\n this.renderDataInJSONFormat(place, tiddlerName);\n } else {\n this.renderDataAsTable(place, tiddlerName);\n }\n } catch (e) {\n this.createErrorElement(place, e);\n }\n};\n\nconfig.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {\n var text = DataTiddler.getDataText(tiddlerName);\n if (text) {\n createTiddlyElement(place,"pre",null,null,text);\n }\n};\n\nconfig.macros.showData.renderDataAsTable = function(place,tiddlerName) {\n var text = "|!Name|!Value|\sn";\n var data = DataTiddler.getDataObject(tiddlerName);\n if (data) {\n for (var i in data) {\n var value = data[i];\n text += "|"+i+"|"+DataTiddler.stringify(value)+"|\sn";\n }\n }\n \n wikify(text, place);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.showData.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".showDataError{color: #ffffff;background-color: #880000;}",\n "showData");\n\n\n} // of "install only once"\n// Used Globals (for JSLint) ==============\n\n// ... TiddlyWiki Core\n/*global createTiddlyElement, saveChanges, store, story, wikify */\n// ... DataTiddler\n/*global DataTiddler */\n// ... JSON\n/*global JSON */\n \n\n/***\n!JSON Code, used to serialize the data\n***/\n/*\nCopyright (c) 2005 JSON.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe Software shall be used for Good, not Evil.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/*\n The global object JSON contains two methods.\n\n JSON.stringify(value) takes a JavaScript value and produces a JSON text.\n The value must not be cyclical.\n\n JSON.parse(text) takes a JSON text and produces a JavaScript value. It will\n throw a 'JSONError' exception if there is an error.\n*/\nvar JSON = {\n copyright: '(c)2005 JSON.org',\n license: 'http://www.crockford.com/JSON/license.html',\n/*\n Stringify a JavaScript value, producing a JSON text.\n*/\n stringify: function (v) {\n var a = [];\n\n/*\n Emit a string.\n*/\n function e(s) {\n a[a.length] = s;\n }\n\n/*\n Convert a value.\n*/\n function g(x) {\n var c, i, l, v;\n\n switch (typeof x) {\n case 'object':\n if (x) {\n if (x instanceof Array) {\n e('[');\n l = a.length;\n for (i = 0; i < x.length; i += 1) {\n v = x[i];\n if (typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(v);\n }\n }\n e(']');\n return;\n } else if (typeof x.toString != 'undefined') {\n e('{');\n l = a.length;\n for (i in x) {\n v = x[i];\n if (x.hasOwnProperty(i) &&\n typeof v != 'undefined' &&\n typeof v != 'function') {\n if (l < a.length) {\n e(',');\n }\n g(i);\n e(':');\n g(v);\n }\n }\n return e('}');\n }\n }\n e('null');\n return;\n case 'number':\n e(isFinite(x) ? +x : 'null');\n return;\n case 'string':\n l = x.length;\n e('"');\n for (i = 0; i < l; i += 1) {\n c = x.charAt(i);\n if (c >= ' ') {\n if (c == '\s\s' || c == '"') {\n e('\s\s');\n }\n e(c);\n } else {\n switch (c) {\n case '\sb':\n e('\s\sb');\n break;\n case '\sf':\n e('\s\sf');\n break;\n case '\sn':\n e('\s\sn');\n break;\n case '\sr':\n e('\s\sr');\n break;\n case '\st':\n e('\s\st');\n break;\n default:\n c = c.charCodeAt();\n e('\s\su00' + Math.floor(c / 16).toString(16) +\n (c % 16).toString(16));\n }\n }\n }\n e('"');\n return;\n case 'boolean':\n e(String(x));\n return;\n default:\n e('null');\n return;\n }\n }\n g(v);\n return a.join('');\n },\n/*\n Parse a JSON text, producing a JavaScript value.\n*/\n parse: function (text) {\n var p = /^\ss*(([,:{}\s[\s]])|"(\s\s.|[^\sx00-\sx1f"\s\s])*"|-?\sd+(\s.\sd*)?([eE][+-]?\sd+)?|true|false|null)\ss*/,\n token,\n operator;\n\n function error(m, t) {\n throw {\n name: 'JSONError',\n message: m,\n text: t || operator || token\n };\n }\n\n function next(b) {\n if (b && b != operator) {\n error("Expected '" + b + "'");\n }\n if (text) {\n var t = p.exec(text);\n if (t) {\n if (t[2]) {\n token = null;\n operator = t[2];\n } else {\n operator = null;\n try {\n token = eval(t[1]);\n } catch (e) {\n error("Bad token", t[1]);\n }\n }\n text = text.substring(t[0].length);\n } else {\n error("Unrecognized token", text);\n }\n } else {\n token = operator = undefined;\n }\n }\n\n\n function val() {\n var k, o;\n switch (operator) {\n case '{':\n next('{');\n o = {};\n if (operator != '}') {\n for (;;) {\n if (operator || typeof token != 'string') {\n error("Missing key");\n }\n k = token;\n next();\n next(':');\n o[k] = val();\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next('}');\n return o;\n case '[':\n next('[');\n o = [];\n if (operator != ']') {\n for (;;) {\n o.push(val());\n if (operator != ',') {\n break;\n }\n next(',');\n }\n }\n next(']');\n return o;\n default:\n if (operator !== null) {\n error("Missing value");\n }\n k = token;\n next();\n return k;\n }\n }\n next();\n return val();\n }\n};\n\n/***\n!Setup the data serialization\n***/\n\nDataTiddler.format = "JSON";\nDataTiddler.stringify = JSON.stringify;\nDataTiddler.parse = JSON.parse;\n\n//}}}\n\n
[[Introduction to Moodle]]
!!Problem : I'm getting all postings to discussion Forums as email messages. Make it stop!\nWhen you join a Forum on Moodle it 'subscribes' you to that Forum by default. This means that you get forum posts by email. \n!!Fix : Part I\nYou will need to turn off subscriptions for each Forum you are a member of:\n# Logon to Moodle and go to the course\n# Click the Forums link in Activities box -- you'll see all the Forums together.\n# In Learning Forums section, click the Forum name.\n# At the top right you'll see a link called "Unsubscribe from this forum". Click on this and you'll get unsubscribed.\n# Return to the Forums listing by clicking the Forums link on the breadcrumb bar. [img[graphics/forums_breadcrumb.png]]\n# Repeat for ''every'' Forum\n!! Fix : Part II\nTo change the default behaviour so that you don't subscribe to a new Forum (you'll want to do this too):\n# On the course mail page open Participants and click on your own name.\n# This is your Profile page. Now select the Edit Profile tab\n# Find the option 'Forum auto-subscribe' and pull down the menu to 'No: dont' automatically subscribe me to Forums"\n# You will also have to type some comments into the Description field before you can Update.\n# Click Update Profile to save.\n----\n21 Sept 2006
#Change to Edit mode\n# Find the activity you want to duplicate. Rt-click on the up/down arrows used to move it, and select 'Copy link location': [[screenshot|http://www.earlham.edu/~markp/moodle_wiki/duplicate_activity/copy_address_activity.png]]<<imagebox>>\n# Now paste this into the address field of your browser and change the word 'copy' to 'duplicate': [[screenshot|http://www.earlham.edu/~markp/moodle_wiki/duplicate_activity/edit_address_bar.png ]]<<imagebox "paste edited link">>\n#The new duplicate activity, eg assignment, will be started up and you can change it's name and start and due dates. After you have saved the new activity you can move it to it's new location.\n# To create a new duplicate merely repeat the process (if you have not copied anything else you can merely paste back into the address bar, make sure that it reads 'duplicate' and then press [Enter]).\n
!!Introduction to communities on Elgg\nCommunities on Elgg have many of the features of individual users; a separate 'home' with profile, a community blog with RSS feeds, and community owned file storage. A community is an ideal focal point for group work with a shared blog and file storage area. You can send messages to the whole community (a non-intrusive mailing list) giving them an update of what's happened.\nAnyone can create a community; what gives it dynamism is active membership. As a community owner you cannot "enroll" someone else into your community -- otherwise you'd find yourself being enrolled in communities you didn't ask to join. Instead, you persuade your Friends to join using the procedure below.\n!!!Create Community\n# Within your group (which you have already been allocated) decide on a 'point person'. This person will "own" the Community.\n# Communities are to be found within ''Your Network'' so go there and click on //Owned Communities// (point person only)\n# Use the name of your Blog Interest Group for the Community name, eg "Social Networking & Media" and Username "~SocNetM" [[screenshot|graphics/elgg_community_create.png]]<<imagebox>>\n!!!Configure Community\nEach community has a profile where you can maintain a structured description of what your community is about (Profile photo, Introduction, description, interests, etc) all of which is controlled by Access Restriction pulldown. \n* Community site picture is the thumbnail picture associated with your community (the Profile photo just appears on the Profile page).\n* Edit community details. Here you can change the Membership restriction. Initially, you might want to have no moderation so that prospective members can just click on 'join community'. Later on, you can change this so that you as Community owner have to approve membership requests (via View membership requests)\n* Now you will find this community in the right column under ''Owned communities''\n!!!Amass members / join a community\nAs pointed out above a user has to request to join a community rather than being 'enrolled' by someone else. Here's how:\n# Finding and joining. Get a list of all communities present and then go to the site and join.\n** Click the ''Browse'' link located under the Search box at the top right of the page.\n** Click the Communities link to see a list of communities present ([[screenshot|graphics/elgg_browse_communities.png]]<<imagebox>>)\n** click the community of interest and then "click here to join this community". If the owner has set no moderation you'll join on the spot. The community owner will get a message when a new user has joined the community. If moderation has been set then the owner will have to approve your request and you'll get a Message. \n# By invitation (indirect). You can "Message" your friends and ask them to join. Just Compose a message to a friend and paste in the link to the community (right-click on the community link and choose 'Copy link location'). [[screenshot|graphics/elgg_message_joincomm.png]]<<imagebox>>
The Toolbar is always visible at the top of the screen\n\n[img[graphics/elgg_your_blog.png]] +++[blogging]>\n* Post blog entry\n* View friend's blog\n* Categories / Keywords / Tags\n===\n\n\n[img[graphics/elgg_your_files.png]] +++[File storage area]>\n* Upload files -- share with Friends / community\n* Photo gallery\n* create folder hierarchy with access restrictions\n===\n\n\n[img[graphics/elgg_your_network.png]] +++[Friends and Communities]>\n* finding people, (be)Friending, reciprocating -- Friend of, requests\n* [[Communities|ECBlogs : Communities]]: create, configure, get members\n===\n\n\n[img[graphics/elgg_your_messages.png]] +++[Messaging within ECBlogs]>\n* send to friend/community\n* respond to Friend request\n* respond to community join request\n===\n\n\n[img[graphics/elgg_your_resources.png]] +++[RSS Feeds]>\n* Feed reader -- subscribe and view RSS feeds\n* Aggregate other owned sites into own blog (publish)\n===\n\n\n[img[graphics/elgg_your_presentations.png]] +++[Digital portfolio]>\n* Create annotated digital portfolio\n===\n\n\n[img[graphics/elgg_your_profile.png]] +++[Personal information]>\n* enter personal info and control how it is displayed with Access restrictions\n* Have fun with widgets -- comment wall, friends, etc\n===\n\n\n__Account settings__ +++[Preferences]>\n* change password, friendship moderation\n* add a site picture\n* change your site theme\n===\n\n\n----\n
!!Linking to a web site\nThis procedure, and many others, are best performed with a browser that supports ''tabs'' such as Firefox or IE 7.\n!!!When and how to link\nHere's an example paragraph:\n>ANYWAY: The ~Pal-Item Web site has only one obvious lead story. Today it's "Pro seeks to lease course," with a photo of golfers.\n"The ~Pal-Item web site" cries out to be made into a link. \n* Open up the website you want to link to in another tab and copy the URL\n* Just highlight the text, click the chain and paste in the URL. \n* enter some useful text into the //title// field\n* select 'open in new window' from the pulldown menu to open the link in a new window. [[screenshot : Insert link|graphics/elgg_link_insert.png]]<<imagebox>>\nHere's what you'd get :\n[<img[graphics/elgg_link_hand.png]] [img[graphics/elgg_link_tooltip.png]]\n\nNote the 'tooltip' that appears when you pass the mouse over the link -- that's the text in the "title" field.\n----
<<slideShow style:'MySSStyleSheet' clock:'+'>>\n-s-\n!What we'll cover\n<html>\n<ol>\n <li class="Overlay1">Setting oop</li>\n <li class="Overlay2">Design Template</li>\n <li class="Overlay3">Content — Slides</li>\n <li class="Overlay4">Dealing with Graphics</li>\n <li class="Overlay5">Wrapping oop</li>\n</ol>\n</html>\n-s-\n! Before you Start\n* 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.\n! Powerpoint setup\n# Adjust your working space to create more room by removing fluff. 3 panes:\n** Sidebar : tabs Outline | Slides\n** Slide display\n** Notes\n# Know which toolbars you have active.\n** Standard\n** Formatting\n** Draw\n** PDF\n-s-\n!Design Template\n!!! General Principles:\n<<tiddlerbox "consistency" "Exhortation to Consistency" " " 250 150>> in:\n* appearance -- each slide should have the same set of fonts\n* style -- each slide should have the same overall design\n* behaviour -- each slide should have the same animations and transitions\nImplement this with <<tiddlerbox "SLIDE MASTER" "Slide Master" "" 450 150>>\n-s-\n!Slide Master\n# Select View -> Master -> Slide Master. Template for whole slide show\n# Click <<tiddlerbox "Design" "PPT : Slide Design" "The most useful pop-up menu" 500 500>> and a useful popup menu appears.\n-s-\n!Slide Design : Choosing Template\n* Decide what template you want to use ''BASED on the CONTENT of the PRESENTATION'', eg 'red curtain call' for a Theatre presentation.\nIn general ''KEEP IT'' <<tiddlerbox "SIMPLE" "Exhortation to Simplicity" "" 250 150>>\n!!!Note:\nTwo (2) slides will appear (after you have opened the slide master) \n# Style used by all slide, except\n# Style used by Title slide (ie first in the slide show)\n-s-\n!Overview Design Principles\n++++ Visual_Clarity\n* Titles : 36 point font\n* # fonts โ max 2\n* Body text : 24 point\n* Use Sans Serif fonts\n====\n\n++++ Legibility\n* # bullets per slide - max 6 \n* # lines in title โ max 2\n* # lines per bullet โ max 2\n====\n\n++++ Text_style\n* Newspaper headlines\n* Little text per bullet\n* Readable fonts\n* Complementary and contrasting colours\n* Use SLIDE MASTER for uniformity\n====\n\n-s-\n!To Do\n# Choose a basic Master Slide design\n# Save\n** create folder & save inside folder\n** difference between Save and Save As\n\n!Modify Master Slide\n# Change font face\n# Apply animation to slide slide components\n# Apply transition between slides\n-s-\n!1. Slide Master : Font Change\n# Select title text. Change font to Century Gothic : bold\n# Select all body bullet text. Change font to Rockwell\n# Save\n\n!!!Note: \n* fonts are also changed on the Title slide\n* Use ''Sans Serif'' rather than ''Serif'' font faces. (Why? Give egs of both)\n-s-\n!2. Slide Master : Text Animation\n# Select all the bulleted text\n# Add Effect of your choice from the [[menu|effectivePPT/custom_animation.png]]<<imagebox>>. I chose Entrance -> Fly In\n# Change options (direction and speed) and observe preview\n# Select Title and apply animation to it. I chose Fly in from Top.\n!!!Note:\n* This animation will now apply to all bullet lists for all slides\n* Click [Remove] to get rid of mistake\n-s-\n!3. Slide Master : Slide Transition\n* Choose transition from menu\n* Apply to all slides\n-s-\n!TEST TEST TEST TEST\n* Demo the animations.\n* Problem: title descends ''after'' content. Looks NAFF.\n* Fix : go to Custom animation & reorder\n* Play through again to check\n\n! NOW ADD SLIDES -- WOOPEE !\n-s-\n# Close Master Slide if still open\n# The first slide in the sidebar should be the Title slide, so enter the Title and Subtitle for your slideshow.\n# Insert a new slide from the slide layout menu:\n[img[effectivePPT/insert_text_slide.png]]\n** Type in Title text\n** Type (or copy) text for first bullet -- ''KEEP it BRIEF''\n\n!!!Note:\n* To ''indent'' one bullet level press TAB key\n* To ''outdent'' or return press ~SHIFT-TAB\n-s-\n!GUIDELINES FOR TEXT CONTENT\n* think of each bullet point as a NEWSPAPER HEADLINE\n* don't read the screen -- the text is a memo\n* the show should be unintelligible unless you went to the talk\n* don't crowd the screen -- 6 lines max\n\n!!!Notes:\n* can use the Outline to quickly add slides\n* copy and paste your full text into the notes field. Print this out to read from.\n-s-\n!Dealing with Graphics\n\n++++ File_types\n|Jaypeg|JPG|Photographs - 'lossy' format, compressed with lots of colours|\n|Ping|PNG|bold colours and clear boundaries -- charts, screenshots, etc|\n|giff|GIF|obsolete but still kicking around. 256 colours maximum|\n====\n\n++++ Resolution\n|96 dpi|screen -- CRT or LCD. Sizes of screen and therefore size of pixels vary but density set to 96|\n|150 dpi|medium quality text print. Good for scanning pages into Acrobat PDF|\n|300 dpi|high quality for colour print on glossy paper|\n====\n\n++++ Sizes\n|300 px|A good size for a web graphic image|\n|1024px x 768px|Maximum size a normal projector can handle. No point in using a graphic larger than this in PPT|\n|6" x 4"|standard size of colour photo print|\n====\n-s-\n!What should I do?\n\n|!Item|!Purpose|!File Type|!Resolution|!Size|!Comment|\n|Digital photo|use in PPT|JPG|96dpi (reduce)|1024px wide (reduce)| |\n|photo print to scan|use in PPT| | | | |\n|Screenshot|use in PPT| | | | |\n|Graphic from web|use in PPT| | | | |
// //''Name:'' EmailLink\n// //''Version:'' <<getversion email>> (<<getversiondate email "DD MMM YYYY">>)\n// //''Author:'' AlanHecht\n// //''Type:'' [[Macro|Macros]]\n\n// //''Description:'' email lets you list a "email" address without displaying it as readable text. This helps prevent your email address from being harvested by search engines and other web crawlers that read your page's contents. Using email, you type in the words "at" and "dot" instead of the punctuation symbols and add spaces inbetween words to disguise your address. However, email will display your email address in a web browser so that humans can read it. And email turns the address into a hyperlink that can be clicked to send you an instant email.\n\n// //''Syntax:'' << {{{email yourname at yourdomain dot com "?optional parameters"}}} >>\n// //Example 1: <<email sample at nowhere dot com>> (standard)\n// //Example 2: <<email multiple dot sample at somewhere dot nowhere dot com>> (multiple dots)\n// //Example 3: <<email sample at nowhere dot com "?subject=Submission&body=Type your message here.">> (with optional parameters)\n\n// //''Directions:'' <<tiddler MacroDirections>>\n\n// //''Notes:'' You can use the optional email parameters to stipulate a subject or message body for the message. Most (not all) email clients will use this information to construct the email message.\n\n// //''Related Links:'' none\n\n// //''Revision History:''\n// // v0.1.0 (20 July 2005): initial release\n// // v0.1.1 (22 July 2005): renamed the macro from "mailto" to "email" to further thwart email harvesters.\n// // v0.1.2 (15 October 2005): added global replacement of "dots" thanks to a suggestion from Ralph Winter\n\n// //''Code section:''\nversion.extensions.email = {major: 0, minor: 1, revision: 2, date: new Date("Oct 15, 2005")};\nconfig.macros.email = {}\nconfig.macros.email.handler = function(place,macroName,params)\n{\nvar temp = params.join(" ");\ndata = temp.split("?");\nvar recipient = data[0];\nrecipient = recipient.replace(" at ","@").replace(" dot ",".","g");\nrecipient = recipient.replace(/\ss/g,"");\nvar optional = data[1] ? "?" + data[1] : "";\nvar theLink = createExternalLink(place,"ma"+"il"+"to:"+recipient+optional);\ntheLink.appendChild(document.createTextNode(recipient))\n}\n
\n\n!COOL because CONSISTENT
\n\n!SIMPLE but SOPHISTICATED\nthink Google
// //''Name:'' FAQ List\n// //''Version:'' 1.4 for TW 2.0.0\n// //''Author:'' AlanHecht\n// //''Type:'' [[Macro|Macros]]\n\n// //''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.\n\n// //''Syntax:'' << {{{ faqlist mode source sortBy hrSeparator }}} >>\n// // ''faqlist:'' the macro call (required)\n// // ''mode:'' either "byTag" or "byTitle" (required)\n// // ''source:'' the associated tag or tiddler title (required)\n// // ''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)\n// // ''hrSeparator:'' if "hr" is included at the end of the call string, each question/answer set will be separated by a horizontal rule.\n// //Examples: (edit these two tiddlers to see the syntax used for each)\n// // โข [[FAQ Method One]] (compiled from tiddlers tagged with a certain tag)\n// // โข [[FAQ Method Two]] (compiled using the content of a single tiddler)\n// // โข @@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!)\n\n// //''Directions:'' <<tiddler StartupBehaviorDirections>> <<tiddler MacroDirections>>\n\n// //''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:\n// // โข Each question must be a single line (i.e. no hard returns) but can wrap as needed\n// // โข 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).\n// // โข Each question/answer set must be seperated by two hard returns (i.e. must have a single, blank line between them.\n// // Refer to [[FAQ Tiddler Sample]] for an example.\n\n// //''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.\n\n// //''Revision History:''\n// // v0.1.0 (01 August 2005): initial release\n// // v0.1.1 (04 August 2005): Fixed an endless loop bug (thanks to Kevin Kleinfelter).\n// // v0.1.2 (19 October 2005): Fixed TW compatibility .32 bugs (newline for block quote and e.preventDefault by Clint Checketts)\n// // 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]]\n// // v0.1.4 (05 January 2006): Created a special version of FaqList to work with TW v2.0.0\n// //''Code section:''\n\nversion.extensions.faqlist = {major: 0, minor: 1, revision: 4, date: new Date("Jan 05, 2006")};\nconfig.macros.faqlist = {\n bulletCollapse: ">",\n bulletExpand: "โจ",\n expandButton: {title: "Expand All", tooltip: "Open all items for reading"},\n collapseButton: {title: "Collapse All", tooltip: "Close all items"}\n};\nconfig.macros.faqlist.handler = function(place,macroName,params)\n{\n lingo = config.macros.faqlist;\n var mode = params[0].toLowerCase();\n var list = [];\n switch(mode)\n {\n case "bytag":\n var tagged = store.getTaggedTiddlers(params[1], params[2]);\n for(t=0; t<tagged.length; t++)\n {\n var title = tagged[t].title;\n list[t] = [title,store.getTiddlerText(title)];\n }\n var subTitle = store.fetchTiddler(title).getSubtitle();\n break;\n case "bytitle":\n var faqText = store.getTiddlerText(params[1]);\n var faqItems = faqText.split("\sn\sn");\n if(params[2] == "question")\n faqItems.sort();\n for(t=0; t<faqItems.length; t++)\n {\n list[t] = [faqItems[t].substring(0,faqItems[t].indexOf("\sn")),faqItems[t].substring(faqItems[t].indexOf("\sn")+1)];\n }\n var subTitle = null;\n break;\n }\n \n var faqHeading = place.appendChild(document.createElement("span"));\n faqHeading.appendChild(createTiddlyButton(faqHeading,lingo.expandButton.title,lingo.expandButton.tooltip,faqExpandAll));\n faqHeading.appendChild(createTiddlyButton(faqHeading,lingo.collapseButton.title,lingo.collapseButton.tooltip,faqCollapseAll));\n faqHeading.appendChild(document.createElement("p"));\n var faqBody = place.appendChild(document.createElement("span"));\n for(var t=0; t<list.length; t++)\n {\n var title = list[t][0];\n\n var content = "<<<\sn" + list[t][1] + "=\sn<<<\sn";\n var theClass = "tiddlyLinkExisting tiddlyLink";\n var itemHeading = faqBody.appendChild(document.createElement("span"));\n itemHeading.appendChild(document.createTextNode(config.macros.faqlist.bulletCollapse + " "));\n createTiddlyButton(itemHeading,title,subTitle,faqToggleThis,theClass);\n var itemBody = faqBody.appendChild(document.createElement("span"));\n itemBody.style.display = "none";\n itemBody.className = "itemBody";\n wikify(content,itemBody,null,null);\n faqBody.appendChild(itemBody);\n faqBody.appendChild(document.createElement("p"));\n if(params[3] == "hr")\n faqBody.appendChild(document.createElement("hr"));\n }\n}\n\nfunction faqToggleThis(e)\n{\n var content = this.parentNode.nextSibling;\n var shown = content.style.display;\n if(shown == "none")\n {\n content.style.display = "inline";\n this.previousSibling.nodeValue = config.macros.faqlist.bulletExpand + " ";\n }\n else\n {\n content.style.display = "none";\n this.previousSibling.nodeValue = config.macros.faqlist.bulletCollapse + " ";\n }\n}\n\nfunction faqExpandAll(e)\n{\n for(t=0; t<this.parentNode.nextSibling.childNodes.length; t++)\n {\n if(this.parentNode.nextSibling.childNodes[t].className == "itemBody")\n {\n this.parentNode.nextSibling.childNodes[t].style.display = "inline";\n this.parentNode.nextSibling.childNodes[t].previousSibling.childNodes[0].nodeValue = config.macros.faqlist.bulletExpand + " ";\n }\n }\n// e.preventDefault();\n}\n\nfunction faqCollapseAll(e)\n{\n for(t=0; t<this.parentNode.nextSibling.childNodes.length; t++)\n {\n if(this.parentNode.nextSibling.childNodes[t].className == "itemBody")\n {\n this.parentNode.nextSibling.childNodes[t].style.display = "none";\n this.parentNode.nextSibling.childNodes[t].previousSibling.childNodes[0].nodeValue = config.macros.faqlist.bulletCollapse + " ";\n }\n }\n// e.preventDefault();\n}\n
!!Moodle Moot : Focus on Forums -- Thursday 18th Jan\nThis lunchtime meeting is for all faculty, whether current users of Moodle or just intrigued. Welling Hall and Dina Battaglia will talk about their use of discussion Forums in Moodle and there'll also be time for general conversation and Moodle moans (what would you like to see improved). We'll meet in the Richmond room in Bolling Centre at noon on Thursday 18th January and lunch will comprise the usual sandwich baskets with major ingredient Turkey, Ham or Hummus.\n\n!!!Summary:\n\n|What|Presentations by Welling Hall and Dina Battaglia about their use of discussion Forums. Questions and answers. General discussion.|\n|Where|Ye olde Richmonde Room (and , yes, I have booked it) of the Landrum Bolling Center.|\n|When|Thursday 18th Jan at 12 noon|\n|''FOOD''|Sandwich baskets Turkey, Ham or Hummus.|\n\nPlease do let me know by Monday afternoon (1/15/07) whether you plan to attend and your preferred choice of sandwich.\n\n!!Attendees who have emailed me\n* Welling Hall\n* Dina Battaglia\n* Mic Jackson\n* Alice Shrock\n* Amy Bryant\n* Mahmoud Nassa\n* Aletha Stahl\n* Jane Terashima\n
|>|>|>|>|>|>| !February 2007 |\n|Su|Mo|Tu|We|Th|Fr|Sa|\n|||||1|2|3|\n|4|5|6|7|8|9|10|\n|11|12|13|14|15|16|17|\n|18|!19|20|21|!22|23|24|\n|25|26|27|28||||\n\n|>| ![[Lunchtime with Laptops]] |\n|>| February |\n|19|[[iTunes & podcasts]]*|\n\n* iTunes and Podcasts will be a BringYourOwnLunch
A FormTemplate is used with the [[FormTiddlerPlugin]]. It is a tiddler that contains one or more HTML INPUT elements and defines the layout of a form. \n\nOther tiddlers can reference a FormTemplate through the [[FormTiddlerMacro]].\n\n(See [[FormTiddler Introduction]])
|!Example|!Comment|\n|[[SimpleForm|SimpleForm (Card 1)]]|Three forms, using a simple template with "username" and "password" fields|\n|[[BiggerForm|BiggerForm (Card 1)]]|Three forms, using a template with all supported Form input elements|\n|[[Bugreports]]|Use forms and filtered lists to maintain bug reports|\n|[[Contacts|JoeBlock]]|Manage your contacts in forms|\n
The [[FormTiddlerPlugin]] allows you to enter your data in a form and store the form's data in your tiddlers.\n\n(For more information on tiddler data see the [[DataTiddlerPlugin]].)\n\n//''Define ~FormTemplate''//\n\nWhen you want to enter data in a form you first have to define a [[FormTemplate]] tiddler. A FormTemplate tiddler is a tiddler that contains named HTML INPUT elements (such as textfields, password fields, lists etc.) that define the stuff that should be edited in the form. E.g. you may have a FormTemplate that looks like this:\n\n<html>\n <b>Name:</b><br/>\n <input name=userName type=text /><br/>\n <b>Password:</b><br/>\n <input name=pwd type=password /><br/>\n</html>\n\nThe correspond HTML text looks like this\n{{{\n<html>\n <b>Name:</b><br/>\n <input name=userName type=text /><br/>\n <b>Password:</b><br/>\n <input name=pwd type=password /><br/>\n</html>\n}}}\n\nThe name of the INPUT element is also the name of the data field it is editing. E.g. a text field defined like this: \n{{{\n<input name=userName type=text />\n}}}\nwill edit the data field "userName" of the tiddler.\n\n\nYou are free to layout the INPUT elements as you like, but don't add a "form" element around them and don't define 'onchange' handlers, since this will be done automatically by the {{{<<formTiddler ...>>}}} macro.\n\n\n//''Use ~FormTemplates (through the {{{<<formTiddler ...>>}}} macro)''//\n\nIn a second step you add the {{{<<formTiddler ...>>}}} macro to tiddlers that should be edited. In the macro you are referencing the [[FormTemplate]] that should be used to edit the tiddler's data. You may refer to the same FormTemplate tiddler in as many tiddlers as you like. Every such tiddler displays the same INPUT elements as the FormTemplate, but with the "data" of each individual tiddler.\n\nIn addition you may more than one {{{<<formTiddler...>>}}} macro call in one tiddler. Just make sure that the names of the elements in the referenced FormTemplate tiddlers do not collide. This feature may be useful if you want to construct a larger input form from a set of smaller FormTemplates.\n\nYou can easily create tiddlers with an embedded {{{<<formTiddler...>>}}} macro call using the [[<<newTiddlerWithForm...>>|NewTiddlerWithFormMacro]] macro. The macro shows a button similar to the "new tiddler" button and creates the requested tiddler, ready to enter data. For details see NewTiddlerWithFormMacro.\n\n\n//''"Structured" and "Free" Data''//\n\nTypically you will edit a tiddler that uses the {{{<<formTiddler...>>}}} macro through the form. But you are free to also edit the tiddler "as usual", through the build-in edit feature. I.e. you may mix "structured data" (as entered through the form) with "free data". I.e. on a "Contact" tiddler you may add an image to the tiddler, or add extra links to related persons. Or you add more tags. Just make sure that you don't modify the {{{<data>...</data>}}} section of the tiddler, since this contains the data maintained by the form.\n\nAlso notice that since the data entered in the forms is stored in the tiddler's text (in the {{{<data>...</data>}}} section) using the "search" feature will also find the texts you entered in the forms (even though it will not hilite the texts in the fields).\n\n\n//''Applications''//\n\nUsing the [[FormTiddlerPlugin]] it is easy to manage things like:\n* [[Contacts]]\n* [[Bugreports]]\n* ~ToDo Lists\n* and many more.\n\nSince a FormTemplate is typically used for many tiddlers of the same kind you may also consider using the ForEachTiddlerMacro to collect data across multiple tiddlers (e.g. to get a list of all contacts, a summary page for the bug reports etc.)\n\n(See also [[FormTiddler Examples]])\n\n\n//''HTML Elements''//\n\nFor those not that familiar with the HTML INPUT elements here a short overview with HTML snippets. \n|!Type|!HTML Example|!Comment|\n|button|{{{<input name=btn type=button value="Just a button" />}}}|no data|\n|checkbox|{{{<input name=isVIP type=checkbox />is VIP}}}||\n|file|{{{<input name=attachment type=file />}}}|The "file" input element typically does not restore the path of the previously selected file. Nevertheless the path of the file is stored in the tiddler.|\n|hidden|{{{<input name=hiddenValue type=hidden value="This is a hidden value" />}}}||\n|password|{{{<input name=pwd type=password />}}}|The data entered in a "password" field is stored as clear text in the tiddler.|\n|radio|{{{<input name=level type=radio value="Beginner" />Beginner<input name=level type=radio value="Expert" />Expert<input name=level type=radio value="Guru" />Guru}}}||\n|reset|{{{<input name=btnReset type=reset />}}}|no data|\n|select-one|{{{<select name=browser ><option>Firefox<option>Internet Explorer<option>Opera<option>Other</select >}}}||\n|select-multiple|{{{<select name=music MULTIPLE ><option> R&B <option> Jazz <option> Blues <option> New Age</select >}}}||\n|submit|{{{<input name=btnSubmit type=submit />}}}|no data|\n|text|{{{<input name=userName type=text/>}}}||\n|textarea|{{{<TEXTAREA name=notes rows=4 cols=80 ></TEXTAREA>}}}||\n\nFor details consult the Web or a textbook on HTML editing.
The {{{<<formTiddler ...>>}}} macro defined by the FormTiddlerPlugin. \n\nWhen a tiddler T1 references the (FormTemplate) tiddler T2 in the FormTiddlerMacro, the data of T1 can be edited through the INPUT elements defined by T2.
/***\n<<checkForDataTiddlerPlugin>>\n|''Name:''|FormTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-24)|\n|''Source:''|http://tiddlywiki.abego-software.de/#FormTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|formTiddler, checkForDataTiddlerPlugin, newTiddlerWithForm|\n|''Requires:''|DataTiddlerPlugin|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|\n!Description\nUse form-based tiddlers to enter your tiddler data using text fields, listboxes, checkboxes etc. (All standard HTML Form input elements supported).\n\n''Syntax:'' \n|>|{{{<<}}}''formTiddler'' //tiddlerName//{{{>>}}}|\n|//tiddlerName//|The name of the FormTemplate tiddler to be used to edit the data of the tiddler containing the macro.|\n\n|>|{{{<<}}}''newTiddlerWithForm'' //formTemplateName// //buttonLabel// [//titleExpression// [''askUser'']] {{{>>}}}|\n|//formTemplateName//|The name of the tiddler that defines the form the new tiddler should use.|\n|//buttonLabel//|The label of the button|\n|//titleExpression//|A (quoted) JavaScript String expression that defines the title (/name) of the new tiddler.|\n|''askUser''|Typically the user is not asked for the title when a title is specified (and not yet used). When ''askUser'' is given the user will be asked in any case. This may be used when the calculated title is just a suggestion that must be confirmed by the user|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nFor details and how to use the macros see the [[introduction|FormTiddler Introduction]] and the [[examples|FormTiddler Examples]].\n\n!Revision history\n* v1.0.5 (2006-02-24)\n** Removed "debugger;" instruction\n* v1.0.4 (2006-02-07)\n** Bug: On IE no data is written to data section when field values changed (thanks to KenGirard for reporting)\n* v1.0.3 (2006-02-05)\n** Bug: {{{"No form template specified in <<formTiddler>>"}}} when using formTiddler macro on InternetExplorer (thanks to KenGirard for reporting)\n* v1.0.2 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.1 (2005-12-22)\n** Features: \n*** Support InternetExplorer\n*** Added newTiddlerWithForm Macro\n* v1.0.0 (2005-12-14)\n** initial version\n\n!Code\n***/\n//{{{\n\n//============================================================================\n//============================================================================\n// FormTiddlerPlugin\n//============================================================================\n//============================================================================\n\n\nversion.extensions.FormTiddlerPlugin = {\n major: 1, minor: 0, revision: 5,\n date: new Date(2006, 2, 24), \n type: 'plugin',\n source: "http://tiddlywiki.abego-software.de/#FormTiddlerPlugin"\n};\n\n// For backward compatibility with v1.2.x\n//\nif (!window.story) window.story=window; \nif (!TiddlyWiki.prototype.getTiddler) TiddlyWiki.prototype.getTiddler = function(title) { return t = this.tiddlers[title]; return (t != undefined && t instanceof Tiddler) ? t : null; } \n\n//============================================================================\n// formTiddler Macro\n//============================================================================\n\n// -------------------------------------------------------------------------------\n// Configurations and constants \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler = {\n // Standard Properties\n label: "formTiddler",\n version: {major: 1, minor: 0, revision: 4, date: new Date(2006, 2, 7)},\n prompt: "Edit tiddler data using forms",\n\n // Define the "setters" that set the values of INPUT elements of a given type\n // (must match the corresponding "getter")\n setter: { \n button: function(e, value) {/*contains no data */ },\n checkbox: function(e, value) {e.checked = value;},\n file: function(e, value) {try {e.value = value;} catch(e) {/* ignore, possibly security error*/}},\n hidden: function(e, value) {e.value = value;},\n password: function(e, value) {e.value = value;},\n radio: function(e, value) {e.checked = (e.value == value);},\n reset: function(e, value) {/*contains no data */ },\n "select-one": function(e, value) {config.macros.formTiddler.setSelectOneValue(e,value);},\n "select-multiple": function(e, value) {config.macros.formTiddler.setSelectMultipleValue(e,value);},\n submit: function(e, value) {/*contains no data */},\n text: function(e, value) {e.value = value;},\n textarea: function(e, value) {e.value = value;}\n },\n\n // Define the "getters" that return the value of INPUT elements of a given type\n // Return undefined to not store any data.\n getter: { \n button: function(e, value) {return undefined;},\n checkbox: function(e, value) {return e.checked;},\n file: function(e, value) {return e.value;},\n hidden: function(e, value) {return e.value;},\n password: function(e, value) {return e.value;},\n radio: function(e, value) {return e.checked ? e.value : undefined;},\n reset: function(e, value) {return undefined;},\n "select-one": function(e, value) {return config.macros.formTiddler.getSelectOneValue(e);},\n "select-multiple": function(e, value) {return config.macros.formTiddler.getSelectMultipleValue(e);},\n submit: function(e, value) {return undefined;},\n text: function(e, value) {return e.value;},\n textarea: function(e, value) {return e.value;}\n }\n};\n\n\n// -------------------------------------------------------------------------------\n// The formTiddler Macro Handler \n// -------------------------------------------------------------------------------\n\nconfig.macros.formTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (!config.macros.formTiddler.checkForExtensions(place, macroName)) {\n return;\n }\n \n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n\n // --- Processing ------------------------------------------\n\n // Get the form template text. \n // (This contains the INPUT elements for the form.)\n var formTemplateTiddler = store.getTiddler(formTemplateName);\n if (!formTemplateTiddler) {\n config.macros.formTiddler.createErrorElement(place, "Form template '" + formTemplateName + "' not found.");\n return;\n }\n var templateText = formTemplateTiddler.text;\n if(!templateText) {\n // Shortcut: when template text is empty we do nothing.\n return;\n }\n\n // Get the name of the tiddler containing this "formTiddler" macro\n // (i.e. the tiddler, that will be edited and that contains the data)\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(place);\n\n // Append a "form" element. \n var formName = "form"+formTemplateName+"__"+tiddlerName;\n var e = document.createElement("form");\n e.setAttribute("name", formName);\n place.appendChild(e);\n\n // "Embed" the elements defined by the templateText (i.e. the INPUT elements) \n // into the "form" element we just created\n wikify(templateText, e);\n\n // Initialize the INPUT elements.\n config.macros.formTiddler.initValuesAndHandlersInFormElements(formName, DataTiddler.getDataObject(tiddlerName));\n}\n\n\n// -------------------------------------------------------------------------------\n// Form Data Access \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\n// Initialize the INPUT elements of the form with the values of their "matching"\n// data fields in the tiddler. Also setup the onChange handler to ensure that\n// changes in the INPUT elements are stored in the tiddler's data.\n//\nconfig.macros.formTiddler.initValuesAndHandlersInFormElements = function(formName, data) {\n // config.macros.formTiddler.trace("initValuesAndHandlersInFormElements(formName="+formName+", data="+data+")");\n\n // find the form\n var form = config.macros.formTiddler.findForm(formName);\n if (!form) {\n return;\n }\n\n try {\n var elems = form.elements;\n for (var i = 0; i < elems.length; i++) {\n var c = elems[i];\n \n var setter = config.macros.formTiddler.setter[c.type];\n if (setter) {\n var value = data[c.name];\n if (value != null) {\n setter(c, value);\n }\n c.onchange = onFormTiddlerChange;\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No setter defined for INPUT element of type '"+c.type+"'. (Element '"+c.name+"' in form '"+formName+"')");\n }\n }\n } catch(e) {\n config.macros.formTiddler.displayFormTiddlerError("Error when updating elements with new formData. "+e);\n }\n}\n\n\n// Internal.\n//\n// @return [may be null]\n//\nconfig.macros.formTiddler.findForm = function(formName) {\n // We must manually iterate through the document's forms, since\n // IE does not support the "document[formName]" approach\n\n var forms = window.document.forms;\n for (var i = 0; i < forms.length; i++) {\n var form = forms[i];\n if (form.name == formName) {\n return form;\n }\n }\n\n return null;\n}\n\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectOneValue = function(element,value) {\n var n = element.options.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = element.options[i].value == value;\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.setSelectMultipleValue = function(element,value) {\n var values = {};\n for (var i = 0; i < value.length; i++) {\n values[value[i]] = true;\n }\n \n var n = element.length;\n for (var i = 0; i < n; i++) {\n element.options[i].selected = !(!values[element.options[i].value]);\n }\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectOneValue = function(element) {\n var i = element.selectedIndex;\n return (i >= 0) ? element.options[i].value : null;\n}\n\n// Internal.\n//\nconfig.macros.formTiddler.getSelectMultipleValue = function(element) {\n var values = [];\n var n = element.length;\n for (var i = 0; i < n; i++) {\n if (element.options[i].selected) {\n values.push(element.options[i].value);\n }\n }\n return values;\n}\n\n\n\n// -------------------------------------------------------------------------------\n// Helpers \n// -------------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.formTiddler.checkForExtensions = function(place,macroName) {\n if (!version.extensions.DataTiddlerPlugin) {\n config.macros.formTiddler.createErrorElement(place, "<<" + macroName + ">> requires the DataTiddlerPlugin. (You can get it from http://tiddlywiki.abego-software.de/#DataTiddlerPlugin)");\n return false;\n }\n return true;\n}\n\n// Internal.\n//\n// Displays a trace message in the "TiddlyWiki" message pane.\n// (used for debugging)\n//\nconfig.macros.formTiddler.trace = function(s) {\n displayMessage("Trace: "+s);\n}\n\n// Internal.\n//\n// Display some error message in the "TiddlyWiki" message pane.\n//\nconfig.macros.formTiddler.displayFormTiddlerError = function(s) {\n alert("FormTiddlerPlugin Error: "+s);\n}\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.formTiddler.createErrorElement = function(place, message) {\n return createTiddlyElement(place,"span",null,"formTiddlerError",message);\n}\n\n// Internal.\n//\n// Returns the name of the tiddler containing the given element.\n// \nconfig.macros.formTiddler.getContainingTiddlerName = function(element) {\n return story.findContainingTiddler(element).id.substr(7);\n}\n\n// -------------------------------------------------------------------------------\n// Event Handlers \n// -------------------------------------------------------------------------------\n\n// This function must be called by the INPUT elements whenever their\n// data changes. Typically this is done through an "onChange" handler.\n//\nfunction onFormTiddlerChange (e) {\n // config.macros.formTiddler.trace("onFormTiddlerChange "+e);\n\n if (!e) var e = window.event;\n\n var target = resolveTarget(e);\n var tiddlerName = config.macros.formTiddler.getContainingTiddlerName(target);\n var getter = config.macros.formTiddler.getter[target.type];\n if (getter) {\n var value = getter(target);\n DataTiddler.setData(tiddlerName, target.name, value);\n } else {\n config.macros.formTiddler.displayFormTiddlerError("No getter defined for INPUT element of type '"+target.type+"'. (Element '"+target.name+"' used in tiddler '"+tiddlerName+"')");\n }\n}\n\n// ensure that the function can be used in HTML event handler\nwindow.onFormTiddlerChange = onFormTiddlerChange;\n\n\n// -------------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// -------------------------------------------------------------------------------\n\nsetStylesheet(\n ".formTiddlerError{color: #ffffff;background-color: #880000;}",\n "formTiddler");\n\n\n//============================================================================\n// checkForDataTiddlerPlugin Macro\n//============================================================================\n\nconfig.macros.checkForDataTiddlerPlugin = {\n // Standard Properties\n label: "checkForDataTiddlerPlugin",\n version: {major: 1, minor: 0, revision: 0, date: new Date(2005, 12, 14)},\n prompt: "Check if the DataTiddlerPlugin exists"\n}\n\nconfig.macros.checkForDataTiddlerPlugin.handler = function(place,macroName,params) {\n config.macros.formTiddler.checkForExtensions(place, config.macros.formTiddler.label);\n}\n\n\n\n//============================================================================\n// newTiddlerWithForm Macro\n//============================================================================\n\nconfig.macros.newTiddlerWithForm = {\n // Standard Properties\n label: "newTiddlerWithForm",\n version: {major: 1, minor: 0, revision: 1, date: new Date(2006, 1, 6)},\n prompt: "Creates a new Tiddler with a <<formTiddler ...>> macro"\n}\n\nconfig.macros.newTiddlerWithForm.handler = function(place,macroName,params) {\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n\n // get the name of the form template tiddler\n var formTemplateName = undefined;\n if (i < params.length) {\n formTemplateName = params[i];\n i++;\n }\n\n if (!formTemplateName) {\n config.macros.formTiddler.createErrorElement(place, "No form template specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the button label\n var buttonLabel = undefined;\n if (i < params.length) {\n buttonLabel = params[i];\n i++;\n }\n\n if (!buttonLabel) {\n config.macros.formTiddler.createErrorElement(place, "No button label specified in <<" + macroName + ">>.");\n return;\n }\n\n // get the (optional) tiddlerName script and "askUser"\n var tiddlerNameScript = undefined;\n var askUser = false;\n if (i < params.length) {\n tiddlerNameScript = params[i];\n i++;\n\n if (i < params.length && params[i] == "askUser") {\n askUser = true;\n i++;\n }\n }\n\n // --- Processing ------------------------------------------\n\n if(!readOnly) {\n var onClick = function() {\n var tiddlerName;\n if (tiddlerNameScript) {\n try {\n tiddlerName = eval(tiddlerNameScript);\n } catch (ex) {\n }\n }\n if (!tiddlerName || askUser) {\n tiddlerName = prompt("Please specify a tiddler name.", askUser ? tiddlerName : "");\n }\n while (tiddlerName && store.getTiddler(tiddlerName)) {\n tiddlerName = prompt("A tiddler named '"+tiddlerName+"' already exists.\sn\sn"+"Please specify a tiddler name.", tiddlerName);\n }\n\n // tiddlerName is either null (user canceled) or a name that is not yet in the store.\n if (tiddlerName) {\n var body = "<<formTiddler [["+formTemplateName+"]]>>";\n var tags = [];\n store.saveTiddler(tiddlerName,tiddlerName,body,config.options.txtUserName,new Date(),tags);\n story.displayTiddler(null,tiddlerName,1);\n }\n }\n\n createTiddlyButton(place,buttonLabel,buttonLabel,onClick);\n }\n}\n\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n
/***\n|Name|FullScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#FullScreenPlugin|\n|Version|1.1|\n|Requires|~TW2.x|\n!Description:\nToggle between viewing tiddlers fullscreen and normally. Very handy for when you need more viewing space.\n\n!Demo:\nClick the โ button in the toolbar for this tiddler. Click it again to turn off fullscreen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nEdit the ViewTemplate to add the fullscreen command to the toolbar.\n\n!History:\n*25-07-06: ver 1.1\n*20-07-06: ver 1.0\n\n!Code\n***/\n//{{{\nvar lewcidFullScreen = false;\n\nconfig.commands.fullscreen =\n{\n text:" โ ",\n tooltip:"Fullscreen mode"\n};\n\nconfig.commands.fullscreen.handler = function (event,src,title)\n{\n if (lewcidFullScreen == false)\n {\n lewcidFullScreen = true;\n setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important;}',"lewcidFullScreenStyle");\n }\n else\n {\n lewcidFullScreen = false;\n setStylesheet(' ',"lewcidFullScreenStyle");\n }\n}\n\nconfig.macros.fullscreen={};\nconfig.macros.fullscreen.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = params[0]||" โ ";\n var tooltip = params[1]||"Fullscreen mode";\n createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);\n}\n\nvar lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;\nStory.prototype.closeTiddler =function(title,animate,slowly)\n{\n lewcid_fullscreen_closeTiddler.apply(this,arguments);\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n\n\nSlider.prototype.lewcidStop = Slider.prototype.stop;\nSlider.prototype.stop = function()\n{\n this.lewcidStop();\n if (story.isEmpty() && lewcidFullScreen == true)\n config.commands.fullscreen.handler();\n}\n//}}}
config.macros.getversion = {}\nconfig.macros.getversion.handler = function(place,macroName,params)\n{\nvar versionData = version.extensions[params].major + "." + version.extensions[params].minor + "." + version.extensions[params].revision;\ncreateTiddlyElement(place,"span",null,null,versionData);\n}\n\nconfig.macros.getversiondate = {}\nconfig.macros.getversiondate.handler = function(place,macroName,params)\n{\nvar versionDate = version.extensions[params[0]].date.formatString(params[1].trim());\ncreateTiddlyElement(place,"span",null,null,versionDate);\n}
<<faqlist byTag Intro title hr>>
<<faqlist byTag Skypeing title hr>>
<<faqlist byTitle [[Glossary details]] question hr>>
'Sticky' block?\nA block on your Course site or Overview of my courses which is set by the Moodle administrator and cannot be removed.\n\n"My Moodle"\nThe 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.\n\nOverview of my courses\nThe title of the "My Moodle" page. Your default page which displays whenever you click on the EISMoodle link.\n\nMySQL\nThe database management system that ECS is now using to host Moodle\n\nCMS\nCourse 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.\n\nBlock\nMoodle parlance for the boxes that surround the Course outline on your course home page. These are mostly course management functions. Default blocks:\n|!left side |! right side|\n|People | Latest News|\n|Activities | Upcoming Events|\n|Search Forums | Recent Activity|\n|Administration | |\n|Course Categories | |\n
\n<<top>><<icon top.gif 16 16>>\n<<toggleSideBar '' '' hide>><<icon toggle.gif 16 16>>\n<<jump j '' top>><<icon jump.gif 16 16>>\n<<fullscreen f>><<icon full.gif 16 16>>\n
/***\n|Name|HoverMenuPlugin|\n|Created by|SaqImtiaz|\n|Location|http://tw.lewcid.org/#HoverMenuPlugin|\n|Version|1.11|\n|Requires|~TW2.x|\n!Description:\nProvides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.\n\n!Demo:\nObserve the hovering menu on the right edge of the screen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nTo customize your HoverMenu, edit the HoverMenu shadow tiddler.\n\nTo customize whether the menu sticks to the right or left edge of the screen, and its start position, edit the HoverMenu configuration settings part of the code below. It's well documented, so don't be scared!\n\nThe menu has an id of hoverMenu, in case you want to style the buttons in it using css.\n\n!Notes:\nSince the default HoverMenu contains buttons for toggling the side bar and jumping to the top of the screen and to open tiddlers, the ToggleSideBarMacro, JumpMacro and the JumpToTopMacro are included in this tiddler, so you dont need to install them separately. Having them installed separately as well could lead to complications.\n\nIf you dont intend to use these three macros at all, feel free to remove those sections of code in this tiddler.\n\n!To Do:\n* rework code to allow multiple hovering menus in different positions, horizontal etc.\n* incorporate code for keyboard shortcuts that correspond to the buttons in the hovermenu\n\n!History:\n*03-08-06, ver 1.1.2: compatibility fix with SelectThemePlugin\n*03-08-06, ver 1.11: fixed error with button tooltips\n*27-07-06, ver 1.1 : added JumpMacro to hoverMenu\n*23-07-06\n\n!Code\n***/\n\n/***\nstart HoverMenu plugin code\n***/\n//{{{\nconfig.hoverMenu={};\n//}}}\n\n/***\nHoverMenu configuration settings\n***/\n//{{{\nconfig.hoverMenu.settings={\n align: 'right', //align menu to right or left side of screen, possible values are 'right' and 'left' \n x: 1, // horizontal distance of menu from side of screen, increase to your liking.\n y: 158 //vertical distance of menu from top of screen at start, increase or decrease to your liking\n };\n//}}}\n\n//{{{\n//continue HoverMenu plugin code\nconfig.hoverMenu.handler=function()\n{ \n if (!document.getElementById("hoverMenu"))\n {\n var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");\n theMenu.setAttribute("refresh","content");\n theMenu.setAttribute("tiddler","HoverMenu");\n var menuContent = store.getTiddlerText("HoverMenu");\n wikify(menuContent,theMenu);\n }\n\n var Xloc = this.settings.x;\n Yloc =this.settings.y;\n var ns = (navigator.appName.indexOf("Netscape") != -1);\n function SetMenu(id)\n {\n var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];\n if(document.layers)GetElements.style=GetElements;\n GetElements.sP=function(x,y){this.style[config.hoverMenu.settings.align]=x +"px";this.style.top=y +"px";};\n GetElements.x = Xloc;\n GetElements.y = findScrollY();\n GetElements.y += Yloc;\n return GetElements;\n }\n window.LoCate_XY=function()\n {\n var pY = findScrollY();\n ftlObj.y += (pY + Yloc - ftlObj.y)/15;\n ftlObj.sP(ftlObj.x, ftlObj.y);\n setTimeout("LoCate_XY()", 10);\n }\n ftlObj = SetMenu("hoverMenu");\n LoCate_XY();\n};\n\nwindow.old_lewcid_hovermenu_restart = restart;\nrestart = function()\n{\n window.old_lewcid_hovermenu_restart();\n config.hoverMenu.handler();\n};\n\nsetStylesheet(\n"#hoverMenu .imgLink, #hoverMenu .imgLink:hover {border:none; padding:0px; float:right; margin-bottom:2px; margin-top:0px;}\sn"+\n"#hoverMenu .button, #hoverMenu .tiddlyLink {border:none; font-weight:bold; background:#18f; color:#FFF; padding:0 5px; float:right; margin-bottom:4px;}\sn"+\n"#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#fff; background:#000; padding:0 5px; float:right; margin-bottom:4px;}\sn"+\n"#hoverMenu .button {width:100%; text-align:center}"+\n"#hoverMenu { position:absolute; width:7px;}\sn"+\n"\sn","hoverMenuStyles");\n\n\nconfig.macros.renameButton={};\nconfig.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n\n if (place.lastChild.tagName!="BR")\n {\n place.lastChild.firstChild.data = params[0];\n if (params[1]) {place.lastChild.title = params[1];}\n }\n};\n\nconfig.shadowTiddlers["HoverMenu"]="<<top>>\sn<<toggleSideBar>><<renameButton '>' >>\sn<<jump j '' top>>\sn<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>\sn<<newTiddler>><<renameButton n>>\sn";\n//}}}\n//end HoverMenu plugin code\n\n//Start ToggleSideBarMacro code\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em;}\sn"+"",\n styleShow : " ",\n arrow1: "ยซ",\n arrow2: "ยป"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n//}}}\n//end ToggleSideBarMacro code\n\n//start JumpToTopMacro code\n//{{{\nconfig.macros.top={};\nconfig.macros.top.handler=function(place,macroName)\n{\n createTiddlyButton(place,"^","jump to top",this.onclick);\n}\nconfig.macros.top.onclick=function()\n{\n window.scrollTo(0,0);\n};\n\nconfig.commands.top =\n{\n text:" ^ ",\n tooltip:"jump to top"\n};\n\nconfig.commands.top.handler = function(event,src,title)\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpToStartMacro code\n\n//start JumpMacro code\n//{{{\nconfig.macros.jump= {};\nconfig.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = (params[0] && params[0]!=".")? params[0]: 'jump';\n var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';\n var top = (params[2] && params[2]=='top') ? true: false; \n\n var btn =createTiddlyButton(place,label,tooltip,this.onclick);\n if (top==true)\n btn.setAttribute("top","true")\n}\n\nconfig.macros.jump.onclick = function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var top = theTarget.getAttribute("top");\n var popup = Popup.create(this);\n if(popup)\n {\n if(top=="true")\n {createTiddlyButton(createTiddlyElement(popup,"li"),'Top โ','Top of TW',config.macros.jump.top);\n createTiddlyElement(popup,"hr");}\n \n story.forEachTiddler(function(title,element) {\n createTiddlyLink(createTiddlyElement(popup,"li"),title,true);\n });\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nconfig.macros.jump.top = function()\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpMacro code\n\n//utility functions\n//{{{\nPopup.show = function(unused,slowly)\n{\n var curr = Popup.stack[Popup.stack.length-1];\n var rootLeft = findPosX(curr.root);\n var rootTop = findPosY(curr.root);\n var rootHeight = curr.root.offsetHeight;\n var popupLeft = rootLeft;\n var popupTop = rootTop + rootHeight;\n var popupWidth = curr.popup.offsetWidth;\n var winWidth = findWindowWidth();\n if (isChild(curr.root,'hoverMenu'))\n var x = config.hoverMenu.settings.x;\n else\n var x = 0;\n if(popupLeft + popupWidth+x > winWidth)\n popupLeft = winWidth - popupWidth -x;\n if (isChild(curr.root,'hoverMenu'))\n {curr.popup.style.right = x + "px";}\n else\n curr.popup.style.left = popupLeft + "px";\n curr.popup.style.top = popupTop + "px";\n curr.popup.style.display = "block";\n addClass(curr.root,"highlight");\n if(config.options.chkAnimate)\n anim.startAnimating(new Scroller(curr.popup,slowly));\n else\n window.scrollTo(0,ensureVisible(curr.popup));\n}\n\nwindow.isChild = function(e,parentId) {\n while (e != null) {\n var parent = document.getElementById(parentId);\n if (parent == e) return true;\n e = e.parentNode;\n }\n return false;\n};\n//}}}\n\n\n
//{{{\n// version: beta 1.1\n//replace macro buttons with icons\n// params[0] = image location\n//params[1] = image width\n//params[2] = image height\n//params[3] = image title (optional)\nconfig.macros.icon={};\nconfig.macros.icon.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n\n if (place.lastChild.tagName!="BR")\n {\n var tempTitle = place.lastChild.firstChild.title;\n removeChildren(place.lastChild);\n place.lastChild.className = "imgLink";\n var img = createTiddlyElement(place.lastChild,"img");\n img.src = params[0];\n if (params[3])\n img.title = params[3];\n img.width= params[1];\n img.height =params[2];\n }\n};\n\n//use icons for toolbar commands.\n// used in view template like:\n// <span macro='commandIcon jump jump.bmp'></span>\n//params[0] = command name\n//params[1] = image location\nconfig.macros.commandIcon={};\nconfig.macros.commandIcon.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{if(!e) var e = window.event;\n var img = createTiddlyElement(place,"img",null,"toolbarImg");\n img.src = params[1];\n img.onclick = function(){config.commands[params[0]].handler(e,place,story.findContainingTiddler(place).getAttribute("tiddler"));};\n img.title = config.commands[params[0]].tooltip;\n}\n\nsetStylesheet(".toolbarImg {vertical-align: middle; cursor:pointer;}\sn","commandIconStyles"); \n\n//}}}
// //''Name:'' ImageLink\n// //''Version:'' <<getversion imglink>> (<<getversiondate imglink "DD MMM YYYY">>)\n// //''Author:'' AlanHecht\n// //''Type:'' [[Macro|Macros]]\n\n// //''Description:'' Inserts an external image file as a hyperlink to a URL, a tiddler, or a javascript function.\n\n// //''Syntax:'' << {{{imglink imageSrc linkTo "altText" borderSize width height}}} >>\n// //Examples: \n// //<<imglink fractalveg.jpg http://www.tiddlywiki.com#EmbeddedImages "Nice broccoli!" 1 auto 41>> (webpage link, includes height) //IE will not display properly//*\n\n// //<<imglink fractalveg.jpg test.htm "Nice broccoli!" 1 85 41>> (link to local file, includes both width & height parameters)\n\n// //<<imglink fractalveg.jpg self null 1 84 41>> (image with null alt text that links to itself using 'self')\n\n// //<<imglink fractalveg.jpg null "Cool!" 4 79 38>> (image with "null" link but takes advantage of other parameters)\n\n// //<<imglink brixhamharbour.jpg HelloThere "Click to learn more!" 1>> (local image that links to a tiddler)\n\n// //<<imglink http://www.tiddlywiki.com/brixhamharbour.jpg "sampleFunction('You called a function!')" "Click to call a function!" 1>> (image from the web that calls a function)\n\n// //''Directions:'' <<tiddler MacroDirections>> Also, you do not need to copy the sampleFunction() function that appears at the bottom of the code section. It is used simply to demo this macro calling a function.\n\n// //''Notes:'' Optional border value is set at zero unless you specify another value. If you choose to set a border, you may also want to change the color for the border in the code section below or using the CustomStyleSheet. If you specify width and height, you ''must'' provide a border value (use 0 for no border) .\n// //If any of your macro parameters contain spaces, then surround the phrase in quote marks, otherwise quotes are not needed.\n// //If you use imglink to call a function (useful for adding interface buttons, etc.), the macro will first try to test whether the function exists. If you typed the name of the function incorrectly, you will receive an error when the macro runs. If the function does exist, then it is called with all the parameters you specified.\n// //*If you set an image width, some browsers (like IE) will require that you set the height value as well. For browsers that will autosize, you can replace the actual width/height value with the word {{{auto}}}.\n\n// //''Known Issues:'' This macro will not work if called from within a table.\n\n// //''Revision History:''\n// // v0.1.0 (22 July 2005): initial release\n// // v0.1.1 (22 July 2005): added support for linking to local files as well as no link at all\n// // v0.1.2 (15 August 2005): fixed an issue with self-linking images (note: the syntax for these image links changed to 'self')\n\n\n// //''Code section:''\nversion.extensions.imglink = {major: 0, minor: 1, revision: 2, date: new Date("Aug 15, 2005")};\nconfig.macros.imglink = {}\nconfig.macros.imglink.handler = function(place,macroName,params)\n{\nvar theLink = null;\nvar theAction = null;\nvar data = params;\nvar linkTo = data[1];\nvar box = createTiddlyElement(place,"span",null,"imgLinkBox",String.fromCharCode(160));\nbox.style.position = "relative";\nif(data[2] && data[2]!="null")\n box.title = data[2];\nvar theImage = document.createElement("img");\ntheImage.src = data[0];\ntheImage.className = "linkedImg";\ntheImage.style.position = "relative";\ntheImage.style.verticalAlign = "top";\ntheImage.border = data[3] ? data[3] : 0;\ntheImage.style.borderColor = "black";\nif(data[4] && data[4]!="auto")\n theImage.width = data[4];\nif(data[5] && data[5]!="auto")\n theImage.height = data[5];\n\nvar tiddlerText = store.getTiddlerText(linkTo);\nvar func = linkTo.substring(0,data[1].indexOf("("));\n// test for tiddler link\nif(tiddlerText)\n {\n theLink = document.createElement("a");\n theAction = function() {displayTiddler(this,linkTo,1,null,null,null,false,false);};\n theLink.onclick = theAction;\n theLink.href = "javascript:;";\n }\n// test for function call\nelse if(window[func] || typeof eval(func)=="function")\n {\n theLink = document.createElement("a");\n theAction = function() {eval(linkTo);};\n theLink.onclick = theAction;\n theLink.href = "javascript:;";\n }\n// test for link to image view\nelse if(linkTo == "self")\n {\n theLink = document.createElement("a");\n theLink.href = theImage.src;\n if(config.options.chkOpenInNewWindow)\n theLink.target = "_blank";\n }\n// test for no link\nelse if(linkTo == null || linkTo == "null")\n {\n theLink = document.createElement("span");\n }\nelse\n {\n theLink = document.createElement("a");\n theLink.href = data[1];\n if(config.options.chkOpenInNewWindow)\n theLink.target = "_blank";\n }\n\ntheLink.appendChild(theImage);\n//box.width=theImage.offsetWidth;\n//box.height=theImage.offsetHeight;\nbox.appendChild(theLink);\n}\n\n\n// //''The following function is not needed and is for demo purposes only''\nfunction sampleFunction(message)\n{\nalert(message);\n}
//{{{\nconfig.formatters.unshift( {\n name: "inlinesliders",\n match: "\s\s+\s\s+\s\s+\s\s+|\s\s<slider",\n lookaheadRegExp: /(?:\s+\s+\s+\s+|<slider) (\sw*)(?:>?)\sn((?:.|\sn)*?)\sn(?:====|<\s/slider>)/mg,\n handler: function(w)\n {\n this.lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = this.lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart )\n {\n var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\su00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");\n var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");\n panel.style.display = "none";\n wikify(lookaheadMatch[2],panel);\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n },\n onClickSlider : function(e)\n {\n if(!e) var e = window.event;\n var n = this.nextSibling;\n n.style.display = (n.style.display=="none") ? "block" : "none";\n return false;\n }\n})\n//}}}
\n|!#|!Title| !Description |\n|1|iTunes & Podcasts|Listening to podcasts with iTunes. Podcasting as a pedagogical tool. Ways for using podcasts in class assignments|\n|2|Blogging|Why use a weBlog. Blogging at Earlham. 101.5 reasons why blogging is cool|\n|3|Web sites made easy|Using Tiddlywiki to create your Home page or other web site|\n|4|Social bookmarking with del.icio.us|How the use of del.icio.us can enhance group research on the web|\n|5|web research with Firefox|Firefox extensions to make your research more productive. Scrapbook, del.icio.us.|\n|6|breaking barriers with Thunderbird email|Why move from Eudora to Thunderbird? Ease of use, Spam filtering, instant lookup of Earlham email addresses using LDAP, access mail from server using IMAP, and message filtering|\n
[[Amy Bryant|mailto://bryanam@earlham.edu]]\n[[Neal Baker|mailto://bakerne@earlham.edu]]\n[[Mark Pearson|markp@earlham.edu]]
/***\n|''Name:''|~IntelliTaggerPlugin|\n|''Version:''|1.0.0 (2006-04-26)|\n|''Type:''|plugin|\n|''Source:''|http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin|\n|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|\n|''Documentation:''|[[IntelliTaggerPlugin Documentation]]|\n|''Source Code:''|[[IntelliTaggerPlugin SourceCode]]|\n|''Licence:''|[[BSD open source license (abego Software)]]|\n|''~TiddlyWiki:''|Version 2.0.8 or better|\n|''Browser:''|Firefox 1.5.0.2 or better|\n\n***/\n// /%\nif(!version.extensions.IntelliTaggerPlugin){if(!window.abego){window.abego={};}if(!abego.internal){abego.internal={};}abego.alertAndThrow=function(s){alert(s);throw s;};if(version.major<2){abego.alertAndThrow("Use TiddlyWiki 2.0.8 or better to run the IntelliTagger Plugin.");}version.extensions.IntelliTaggerPlugin={major:1,minor:0,revision:0,date:new Date(2006,3,26),type:"plugin",source:"http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin",documentation:"[[IntelliTaggerPlugin Documentation]]",sourcecode:"[[IntelliTaggerPlugin SourceCode]]",author:"Udo Borkowski (ub [at] abego-software [dot] de)",licence:"[[BSD open source license (abego Software)]]",tiddlywiki:"Version 2.0.8 or better",browser:"Firefox 1.5.0.2 or better"};abego.isPopupOpen=function(_2){return _2&&_2.parentNode==document.body;};abego.openAsPopup=function(_3){if(_3.parentNode!=document.body){document.body.appendChild(_3);}};abego.closePopup=function(_4){if(abego.isPopupOpen(_4)){document.body.removeChild(_4);}};abego.getWindowRect=function(){return {left:findScrollX(),top:findScrollY(),height:findWindowHeight(),width:findWindowWidth()};};abego.moveElement=function(_5,_6,_7){_5.style.left=_6+"px";_5.style.top=_7+"px";};abego.centerOnWindow=function(_8){if(_8.style.position!="absolute"){throw "abego.centerOnWindow: element must have absolute position";}var _9=abego.getWindowRect();abego.moveElement(_8,_9.left+(_9.width-_8.offsetWidth)/2,_9.top+(_9.height-_8.offsetHeight)/2);};abego.isDescendantOrSelf=function(_a,e){while(e){if(_a==e){return true;}e=e.parentNode;}return false;};abego.toSet=function(_c){var _d={};for(var i=0;i<_c.length;i++){_d[_c[i]]=true;}return _d;};abego.filterStrings=function(_f,_10,_11){var _12=[];for(var i=0;i<_f.length&&(_11===undefined||_12.length<_11);i++){var s=_f[i];if(s.match(_10)){_12.push(s);}}return _12;};abego.arraysAreEqual=function(a,b){var n=a.length;if(n!=b.length){return false;}for(var i=0;i<n;i++){if(a[i]!=b[i]){return false;}}return true;};abego.moveBelowAndClip=function(_19,_1a){if(!_1a){return;}var _1b=findPosX(_1a);var _1c=findPosY(_1a);var _1d=_1a.offsetHeight;var _1e=_1b;var _1f=_1c+_1d;var _20=findWindowWidth();if(_20<_19.offsetWidth){_19.style.width=(_20-100)+"px";}var _21=_19.offsetWidth;if(_1e+_21>_20){_1e=_20-_21-30;}if(_1e<0){_1e=0;}_19.style.left=_1e+"px";_19.style.top=_1f+"px";_19.style.display="block";};abego.compareStrings=function(a,b){return (a==b)?0:(a<b)?-1:1;};abego.sortIgnoreCase=function(arr){var _25=[];var n=arr.length;for(var i=0;i<n;i++){var s=arr[i];_25.push([s.toString().toLowerCase(),s]);}_25.sort(function(a,b){return (a[0]==b[0])?0:(a[0]<b[0])?-1:1;});for(i=0;i<n;i++){arr[i]=_25[i][1];}};abego.getTiddlerField=function(_2b,_2c,_2d){var _2e=document.getElementById(_2b.idPrefix+_2c);var e=null;if(_2e!=null){var _30=_2e.getElementsByTagName("*");for(var t=0;t<_30.length;t++){var c=_30[t];if(c.tagName.toLowerCase()=="input"||c.tagName.toLowerCase()=="textarea"){if(!e){e=c;}if(c.getAttribute("edit")==_2d){e=c;}}}}return e;};abego.setRange=function(_33,_34,end){if(_33.setSelectionRange){_33.setSelectionRange(_34,end);var max=0+_33.scrollHeight;var len=_33.textLength;var top=max*_34/len,bot=max*end/len;_33.scrollTop=Math.min(top,(bot+top-_33.clientHeight)/2);}else{if(_33.createTextRange!=undefined){var _39=_33.createTextRange();_39.collapse();_39.moveEnd("character",end);_39.moveStart("character",_34);_39.select();}else{_33.select();}}};abego.internal.TagManager=function(){var _3a=null;var _3b=function(){if(_3a){return;}_3a={};store.forEachTiddler(function(_3c,_3d){for(var i=0;i<_3d.tags.length;i++){var tag=_3d.tags[i];var _40=_3a[tag];if(!_40){_40=_3a[tag]={count:0,tiddlers:{}};}_40.tiddlers[_3d.title]=true;_40.count+=1;}});};var _41=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(_42,_43,_44,_45,_46,_47){var _48=this.fetchTiddler(_42);var _49=_48?_48.tags:[];var _4a=(typeof _47=="string")?_47.readBracketedList():_47;_41.apply(this,arguments);if(!abego.arraysAreEqual(_49,_4a)){abego.internal.getTagManager().reset();}};var _4b=TiddlyWiki.prototype.removeTiddler;TiddlyWiki.prototype.removeTiddler=function(_4c){var _4d=this.fetchTiddler(_4c);var _4e=_4d&&_4d.tags.length>0;_4b.apply(this,arguments);if(_4e){abego.internal.getTagManager().reset();}};this.reset=function(){_3a=null;};this.getTiddlersWithTag=function(tag){_3b();var _50=_3a[tag];return _50?_50.tiddlers:null;};this.getAllTags=function(_51){_3b();var _52=[];for(var i in _3a){_52.push(i);}for(i=0;_51&&i<_51.length;i++){_52.pushUnique(_51[i],true);}abego.sortIgnoreCase(_52);return _52;};this.getTagInfos=function(){_3b();var _54=[];for(var _55 in _3a){_54.push([_55,_3a[_55]]);}return _54;};var _56=function(a,b){var a1=a[1];var b1=b[1];var d=b[1].count-a[1].count;return d!=0?d:abego.compareStrings(a[0].toLowerCase(),b[0].toLowerCase());};this.getSortedTagInfos=function(){_3b();var _5c=this.getTagInfos();_5c.sort(_56);return _5c;};this.getPartnerRankedTags=function(_5d){var _5e={};for(var i=0;i<_5d.length;i++){var _60=this.getTiddlersWithTag(_5d[i]);for(var _61 in _60){var _62=store.getTiddler(_61);if(!(_62 instanceof Tiddler)){continue;}for(var j=0;j<_62.tags.length;j++){var tag=_62.tags[j];var c=_5e[tag];_5e[tag]=c?c+1:1;}}}var _66=abego.toSet(_5d);var _67=[];for(var n in _5e){if(!_66[n]){_67.push(n);}}_67.sort(function(a,b){var d=_5e[b]-_5e[a];return d!=0?d:abego.compareStrings(a.toLowerCase(),b.toLowerCase());});return _67;};};abego.internal.getTagManager=function(){if(!abego.internal.gTagManager){abego.internal.gTagManager=new abego.internal.TagManager();}return abego.internal.gTagManager;};(function(){var _6c=2;var _6d=1;var _6e=30;var _6f;var _70;var _71;var _72;var _73;var _74;if(!abego.IntelliTagger){abego.IntelliTagger={};}var _75=function(){return _70;};var _76=function(tag){return _73[tag];};var _78=function(s){var i=s.lastIndexOf(" ");return (i>=0)?s.substr(0,i):"";};var _7b=function(_7c){var s=_7c.value;var len=s.length;return (len>0&&s[len-1]!=" ");};var _7f=function(_80){var s=_80.value;var len=s.length;if(len>0&&s[len-1]!=" "){_80.value+=" ";}};var _83=function(tag,_85,_86){if(_7b(_85)){_85.value=_78(_85.value);}story.setTiddlerTag(_86.title,tag,0);_7f(_85);abego.IntelliTagger.assistTagging(_85,_86);};var _87=function(n){if(_74){if(_74.length>n){return _74[n];}n-=_74.length;}return (_72&&_72.length>n)?_72[n]:null;};var _89=function(n,_8b,_8c){var _8d=_87(n);if(_8d){_83(_8d,_8b,_8c);}};var _8e=function(_8f){var pos=_8f.value.lastIndexOf(" ");var _91=(pos>=0)?_8f.value.substr(++pos,_8f.value.length):_8f.value;return new RegExp(_91.escapeRegExp(),"i");};var _92=function(_93,_94){var _95=0;for(var i=0;i<_93.length;i++){if(_94[_93[i]]){_95++;}}return _95;};var _97=function(_98,_99,_9a){var _9b=1;var c=_98[_99];for(var i=_99+1;i<_98.length;i++){if(_98[i][1].count==c){if(_98[i][0].match(_9a)){_9b++;}}else{break;}}return _9b;};var _9e=function(_9f,_a0){var _a1=abego.internal.getTagManager().getSortedTagInfos();var _a2=[];var _a3=0;for(var i=0;i<_a1.length;i++){var c=_a1[i][1].count;if(c!=_a3){if(_a0&&(_a2.length+_97(_a1,i,_9f)>_a0)){break;}_a3=c;}if(c==1){break;}var s=_a1[i][0];if(s.match(_9f)){_a2.push(s);}}return _a2;};var _a7=function(_a8,_a9){return abego.filterStrings(abego.internal.getTagManager().getAllTags(_a9),_a8);};var _aa=function(){if(!_6f){return;}var _ab=store.getTiddlerText("IntelliTaggerMainTemplate");if(!_ab){_ab="<b>Tiddler IntelliTaggerMainTemplate not found</b>";}_6f.innerHTML=_ab;applyHtmlMacros(_6f,null);refreshElements(_6f,null);};var _ac=function(e){if(!e){var e=window.event;}var tag=this.getAttribute("tag");if(_71){_71.call(this,tag,e);}return false;};var _af=function(_b0,_b1,_b2,_b3){if(!_b1){return;}var _b4=_b3?abego.toSet(_b3):{};var n=_b1.length;for(var i=0;i<n;i++){var tag=_b1[i];if(_b4[tag]){continue;}if(i>0){createTiddlyElement(_b0,"span",null,"tagSeparator"," | ");}var _b8="";var _b9=_b0;if(_b2<10){_b9=createTiddlyElement(_b0,"span",null,"numberedSuggestion");_b2++;var key=_b2<10?""+(_b2):"0";createTiddlyElement(_b9,"span",null,"suggestionNumber",key+") ");var _bb=_b2==1?"Ctrl-Space or ":"";_b8=" (Shortcut: %1Alt-%0)".format([key,_bb]);}var _bc=config.views.wikified.tag.tooltip.format([tag]);var _bd=(_76(tag)?"Remove tag '%0'%1":"Add tag '%0'%1").format([tag,_b8]);var _be="%0; Shift-Click: %1".format([_bd,_bc]);var btn=createTiddlyButton(_b9,tag,_be,_ac,_76(tag)?"currentTag":null);btn.setAttribute("tag",tag);}};var _c0=function(){if(_6f){window.scrollTo(0,ensureVisible(_6f));}if(_75()){window.scrollTo(0,ensureVisible(_75()));}};var _c1=function(e){if(!e){var e=window.event;}if(!_6f){return;}var _c3=resolveTarget(e);if(_c3==_75()){return;}if(abego.isDescendantOrSelf(_6f,_c3)){return;}abego.IntelliTagger.close();};addEvent(document,"click",_c1);var _c4=Story.prototype.gatherSaveFields;Story.prototype.gatherSaveFields=function(e,_c6){_c4.apply(this,arguments);var _c7=_c6.tags;if(_c7){_c6.tags=_c7.trim();}};var _c8=function(_c9){story.focusTiddler(_c9,"tags");var _ca=abego.getTiddlerField(story,_c9,"tags");if(_ca){var len=_ca.value.length;abego.setRange(_ca,len,len);window.scrollTo(0,ensureVisible(_ca));}};var _cc=config.macros.edit.handler;config.macros.edit.handler=function(_cd,_ce,_cf,_d0,_d1,_d2){_cc.apply(this,arguments);var _d3=_cf[0];if((_d2 instanceof Tiddler)&&_d3=="tags"){var _d4=_cd.lastChild;_d4.onfocus=function(e){abego.IntelliTagger.assistTagging(_d4,_d2);setTimeout(function(){_c8(_d2.title);},100);};_d4.onkeyup=function(e){if(!e){var e=window.event;}if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.keyCode>=48&&e.keyCode<=57)){_89(e.keyCode==48?9:e.keyCode-49,_d4,_d2);}else{if(e.ctrlKey&&e.keyCode==32){_89(0,_d4,_d2);}}setTimeout(function(){abego.IntelliTagger.assistTagging(_d4,_d2);},100);return false;};_7f(_d4);}};var _d7=function(e){if(!e){var e=window.event;}var _d9=resolveTarget(e);var _da=_d9.getAttribute("tiddler");if(_da){story.displayTiddler(_d9,_da,"IntelliTaggerEditTagsTemplate",false);_c8(_da);}return false;};var _db=config.macros.tags.handler;config.macros.tags.handler=function(_dc,_dd,_de,_df,_e0,_e1){_db.apply(this,arguments);abego.IntelliTagger.createEditTagsButton(_e1,createTiddlyElement(_dc.lastChild,"li"));};var _e2=function(){if(_6f&&_70&&!abego.isDescendantOrSelf(document,_70)){abego.IntelliTagger.close();}};setInterval(_e2,100);abego.IntelliTagger.displayTagSuggestions=function(_e3,_e4,_e5,_e6,_e7){_72=_e3;_73=abego.toSet(_e4);_74=_e5;_70=_e6;_71=_e7;if(!_6f){_6f=createTiddlyElement(document.body,"div",null,"intelliTaggerSuggestions");_6f.style.position="absolute";}_aa();abego.openAsPopup(_6f);if(_75()){var w=_75().offsetWidth;if(_6f.offsetWidth<w){_6f.style.width=(w-2*(_6c+_6d))+"px";}abego.moveBelowAndClip(_6f,_75());}else{abego.centerOnWindow(_6f);}_c0();};abego.IntelliTagger.assistTagging=function(_e9,_ea){var _eb=_8e(_e9);var s=_e9.value;if(_7b(_e9)){s=_78(s);}var _ed=s.readBracketedList();var _ee=_ed.length>0?abego.filterStrings(abego.internal.getTagManager().getPartnerRankedTags(_ed),_eb,_6e):_9e(_eb,_6e);abego.IntelliTagger.displayTagSuggestions(_a7(_eb,_ed),_ed,_ee,_e9,function(tag,e){if(e.shiftKey){onClickTag.call(this,e);}else{_83(tag,_e9,_ea);}});};abego.IntelliTagger.close=function(){abego.closePopup(_6f);_6f=null;return false;};abego.IntelliTagger.createEditTagsButton=function(_f1,_f2,_f3,_f4,_f5,id,_f7){if(!_f3){_f3="[edit]";}if(!_f4){_f4="Edit the tags";}if(!_f5){_f5="editTags";}var _f8=createTiddlyButton(_f2,_f3,_f4,_d7,_f5,id,_f7);_f8.setAttribute("tiddler",(_f1 instanceof Tiddler)?_f1.title:String(_f1));return _f8;};config.macros.intelliTagger={label:"intelliTagger",handler:function(_f9,_fa,_fb,_fc,_fd,_fe){var _ff=_fd.parseParams("list",null,true);var _100=_ff[0]["action"];for(var i=0;_100&&i<_100.length;i++){var _102=_100[i];var _103=config.macros.intelliTagger.subhandlers[_102];if(!_103){abego.alertAndThrow("Unsupported action '%0'".format([_102]));}_103(_f9,_fa,_fb,_fc,_fd,_fe);}},subhandlers:{showTags:function(_104,_105,_106,_107,_108,_109){_af(_104,_72,_74?_74.length:0,_74);},showFavorites:function(_10a,_10b,_10c,_10d,_10e,_10f){_af(_10a,_74,0);},closeButton:function(_110,_111,_112,_113,_114,_115){var _116=createTiddlyButton(_110,"close","Close the suggestions",abego.IntelliTagger.close);},version:function(_117){var t="IntelliTagger %0.%1.%2".format([version.extensions.IntelliTaggerPlugin.major,version.extensions.IntelliTaggerPlugin.minor,version.extensions.IntelliTaggerPlugin.revision]);var e=createTiddlyElement(_117,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de/#IntelliTaggerPlugin");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">"+t+"<font>";},copyright:function(_11a){var e=createTiddlyElement(_11a,"a");e.setAttribute("href","http://tiddlywiki.abego-software.de");e.innerHTML="<font color=\s"black\s" face=\s"Arial, Helvetica, sans-serif\s">© 2006 <b><font color=\s"red\s">abego</font></b> Software<font>";}}};})();config.shadowTiddlers["IntelliTaggerStyleSheet"]="/***\sn"+"!~IntelliTagger Stylesheet\sn"+"***/\sn"+"/*{{{*/\sn"+".intelliTaggerSuggestions {\sn"+"\stposition: absolute;\sn"+"\stwidth: 600px;\sn"+"\sn"+"\stpadding: 2px;\sn"+"\stlist-style: none;\sn"+"\stmargin: 0;\sn"+"\sn"+"\stbackground: #eeeeee;\sn"+"\stborder: 1px solid DarkGray;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .currentTag {\sn"+"\stfont-weight: bold;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .suggestionNumber {\sn"+"\stcolor: #808080;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .numberedSuggestion{\sn"+"\stwhite-space: nowrap;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter {\sn"+"\stmargin-top: 4px;\sn"+"\stborder-top-width: thin;\sn"+"\stborder-top-style: solid;\sn"+"\stborder-top-color: #999999;\sn"+"}\sn"+".intelliTaggerSuggestions .favorites {\sn"+"\stborder-bottom-width: thin;\sn"+"\stborder-bottom-style: solid;\sn"+"\stborder-bottom-color: #999999;\sn"+"\stpadding-bottom: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .normalTags {\sn"+"\stpadding-top: 2px;\sn"+"}\sn"+"\sn"+".intelliTaggerSuggestions .intelliTaggerFooter .button {\sn"+"\stfont-size: 10px;\sn"+"\sn"+"\stpadding-left: 0.3em;\sn"+"\stpadding-right: 0.3em;\sn"+"}\sn"+"\sn"+"/*}}}*/\sn";config.shadowTiddlers["IntelliTaggerMainTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class=\s"favorites\s" macro=\s"intelliTagger action: showFavorites\s"></div>\sn"+"<div class=\s"normalTags\s" macro=\s"intelliTagger action: showTags\s"></div>\sn"+"<!-- The Footer (with the Navigation) ============================================ -->\sn"+"<table class=\s"intelliTaggerFooter\s" border=\s"0\s" width=\s"100%\s" cellspacing=\s"0\s" cellpadding=\s"0\s"><tbody>\sn"+" <tr>\sn"+"\st<td align=\s"left\s">\sn"+"\st\st<span macro=\s"intelliTagger action: closeButton\s"></span>\sn"+"\st</td>\sn"+"\st<td align=\s"right\s">\sn"+"\st\st<span macro=\s"intelliTagger action: version\s"></span>, <span macro=\s"intelliTagger action: copyright \s"></span>\sn"+"\st</td>\sn"+" </tr>\sn"+"</tbody></table>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["IntelliTaggerEditTagsTemplate"]="<!--\sn"+"{{{\sn"+"-->\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='title' macro='view title'></div>\sn"+"<div class='tagged' macro='tags'></div>\sn"+"<div class='viewer' macro='view text wikified'></div>\sn"+"<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler'></div>\sn"+"<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\sn"+"<!--\sn"+"}}}\sn"+"-->\sn";config.shadowTiddlers["BSD open source license (abego Software)"]="See [[Licence|http://tiddlywiki.abego-software.de/#%5B%5BBSD%20open%20source%20license%5D%5D]].";config.shadowTiddlers["IntelliTaggerPlugin Documentation"]="[[Documentation on abego Software website|http://tiddlywiki.abego-software.de/doc/IntelliTagger.pdf]].";config.shadowTiddlers["IntelliTaggerPlugin SourceCode"]="[[Plugin source code on abego Software website|http://tiddlywiki.abego-software.de/src/Plugin-IntelliTagger-src.js]]";setStylesheet(store.getTiddlerText("IntelliTaggerStyleSheet"),"intelliTagger");}\n//%/\n
For IntelliTaggerPlugin source code see the [[archive|http://tiddlywiki.abego-software.de/archive]].
Some international students travelled home over the last Christmas break and wanted to access Moodle. While doing this, they changed the timezone to reflect their local time. Thus, those who went back to Japan may have changed their timezone for Moodle from -5 GMT (EST) to +9 GMT (JST). You will need to change it back to the default to see the correct due date and time and so that your assignment submissions have the correct timestamp. Here's how:\n# while in Moodle click on your name\n# select Edit Profile tab\n# for the Timezone: select 'Server's local time'\n# click the [Update profile] button.
!!General\n# Why use Moodle ? [[Moodle : Benefits]]\n# Managing your course in Moodle [[Course Management]]\n# Pedagogical benefits [[Pedagogical Pros]]\n# Types of Moodle Course [[Course screen-shots]]\n# [[Course Outlines]]\n# [[Course screen-shots]]\n!!Setting up your course\n* arrangement of items in the Moodle window:\n> @@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.\n> @@OUTLINE@@ : the main content area of your course organized in chunks labeled with weekly dates (Weekly layout) or numbers (Topics layout)\n* Changing settings. \n> +++[Administration:Settings]>\n# don't change Fullname or shortname\n# copy summary from syllabus & paste into Summary\n# Outline : weekly/topics\n# can change the theme for your course\n# Groups - setup (forced/not , visible/separate)\n# Availability -- @@ADD ENROLMENT KEY@@ [Note : student enrolment]\n''Save changes'' - nothing gets saved unless this is done \n===\n\n* Assigning roles\n> +++[Administration:Assign roles]>\n* Can add other teachers or non-editing teachers\n* Note [[Librarian Moodle support|http://ec281.lly.earlham.edu/tw/miss/#%5B%5BNew%20role%20%3A%20Librarian%20Moodle%20Support%5D%5D]] and [[Course Assistant|http://ec281.lly.earlham.edu/tw/miss/#%5B%5BNew%20role%20%3A%20Course%20Assistant%5D%5D]]\n===\n\n* Course editing process - \n> +++[Turn editing on]>\n* switch roles to view\n* Top section appears\n* Add Resources\n* Add Activity\n* Move items, hide, delete, rearrange\n===\n\n* Adding blocks - \n> +++[Latest News block]>\n* Add Latest News block\n* Click [Add New Topic] -- read through the screen. \n** Note : //Everyone is subscribed to this Forum// \n** What this means : postings are emailed to all students in the class\n** Note also: [Mail now] box (explain how the posting system works)\n* Click News Forum [@@NAVIGATION@@]\n* click Update [@@EDIT@@]\n* rename Forum name to "Email class" or whatever you like\n** Force sunscription : yes\n** Read tracking -- what's this? [@@USE HELP@@]\n* Save changes. Note what the results.\n===\n\n* Add a 'resource' - Syllabus [@@DEFINE RESOURCES@@]\n> +++[Upload file]>\n* Administration : Files\n* Upload\n* Browse : Upload. [@@FIND the FILE@@] [@@FILE FORMAT@@ for resources]\n* Open\n* Upload\nNote that Files section is invisible to students ===\n\n> +++[Add Resouce -> Link to File or Web site]>\n* type in name "Syllabus"\n* enter text into Summary, eg what's in the syllabus : [@@IMPORTANT@@]\n* [choose/upload] : popup window to Files.\n* ''Choose'' file you just uploaded. \nNote : resource name different from filename. Very useful independence.\n* Other options : Same window (helps navigation)\n* Common module settings : hide resource if you don't want students to see it just yet\n* Save changes\n===\n\n* Editing Course Outline\n> +++[Edit summary]>\nUses a simple HTML editor\n* Click on the ''pen'' icon \n* type in the topic you cover in week 1 (eg 'Introduction to Hogwarts' )\n* press [Enter]\n* highlight and format as Heading 2 [@@IMPORTANCE of HEADINGS@@]\n* click on Ordered list [@@IMPORTANCE of LISTS@@]\n* type a list of things to do (eg care and feeding of owls, etc)\n* type in //read Syllabus//\n* Save changes\nNotice how the text in the Outline is //automatically linked// to the Resource [@@USE of BROWSER TABS in EDITING@@]\n===\n\n* Adding Assignments\n> +++[Add Activity]>\n* Difference kinds of assignment (Advanced uploading files, Online Text, Upload single file, Offline activity)\n* When are each of these useful\n* Go through Upload single file\n* Due dates, accept late entries, notes, etc\n===\n\n
|>|>|>|>|>|>| !January 2007 |\n|Su|Mo|Tu|We|Th|Fr|Sa|\n||1|2|3|4|!5|6|\n|7|!8|9|10|11|12|13|\n|14|15|16|17|!18|19|20|\n|21|22|23|24|25|26|27|\n|28|29|30|31||||\n\n|!Jan|!Workshop opportunities|\n| 5|Moodle Workshops: Fri 5 Jan 07|\n| 8|Moodle Workshops: Mon 8 Jan 07|\n| 10|Classes start|\n| ''18''|[[Faculty Moodle Moot]]|\n| ''.'' |topics: podcasting, web research with firefox, breaking barriers with thunderbird email|\n\n. = date not yet set
Setting up your Mac to input Japanese is straightforward:\n# select Apple -> System Preferences : International\n# Language tab. Check that Japanese is listed. If not click Edit List and add it.\n# [[Input Menu tab|graphics/osx_input_menu.png]]<<imagebox>>\n** Check Character Palette, Japanese Kana Palette, Keyboard Viewer\n** Check Koteri : Hiragana, Katakana, Romaji\n!!!To Use\nIn Moodle Input box (or any other text input such as Word) pull down the flag on the top right menu bar & select Hiragana ''or'' press Ctrl-Shift-J. [[select keyboard input|graphics/osx_select_input.png]]<<imagebox>>\n\nNow you will input the phonetic Hiragana characters. Press <space> to convert them to character form.
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
I'm offering lunchtime workshops on assorted non-Moodle Instructional Technology topics. Here's a list of possible topics we could cover in 50 minutes. \n<<faqlist byTag ITworkshop modified>>\n
To register for an account:\n# Go to the [[Lyceum@Earlham|http://blogs.macarius.earlham.edu]] site and click on the 'Register' link at the top right of the page\n# Type in a username -- this can be any name you like but your Earlham username will be most memorable to you.\n# enter your Earlham email address\n# check 'Create Blog'? (otherwise you'll get an account but no blog).\n# click [Register] button and a link will be emailed to you with your password.\n# [In email] Open the link to Lyceum and type in the username and password\n
[[Lyceum|http://lyceum.ibiblio.org/about/]] is a multiuser version of the very popular [[wordpress|http://wordpress.org/]] blog. While Wordpress is probably the premier blogging platform it does have some drawbacks which make it virtually impossible to operate in a college environment. With Wordpress each blogger would have to run the code from her own user account, update the code when needed, and maintain the database with backups. While this is fine for techies it really doesn't scale well for use by the proles.\nAnd Lyceum offers some [[compelling advantages|http://www.redhat.com/magazine/019may06/features/lyceum/]]:\n* A single installation can support any number of users and blogs (~WordPress basically is one user : one blog)\n* User accounts and blogs are not linked. A user can have several blogs and any blog can have a group of users. This gives a lot of flexibility.\n* each blog looks and behaves exactly like a ~WordPress blog\n* compatability with ~WordPress themes\n* compatability with WP plugins that don't use the database\n* complete control over the blog by the user (called administrator)
!!Your Profile and Personal Options\nThis is the ''My Account'' page. Fields of note include:\n* Name :\n** Nickname -- this will be the name of your blog. It does ''not'' have to be the same as your login name. For example, I login to [[Lyceum@EC|http://blogs.macarius.earlham.edu/]] as 'markp' but my nickname is 'markpea' and my blog is at http://blogs.macarius.earlham.edu/markpea\n** Display name publicly As ... choose a name from the pull down menu. This will be the name that appears to others inside the Lyceum system.\n* Personal Options : use visual rich editor. Check this to use the handy dandy web editor.\n*Update Your Password\n** you will want to do this. For security do ''not'' make it the same as your email password.\nEnter your current password in the box and click Update Profile.\n\nWhen you have finished, click on the blogname on the top margin (eg 'markpea') to go to the [[Dashboard|Lyceum : dashboard]]\nNotice that you can also create a new blog using the link at the top right of the page. Remember that Lyceum supports [[multiple users and blogs|Lyceum : blogs & users]]
<<faqlist bytag Lyceum_info hr>>
!!Starting Up\n[[Moodle : Benefits]]\n[[Getting Started]]\n!!Workshops\n[[August Calendar]]\n[[Intro 8-14-07|Introduction to Moodle]]\n[[New 8-16-07|New Features Session : 8-16-07]]\n!!Management\n[[Course backup|Create a Course Backup]]\n[[Course restore|Course Restore Procedure]]\n[[Problems|Problems with new Moodle]]\n!!Teaching\n[[Course Outlines]]\n[[Course screen-shots]]\n[[Best Practices]]\n[[Course Management tips]]\n!!Documentation\n[[ARTstor|ARTstor and the Offline Image Viewer]]\n[[del.icio.us FAQ]]\n[[Moodle FAQ]]\n[[Moodle Links]]\n[[Glossary]]\n[[Skype FAQ|Getting started with Skype]]\n[[Wiki FAQ]]\n!![[Problems]]\n\n!![[Taglist]]\n----\n!!Reuse\n[[download|http://www.earlham.edu/markp/moodle_dox/index.html]]\n[[RSS feed|http://www.earlham.edu/markp/moodle_dox/index.xml]]\n<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#">\n <Work rdf:about="">\n <license rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/" />\n <dc:type rdf:resource="http://purl.org/dc/dcmitype/Text" />\n </Work>\n <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> -->\n</html>\n<<email markp at earlham dot edu>>\n----\n!!About\n[[TiddlyWiki|http://www.tiddlywiki.com/]] <<version>>\n[[TW 4 restofus|http://giffmex.org/twfortherestofus.html]]\n[[TiddlyWiki Guides|http://tiddlywikiguides.org/index.php?title=TiddlyWiki_Guides]]\n[[Tiddly Doc|http://doc.tiddlywiki.org/#StartingPoints]]\n[[Light Box Egs|TiddlyLightBoxExamples]]\n[[Calendar creator|http://33ad.org/tools/gtdtwcal.php?month=3&year=2007]]\n
<html>\n\n<h2 id="id2">Introduction</h2>\n\n<p>Up until this year we have been moving Moodle sites with each new version of the Moodle system which has invloved creating a new database each time. This academic year we moved from Postgres database to MySQL and the plan is that we stay with this database system. This means that we won't be starting from scratch every year with a new datasbase and that we can accumulate courses and easily access the previous year's material.</p>\n\n<p>Summary:</p>\n\n<table>\n<tbody>\n <tr>\n <th> Year</th>\n <th> Moodle version</th>\n <th> Database</th>\n <th> <span class="caps">URL</span></th>\n </tr>\n <tr>\n <td style="text-align:right;"> 04-05</td>\n <td>1.4</td>\n <td>Postgres</td>\n <td style="text-align:left;"> https://moodle.earlham.edu/0506 : 2004-05</td>\n </tr>\n <tr>\n <td style="text-align:right;"> 05-06</td>\n <td>1.5</td>\n <td>Postgres</td>\n <td style="text-align:left;"> https://moodle.earlham.edu/0506</td>\n </tr>\n <tr>\n <td style="text-align:right;"> 06-07</td>\n <td>1.6</td>\n <td>MySQL</td>\n <td style="text-align:left;"> https://moodle.earlham.edu/</td>\n </tr>\n</tbody>\n</table>\n<h2 id="id3">Issues : Visibility, Retrieval, Archiving, Course Creation</h2>\n</html>\n<<faqlist byTag mgmtMoodle title hr>>\n!! Way forward?\nAfter talking with Faculty at today's [[Faculty Moodle Moot]] (1/18/07) there seems to be a way forward which may involve some code customisation for the display of the 'Overview of my courses' page:\n# Display the courses taught //in their containing categories//. Thus "Francais 102" would be displayed in the French Language and Literature category and when archived it would be moved to Archived Courses : French Lang & Lit category.\n# Allow faculty to hide, delete, backup or restore, or move to a different category a course block upon pressing the 'Edit this page' button. In short, allow faculty the administrator privilige on this page. [This may be straightforward with version 1.7 and it's roles and capabilities.]\n
|>|>|>|>|>|>| !March 2007 |\n|Su|Mo|Tu|We|Th|Fr|Sa|\n|||||1|2|3|\n|4|5|6|7|!8|9|10|\n|11|12|!13|14|15|!16|!17|\n|!18|!19|!20|!21|!22|!23|!24|\n|!25|!26|27|28|29|30|31|\n\n|>|>|>|!March : [[Lunchtime with Laptops]]|\n|8^^th^^|Coffee Shop| 12:00|Moodle clinic|\n|13^^th^^|Lilly| 15:00|[[iTunes & podcasts]]|\n|16 - 26|>|>|Mark back to Blighty|
<html>\n<h2 id="id7">Benefits of using Moodle</h2>\n<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>\n\n<ol>\n <li> To make a good looking site you need have expertise in web design\n <ul>\n <li>learning curve for html & styles</li>\n </ul>\n </li>\n <li>Large overhead in time to design & create the site. \n <ul>\n <li>Need to tweak as you go along.</li>\n </ul>\n </li>\n <li>Everything is public :\n <ul>\n <li>posting grades is problematic since all the students can see each other's grades.</li>\n <li>making copyrighted articles available</li>\n <li>open to spam harvesting</li>\n </ul>\n </li>\n <li>Handling student input – the web is read only.</li>\n</ol>\n\n<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>\n\n<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>\n</html>
!! New version of Moodle up and running\nAs of this week Aaron ~Cayard-Roberts and I have achieved blast-off for the new version 1.8.2''+'' of Moodle. For the sake of stability and reliability we again opted to go with a fresh database with implications for reusing old courses.\n!! Changes from last year\n# All faculty usernames (as of late July) have been loaded in to the Moodle system.\n# Most, if not all, courses (as extracted from Webdb in late July, early August) have been pre-created with the instructor's name as the Teacher of the course.\n** A distressing number of courses have no instructor allocated (TBA); these have been assigned the Teacher 'Tobey Announsd'. You will not be able to assign yourself to a TBA course; contact a [[Moodle support team]] person and we'll add you as a Teacher and remove Tobey.\n** Cross listed courses have been assigned to the instructor's 'home' department as far as possible.\nNew feature : +++[Roles]>\nPrevious versions of Moodle have had 4 basic roles:\n* Administrator\n* Teacher\n* Student\n* Guest\nWith Moodle v1.8 there's a new Roles/Capabilities system in place which inherits these roles but allows great flexiblity in creating new roles with different capabilities. You'll notice in the Adminstration block that 'Teachers' / 'Students' have now been replaced by 'Assign roles'\n===\n!! New course on Moodle?\n* Just login with your username and password. \n* You will enter your 'My Moodle' area where all your courses should be listed. Choose the course to work on and away you go!\n* To explore other departments, click on the 'All courses" link in the My Courses block.\n!! Restoring a course from last year\nA word about [[course naming]]\n!!!Overview\nMost all courses from last year (0607) have been backed up and transferred to an accessible spot on the new Moodle. All you need to do is :\n# Find the course to restore\n# Download to your computer\n# Go to this year's course\n# Restore course backup into the this year's course shell.\n!!![[Course Restore Procedure]]\n!!![[Problems with new Moodle]]\n\nContact the [[Moodle support team]] with questions and to ask for help.\n
<<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'.\nClick Administration: Teachers. Search for the username of the person you want to add. Then Add Teacher.\nTo change the 'role' merely delete 'Teacher' from the box and type in 'reference librarian'\nSave Changes\n\nHow can the color theme be changed for my course?\nAdministration: Settings. Find 'Force theme' at the bottom of the page and pull down the theme you want. \nSave changes.\nThe only way of seeing what these are like is to experiment!\n\nI want to remove topics or weeks from the Outline. How do you do this?\nThis operation is not readily apparent.\nGo to Administration: Settings -> Number of Weeks/Topics\nReduce the number shown. \nSo, 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!)\n\nI'm not doing online grading. How can I make the 'Grades' link disappear on the student's view of my course?\nAdministration: Settings\nChange Show grades to No\n\nHow can I let students know about a new resources or assignment on Moodle?\nMake a posting in the 'News forum'. All students are subscribed to this and so will get the posting via email.\nThis is a misnomer -- it would better be called 'Announcements and News'.\nTo make things even smoother you can paste in a link to the assignment or resource itself.\n\nWhat is this 'subscription' business in Forums?\n'Subscribing' to a forum means that you get sent all the postings as email messages.\nThis may or may not be convenient. It is certainly not encouraged because it tends to fragment the community building of a discussion forum.\n\nEvery time I post to a discussion Forum I get subscribed. How can I change this?\nHere again, this is not readily apparent.\nAdministraion : Edit Profile\nFrom Forum autosubscribe choose 'No:don't automatically subscribe me to forums'\nfor more details see[[Discussion Forum Subscription problem]]\n\nWhy 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?\nSafari won't display the HTML editing bar when in Edit or Update\nInternet Explorer often gives an error opening Word or Powerpoint files see [[Problem displaying Word files]]\nFor 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]]\n\nI need 6 groups of 5 students for this course. How can I set this up, and how do groups work with Activities?\nAdnministration : Settings.\nAdd Groups (more to come).\n\nHow can I get rid of the 'blocks' I don't want?\nClick Turn editing on\nEach block can be moved about with the arrow buttons; use the ''X'' to delete it.\nIf 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.\n\nHow can I change my Moodle site from three columns to two columns and give more space to the Outline?\nDelete superfluous blocks, eg Search Forums, Recent Activity, Course Categories.\nMove other blocks to the left side of the page. Reorder to suit.\nThe 'blocks' block will always be present on the right side but when you click Student view it'll disappear.\n\nHow can I quickly contact Mark when I'm in Moodle?\nUse the Messages system. Either:\nAdd Messages block to your course. Or,\nGo to your Profile and click the Messages button\n\nHow can I change the grading scale for an assignment?\nAdministration : Scales\nClick Add New Scale\ngive it a name\nlist the items from lowest to highest separated by commas. Eg D,C,B,A \nadd a description\nSave\n
!!Links to Moodle Documentation\n* The canonical [[Moodle Docs wiki|http://docs.moodle.org/en/Main_Page]]\n* [[Screencast tutorials on Google video (Assignments)|http://video.google.com/videosearch?q=moodle+assignments&page=1&lv=0&so=0]]\n* Very nice set of [[screencast videos (Flash format) for instructors and learners|http://treadwell.cce.cornell.edu/moodle_doc/index.html]]\n* Moodle instructors' communities and pedagogical support [[facultyroom.org (Teaching together better with Moodle)|http://facultyroom.org/]]\n----\n*[[UK Blog about Moodle happenings(Moodlebug)|http://fraser.typepad.com/moodle/]]\n* [[Step by step installation of Moodle on a Linux server|http://reallylinux.com/docs/installmoodle.shtml]]\n* The [[Wikipedia entry for Moodle|http://en.wikipedia.org/wiki/Moodle]]
Moodle Moot : new approaches -- Thurs 7th Feb\n\nBack by popular demand, the lunchtime Moodle Moot features mini-presentations from luminaries such as :\n\n* Wes Miller ! Who will be showing how the new Attendance block in Moodle makes recording and tracking attendance a piece of cake\n* Ana Cornide !! Who will be dazzling us with her innovative use of the Earlham Learning Spaces in two classes.\n* and last, but certainly not least, David Childs !!! Who will be taking us through how he he's using the gradebook and other aspects of the Moodle experience to enhance his Education course.\n; Where : \n: Ye Olde Richmonde Room in Landrum Bolling Centre (and, yes, I have booked it!)\n; When : \n: Thursday 7th Feb at 12 noon\n; FOOD: \n: Turkey, Ham or Hummus sandwich baskets\nPlease do let me know by email if you're planning to attend. All Moodle supporters or detractors are welcome, but hurry, space is unlimited!\n{{{Funding for this venture provided by the Evan Farber fund administered by Tom Kirk }}}
Lots of interest from Yasumi and Akiko in ELS! [[Moodle Moot]] attendee list:\n* Lyn Miller\n* Aletha Stahl\n* Kathy Milar\n* Yasumi\n* Akiko Kakutani\n* Kari Kalve\n* Joann Martin\n* Sandrine Sanos\n* Neal Baker\n* Tom Steffes\n* Ben\nMark, Wes, David, Ana
!!!LBC PC Lab Friday 5^^th^^ Jan 2007\n|!Time|!Topic|\n| 9:00|Using [[Moodle wiki|Wiki FAQ]] with group web site project|\n| 10:30|Tips for managing your course in Moodle|\n| 13:00|Using audio in Moodle (ripping tracks from a CD, uploading and playing)|\n| 14:00|Getting started with Quiz|\n| 15:30|Using the Workshop for annonymous peer review by students of assignments|
!!!LBC PC Lab: Monday 8^^th^^ Jan\n|!Time|!Topic|\n| 9:00|Using Podcasts in your course — have students subscribe to podcasts via iTunes. Ways of using with a class|\n| 13:00|Using blogs for writing or other assignments.|\n| 14:30|^Student research on the web using Social Bookmarking tool del.icio.us + add del.icio.us feed into Moodle via RSS(Real Simple Syndication) |\n| 16:00|Using discussion Forum with groups and ratings|\n
Looking ahead to the possibility of accumulating courses within the same database we needed to have a system to ensure that the Moodle course "Short name" remained unique between academic years.\n\nThe solution was a simple one -- merely append a modified [[Banner termcode]] to the course id:\n\nThus CHEM111-2 taught in the fall term of graduation year 2007 becomes ''CHEM111-2:0710''
!!"Features" or bugs?\nThere are some differences from last year's Moodle that may catch you out. Please check all of these:\n# Check the Maximum upload size in Administration : Settings. It may be set to 64K rather than 128Mb (especially likely for newly created courses). Make appropriate change and Save.\n# Resources : Link to File or Web site\n** [Search for web page] button does not do anything. Workaround : open new tab in Firefox, do Google search and then copy/paste URL.\n** Extra step: click [Show advanced] and check "Keep page navigation visible"\n\n
!!REFER TO THE MOODLE COURSE IN CLASS\nStudents 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. \n\nIf 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.\n\nAlso, use [[News Forum for class announcements]]\n\nSurvey result for how Moodle Resources were used:\n[img[http://www.earlham.edu/~markp/cms/evaluations/moodle_fall_04/Q9.png]]\n\nSurvey result for use of Mioodle outside class time:\n[img[http://www.earlham.edu/~markp/cms/evaluations/moodle_fall_04/Q7.png]]
1. My course isn't in Moodle. \nContact one of the [[Moodle support team]] to create your course. Email preferable. Have the course id (eg ~PHIL666) and full name (eg 'Defense Against the Dark Arts') handy. We will create you course and add you as the Teacher thereto.\n\n2. My course is there but taught by Tobey Announced. \nContact a [[Moodle support team]] person and we'll add you as a Teacher and remove Tobey.\n\n5. I can't find the Course Backup file I need\nCheck [[Course Backup folders|https://moodle.earlham.edu/mod/resource/view.php?id=1]]. Make sure you open the appropriate departmental directory. Still not there? Take a look at Getting Course Backup from 0607 Moodle\n\n6. My Course Backup file is not in the Course Backup folders\nHave you checked the right department folder? Still not there? Take a look at Getting Course Backup from 0607 Moodle\n\n4. I remember the title of the course but not the course id\nWas it eng_304, eng_302 or eng_308 that I want? Two things here:\n# if you're teaching the same course as last year, the course id //should// be the same (but the backup will have 0710 to indicate 07 grad year and Fall semester)\n# if this doesn't help you can always open [[0607 Moodle|https://moodle.earlham.edu/0607]] navigate to the course, open Administration : Files -> backupdata and download the latest backup from there.\n\n3. What Course Backup file should I look for?\nFor example, if you are teaching ~CHEM111 this year (short name ~CHEM111-2:200810) you would go to the [[Course Backup folder|https://moodle.earlham.edu/mod/resource/view.php?id=1]] open the CHEM directory and click on the chem111 course with the label 0710 indicating Fall semester of 07 graduation year. In this case you'd need to choose between the two sections backed up as backup-chem111-1_0710-20070519-0250.zip and backup-chem111-2_0710-20070519-0250.zip\n\n7. Getting a Course Backup file from 0607 Moodle\n# Browse to your course in [[0607 Moodle|https://moodle.earlham.edu/0607]]\n# Open Administration : Files and open the //backupdata// folder. You should find a set of backup files here.\n# The filenames have the format 'backup'-<course short name>-<date backed up>-<time backed up>. Select the most recent backup file and click on it to download.\n\n3. The Course backup file won't upload.\nI download the Course backup and I try to upload it into my course but it times out and the upload doesn't complete. \nThis is because the Course backup file is larger than the max upload size for Moodle, ie 128Mb. You'll need to contact Mark with the course id who will then flex his Unix muscles and move the course directly into the correct directory.\n
There are three primary support folks who can help Faculty and students with Moodle questions:\n|!name|!position|!location|!email|!phone|\n|Mark Pearson|Instructional Technologist|basement Lilly Library|[[markp@earlham.edu|mailto:markp@earlham.edu]]|973-2102|\n|Amy Bryant|Reference Librarian|Lilly ground floor|[[bryanam@earlham.edu|mailto:bryanam@earlham.edu]]|983-1302|\n|Neal Baker|Reference Librarian|Lilly reference desk|[[bakerne@earlham.edu|mailto:bakerne@earlham.edu]]|983-1355|\n
<html>\n<p>Here's a presentation entitled <a href="http://www.earlham.edu/~markp/cms/evaluations/glitter_moodle/faculty_use_0405.html" target="_blank" title="Presentation opens in new browser window">Moodle use by Earlham Faculty</a> which I gave to a Glitter meeting in 2005. I cover in detail how and why Moodle was used by teaching faculty in the 2004-2005 school year</p>\n\n</html>
body {\n background: #fffaae;\n color: #000;\n}\n\n.tiddler {\n background: #fffaae;\n padding: 1em 1em 0.5em 1em;\n margin-bottom: 1em;\n border: none;\n}\n\n.viewer .button {\n background: #e4ff70;\n color: #000;\n border: none;\n}\n\n.viewer .button:hover {\n background: #228b22;\n color: #fffaae;\n}\n\n.title {\ntext-align: center;\nbackground: #e4ff70;\n -moz-border-radius: 0.5em;\npadding: 0.2em;\n}\n\n#jsMath_button {\ndisplay: none;\n}\n\n/* navigator always visible\n.pageFooterOff #navigator{\n visibility: visible;\n}*/\n\n/* remove clock \n.slideClock{\n display: none;\n}*/
/***\n''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#NestedSlidersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''\n\nYou can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n===\n++++!!!!![Usage]>\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater\n*rollover\n*custom label/tooltip\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^*[label|tooltip]>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{"^"}}} //(without the quotes)//^^\nmakes the slider 'float' on top of other content rather than shifting that content downward^^\n* {{{"*"}}} //(without the quotes)//^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{[label]}}} or {{{[label|tooltip]}}}^^\nuses custom label/tooltip. (defaults are: ">" (more) and "<" (less)^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, floater, rollover, label/tooltip, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^*[label|tooltip]>...\n content\n===\n}}}\n++++(testcookie)!!!^*[label|tooltip]>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...|click for information]\n put some general information here, plus a floating slider with more specific info:\n +++^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...|click for information]\n put some general information here, plus a floating slider with more specific info:\n +++^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^*[glossary definition]explaining technical terms===\n ===\n===\n----\nnested floaters\n>menu: <<tiddler NestedSlidersExample>>\n(see [[NestedSlidersExample]] for definition)\n----\n===\n+++!!!!![Installation]>\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n===\n+++!!!!![Revision History]>\n\n++++[2006.02.16 - 1.7.7]\ncorrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n===\n\n++++[2006.02.15 - 1.7.6]\nin adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)\n===\n\n++++[2006.02.04 - 1.7.5]\nadd 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n===\n\n++++[2006.01.18 - 1.7.4]\nonly define adjustSliderPos() function if it has not already been provided by another plugin. This lets other plugins 'hijack' the function even when they are loaded first.\n===\n\n++++[2006.01.16 - 1.7.3]\nadded adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels. While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels. Short-term workaround is to only adjust the position for 'top-level' floaters.\n===\n\n++++[2006.01.16 - 1.7.2]\nadded button property to slider panel elements so that slider panel can tell which button it belongs to. Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n===\n\n++++[2006.01.14 - 1.7.1]\nadded optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n===\n\n++++[2006.01.14 - 1.7.0]\nadded optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n===\n\n+++[2006.01.03 - 1.6.2]\nWhen using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n===\n\n+++[2005.12.15 - 1.6.1]\nadded optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n===\n\n+++[2005.11.25 - 1.6.0]\nadded optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n===\n\n+++[2005.11.21 - 1.5.1]\nrevised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.\n===\n\n+++[2005.11.20 - 1.5.0]\n added (cookiename) syntax for optional tracking and restoring of slider open/close state\n===\n\n+++[2005.11.11 - 1.4.0]\n added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n===\n\n+++[2005.11.07 - 1.3.0]\n removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\n formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n===\n\n+++[2005.11.05 - 1.2.1]\n changed name to NestedSlidersPlugin\n more documentation\n===\n\n+++[2005.11.04 - 1.2.0]\n added alternative character-mode syntax {{{(((}}} and {{{)))}}}\n tweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n===\n\n+++[2005.11.03 - 1.1.1]\n fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\n code cleanup, added documentation\n===\n\n+++[2005.11.03 - 1.1.0]\n changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\n changed name to EasySlidersPlugin\n===\n\n+++[2005.11.03 - 1.0.0]\n initial public release\n===\n\n===\n+++!!!!![Credits]>\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with research, programming and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson\n===\n***/\n// //+++!!!!![Code]\n//{{{\nversion.extensions.nestedSliders = {major: 1, minor: 7, revision: 7, date: new Date(2006,2,16)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^)?(\s\s*)?(\s\s[[^\s\s]]*\s\s])?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie\n var show="none"; var title=">"; var tooltip="show"; var cookie="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().substr(1,lookaheadMatch[2].length-2);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // custom label/tooltip\n if (lookaheadMatch[6]) {\n title = lookaheadMatch[6].trim().substr(1,lookaheadMatch[6].length-2);\n var pos=title.indexOf("|");\n if (pos!=-1)\n { tooltip = title.substr(pos+1,title.length); title = title.substr(0,pos); }\n else\n { tooltip += " "+title; }\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,null,title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider);\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n\n // "non-click" MouseOver open/close slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.style.display = show;\n panel.button = btn; // so the slider panel know which button it belongs to\n btn.sliderPanel=panel;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[8]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[7]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align slider/floater position with button\n adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[7]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nfunction onClickNestedSlider(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n if (this.sliderCookie && this.sliderCookie.length)\n { config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }\n // align slider/floater position with target button\n adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n return false;\n}\n\n// hijack animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }\n\n// adjust panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n ///////////////////////////////////////////////////////////////////////////////\n /// EXPERIMENTAL HACK - WORKS IN SOME CASES, NOT IN OTHERS\n ///////////////////////////////////////////////////////////////////////////////\n // "if this panel is floating and the parent is not also a floating panel"...\n if (panelClass=="floatingPanel" && place.className!="floatingPanel") {\n var left=0; var top=btn.offsetHeight;\n if (place.style.position!="relative") { left+=findPosX(btn); top+=findPosY(btn); }\n if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth-10;\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}\n// //===
!!New Features in Moodle v1.8\n!!!Roles and Capabilities\nOlder versions of Moodle had only four hard coded roles: administrator, teacher, student, Guest. Version 1.8 maps these roles into equivalents on the new system and adds the possibility of creating custom roles. I have created two new custom roles:\n* [[Course Assistant|http://ec281.lly.earlham.edu/tw/miss/#%5B%5BNew%20role%20%3A%20Course%20Assistant%5D%5D]]\n* [[Librarian Moodle Support|http://ec281.lly.earlham.edu/tw/miss/#%5B%5BNew%20role%20%3A%20Librarian%20Moodle%20Support%5D%5D]]\nAs a Teacher of a Moodle course you can assign any user in the system to [[one of these roles in your course|graphics/roles_changable_teachers.png.]]<<imagebox>> . Roles that are present for all courses are Administrator and Librarian Moodle Support (Neal & Amy).\n!!!Participants\nView participants by role -- to change, pull down Current role and choose a different one.\nYou can even choose a different course.\n!!!Assignment\n|!Assignment Type|!What it does|!When you might use|\n|Advanced Uploading of files|Allows students to upload multiple files. Can return marked-up papers. Notes window allows student to give excuses.|Major term paper with a number of documents|\n|Online text|Students type in responses online. Can insert comment inline with student's response|More suitable for short answers.|\n|Upload single file|Simple online assignment. No returned files possible. No student notes.|your average uploaded paper|\n|Offline Activity|No online action involved but this does create a gradebook entry|'Dummy course' (which can be hidden) for grading purposes, eg Class participation). Assignment haded in on paper|\n!!!!Note:\nThe gradebook only works with assignments or other activities. It is not a separate entity.\n!!Advanced assignments\n* Setting up\n> +++[create/update]>\n* choose grading scale. The gradebook works best with numeric scale. @@[CUSTOM SCALES]@@\n* handling late submissions. @@[LATE]@@\n* ''Advanced''\n** allow deleteing uploaded files. Students change mind.\n** number of files to upload. ''Indicate this in description''. @@[GUIDANCE for STUDENTS]@@\n** Notes -- handy for recording excuses\n** can hide assignment description\n* \n===\n\n* Submitting and grading\n+++[student's view]>\n# [[student's initial view|graphics/advanced_assignment_studentview.png]]<<imagebox>>\n# [[student view after send for marking|graphics/advanced_assignment_studentview_2.png]]<<imagebox>>\n===\n+++[Teacher's grading]\n* Open assignment and click 'View n submitted assignments'\n* [[view all submissions|graphics/advanced_assignment_prof_submitview.png]]<<imagebox>>\n* Click on either Grade or Update -- pop-up\n** Can only upload response file in [[this window|graphics/advanced_assignment_prof_gradingview.png]]<<imagebox>>\n** upload response file FIRST\n** then select grade and add comment\n** Save changes or Reset\n** Note that grading view does ''not'' show that you have uploaded a response\n===\n\n
# [[New Features]]\n# [[Recycle last year's course|Course Restore Procedure]]\n# [[Scanning tips and tricks|Scanning Best Practices]]
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. \n\nThis 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.
!!!Examples of innovative Outlines:\n[img[graphics/combine_date_topics_outlinesm.jpg][graphics/combine_date_topics_outline.png]]<<imagebox "Combination of dates and topics">>\n\n!!!!Neat way of presenting a film schedule:\n\n[img[graphics/combine_date_topics_outline2sm.jpg][graphics/combine_date_topics_outline2.png]]<<imagebox "Film schedule and assignments combined">>
[<img[effectivePPT/slide_popup_menu.png]] \n\n|Slide Layout|how each individual slide gets treated|\n|Slide Design|built-in templates for easy use|\n|Slide Design -- Color Schemes|simple color schemes to build your own template|\n|Slide Design -- Animation Schemes|animate slide elements and transitions in a consistent way|\n|Custom Animation|bounce the text in if you really want to|\n|Slide Transition|move to the next slide in a transitiony way|\n\n
!Legibility\n* # bullets per slide - max 6 \n* # lines in title โ max 2\n* # lines per bullet โ max 2\n
! Text style\n* Newspaper headlines\n* Little text per bullet\n* Readable fonts\n* Complementary and contrasting colours\n* Use SLIDE MASTER for uniformity\n
!Visual Clarity\n* Titles : 36 point font\n* # fonts โ max 2\n* Body text : 24 point\n* Use Sans Serif fonts\n
<!--{{{-->\n<div class='header' macro='gradient vert [[ColorPalette::PrimaryMid]] [[ColorPalette::PrimaryDark]]'>\n\n<!-- avoid the irritating shadow effect\n<p> </p>\n-->\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
Pedagogic advantages of Moodle:\n* 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.\n* 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.\n* 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.\n* you can add to your course as you go along.
!!Printing PDF from Mac\nWhen using a Mac, clicking on a PDF (acrobat) resource opens the file in the Preview application. Sometimes the Title page of the resource is in Portrait orientation but the rest of the document is landscape. If there are *any* landscape (ie 'wide') pages in the document you are wanting to print, you must choose ''File -> Page Setup'' and then click on the ''landscape'' icon. All the pages will now be printed landscape.\nThe printer will only print in a single orientation from the Mac and so 'wide' double pages will get chopped off in Portrait mode.\n!! PC Printing\nThe PC print interface will by default Autorotate and center the pages:\n* Page 2 of document : [[portrait page|graphics/print_pdf_pc_driver1.png]]<<imagebox "note Preview orientation">>\n* Page 3 of same document : [[landscape page|graphics/print_pdf_pc_driver2.png]]<<imagebox "note landscape orientation in Preview">>
!!Problem: I click on a word file resource and nothing appears.\nYou 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. \n!!Fix :\nEven 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>>\n\nYou'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).\n!! Longterm Fix:\nUse 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.\n\nIn 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.\n----\n21 Sept 2006
<<faqlist byTag problem title hr>>
<<faqlist byTitle "Moodle setup problem list" question hr>>\n\n
I have some proposals for how courses from the last semester might be handled.\n# Create an Archive category on the 'home' page and departments within this [''already done'']. All the archived courses for previous years would be stored in their individual departments. To identify the year and semester the course was taught each course would have the [[Moodle course id]] prepended to the course name. I think that organizing the archive in this way, rather than by academic year would lead to easier access and fewer problems finding the exact course you want.\n# At the end of the //fall semester// :\n** Backup all courses ''including'' user data, ie with all student input.\n** Make all courses (from this semester) unavailable to students (this would mean that they would only see courses from the Spring Semester) [Administration : Settings -> Availability].\n** move courses into appropriate departmental sections of Archive category\n** rename each course as outlined above.\n# At the end of the //academic year// the same procedure would be repeated:\n** Backup all courses ''including'' user data \n** unenroll all students from all courses (from Fall and Spring semesters) but retain teacher names\n** move courses into appropriate departmental sections of Archive category\n** rename courses by prepending the [[Moodle course id]] to the course name to enable versions to be identified. Thus "French 102" would become "FREN102:0710 French 102". This would also be done to the backup course filenames.\n\nThese proposals would partially address the issues raised in [[Managing old courses in Moodle]]\n\nAlso I would like to add an HTML block to everyone's 'Overview of my courses' page (what you get when you click on EISMoodle). This would contain links to the the [[EC Moodlings|http://www.earlham.edu/~markp/moodle_dox]] documentation site plus links to fixes of the week. Remove the Latest News block.
!!Introduction to the Quiz Module\nCan use quizzes for assessment but also for learning by doing.\nThree parts:\n# Create a specific Quiz activity\n# Create questions\n# Allocate questions to the Quiz\n!!!1. Quiz Activity\nHuge number of options here. Click the Help? to get more information on each. Zillions of possibilities for running your Quiz.\n!!!2. Create questions\ntypes of question\n!!Embedded answer Cloze type questions:\n* You have to write the 'Cloze' code manually in Moodle : [[Cloze in moodle docs|http://docs.moodle.org/en/Embedded_Answers_(Cloze)_question_type]]\n* or use [[Hot Potatoes|http://hotpot.uvic.ca/index.htm]] to create your questions and then export.\n\n!!!3. Add to quiz\n\n
Resources are things that students read either online or print out.\n* 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 (after all, if you cannot be bothered to cite web urls, can you expect students to be any different?).\n* Convert MS Office files (Word, Powerpoint, Excel) into Acrobat format. Advantages:\n** Read only. Students cannot easily copy the contents of what you have written (a Word document makes it easy to copy the text)\n** 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]].\n** File size is generally smaller, epecially with Powerpoint.\n** Fewer problems with Internet Exploder [[blocking popups|Problem displaying Word files]]\n* Do fill in the Summary field. Suggestions include: \n** What's in the file or URL? The resource title may not indicate the contents very adequately. \n** Is the URL pointing to a single page of interest or a whole site? \n** 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).\n** Provide a citation to model how you want students to cite the resource in a paper.\n
# Use Photoshop Elements to scan photos, pictures or other graphics that you want as individual files.\n# Use Adobe Acrobat to scan books, Journals, or other printed material. [''Don't'' scan photocopies -- scan the original]\n!!Acrobat -- crucial settings\n* ''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!\n* Set Image Type to "Black and White document" or "Grayscale"\n* Set resolution to 150 dpi\n* Draw crop box around text you want to scan -- don't just scan the whole page\n* Add pages until Done\n* Use Document -> Rotate pages to turn pages around\n* click on Pages tab (on left side) to reveal thumbnail pages and drag & drop to put pages in different order.\n!!Photoshop Elements -- crucial settings\n* Set image type to color photo\n* Set resolution to 96 dpi -- you're only wanting to display on a screen, right?\n* Crop crop crop! Be ruthless in cropping away uneeded parts.\n* Try Enhance -> Auto Fix to apply quick fix es to your photo. If the result does not look good, merely select Edit -> Undo.\n* 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.\n[[Full gory details|http://www.earlham.edu/~markp/cms/user_guides/acrobat/scanning.php]] of how to scan into Acrobat complete with colourful illustrations.
Moodle and associated Instructional Technologies by Mark Pearson
EC Moodlings
http://www.earlham.edu/~markp/moodle_dox/
<html>\n<h1>Skype Audio Problem Report Form</h1>\n<form method="post" action="http://ec281.lly.earlham.edu/~markp/forms/audio_problim_report.php">\n<p>If you're having problems with Sykpe please fill in this form as best you can. You may have issues with downloading and <a href="#install">installing</a> Skype, changing options or <a href="#configure">configuring</a> the application or maybe you're not <a href="#hear">hearing</a> anything or the <a href="#conn">connection</a> is bad. Whatever the case, please do fill in the details as best you can so that I can suss out the problems.</p>\n<h2>Problem</h2>\n<h3><a name="install">1. Installation</a></h3>\n<p>What is the nature of the problem:</p>\n<p><textarea rows="4" cols="60" name="install"></textarea></p>\n\n<h3><a name="configure">2. Configuration</a></h3>\n<p>What is the nature of the problem:</p>\n<p><textarea rows="4" cols="60" name="config">...</textarea></p>\n\n<h3><a name="hear">3. Operation : Sound</a></h3>\n<p>Check all applicable:</p>\n<ul>\n <li><input type="checkbox" name="sound" value="ns_other" /> No sound coming from the other end </li>\n <li><input type="checkbox" name="sound" value="ns_me" /> No sound from my machine</li>\n</ul>\n<h3><a name="conn">4. Operation : Connection</a></h3>\n\n<dl>\n<dt>Check all applicable:</dt>\n <dd><input type="checkbox" name="connect" value="not_made" /> Connection not made to other person</dd>\n <dd><input type="checkbox" name="connect" value="dropped" /> Connection made but dropped during conversation</dd>\n <dd><input type="checkbox" name="connect" value="choppy" /> 'choppy' audio during conversation</dd>\n <dd><input type="checkbox" name="connect" value="echo" /> 'echo' audio -- my voice takes seconds to hear. I can hear the other person before my own voice</dd>\n</dl>\n\n<h2>Your details</h2>\n<p>All these data are dead private and are not stored in any database. They are useful to get in touch to find out more about the issues you had with your Skype conversation.</p>\n<h3>Personal</h3>\n<p>Your Skype name: <input type='text' name='personal_name' /></p>\n<p>Your Earlham email address: <input type='text' name='email' /></p>\n<h3>Hardware</h3>\n<p>Type of machine: <select name='machine'>\n <option value='laptop'>Laptop / Portable</option>\n <option value='desktop'>Desktop</option>\n</select></p>\n\n<p>Operating System: <select name='OS'>\n <option value="WinXP">Windows XP</option>\n <option value="OSX">Mac OS X</option>\n <option value="Win">Other version of Windows</option>\n</select></p>\n\n<h3>Skype Session</h3>\n<dl>\n<dt>When:</dt>\n <dd>Date : <input type='text' name='date' /></dd>\n <dd>Time : <input type='text' name='time' /></dd>\n</dl>\n<dt>Where</dt>\n <dd>Dorm / other building : <input type='text' name='dorm' /></dd>\n <dd>Room / Lab : <input type='text' name='room' /></dd>\n</dl>\n<p>Skype user you called or who called in : <input type='text' name='skype_caller' /></p>\n<hr>\n<p>Thanks for completing this form! Click on <input type='submit' name='submit' value='Send form' /> to email it to Mark Pearson</p>\n\n</form>\n</html>
\n\n!MASTER SLIDE is the TEMPLATE for ALL SLIDES
<<slideShow>> - A simple slide show that keeps the TW style \n<<slideShow style:'MySSStyleSheet' clock:'+'>> - A themed slide show with a clock showing the presentation elapsed time\n<<slideShow repeat clock:'-20'>> - A looping slide show with a 20 minutes countdown clock\n<<slideShow slidePause:1000>> - A timed slideshow that runs once\n<<slideShow slidePause:1000 repeat>> - A timed looping slideshow\n-s-\n!The [[SlideShowPlugin]]\nPress F11 to go fullscreen and adjust the font sizes with Ctrl++ Ctrl+- (or Ctrl+mousewheel).\n\nThis plugin was developed by Paulo Soares and Clint Checketts.\n{{Comment{This block is not shown in the slide show.\n@@Don't show me!!!@@}}}\n-s-\n!How slides are separated\nIn a tiddler, you start each slide with the markup {{{-s-}}}\n-s-\nSlides don't have to have titles like this poor one but can have images.\n[img[photos/lisboa-0.jpg]]\n-s-\n!A slide with subsections and a long title\nCheck to TOC below to see how this slide title is abbreviated.\n!!Section 1\nThis is a section\n!!!Subsection 1.1\nThis is a subsection\n!!!Subsection 1.2\nThis is another subsection\n!!!!Subsubsection 1.2.1\nThis is a subsubsection\n-s-\n!Using the keyboard\nThe following keys are defined:\n*Left arrow - previous overlay\n*Down arrow - previous slide\n*Right arrow - next overlay\n*Up arrow - next slide\n*Home - first slide\n*End - last slide\n*Escape - exit slide show\n*Spacebar - pause/resume slide show in auto advance mode\n-s-\n!Slide show parameters\n*The slide show can be themed by providing a ~StyleSheet ({{{<<slideShow style:'MyStyleSheet'>>}}})\n*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\n*The slide show can be set to loop ({{{<<slideShow repeat>>}}})\n*You can set it so each slide changes after X milliseconds ({{{<<slideShow slidePause:X>>}}}) (auto advance mode)\n*Use auto start mode to begin the slideshow the moment the tiddler is opened ({{{<<slideShow autostart>>>}}})\n*You can disable overlays with {{{<<slideShow noOverlays>>}}}\n*These parameters can be mixed and matched in any order: {{{<<slideShow slidePause:1000 repeat>>}}} is the same as {{{<<slideShow repeat slidePause:1000>>}}}\n-s-\n!Overlays\nTo see how incremental display works use the left and right mouse buttons.\n{{Overlay1{You can}}} {{Overlay2{present things}}} {{Overlay1{in an arbitrary order!!!}}}\n{{Overlay3{Its a bit harder with lists but it works:}}}\n<html>\n<ol>\n<li class="Overlay4">First item</li>\n<li class="Overlay5">Second item</li>\n<li class="Overlay4">Last item</li>\n</ol>\n</html>\n{{Comment{You can hide comments on a slide that won't display in the slide show}}}
<!--{{{-->\n<div id='displayArea'>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
/***\n|''Name:''|SlideShowPlugin|\n|''Description:''|Creates a simple slide show type display|\n|''Version:''|1.5.1|\n|''Date:''|Nov 10, 2006|\n|''Source:''|http://www.math.ist.utl.pt/~psoares/addons.html|\n|''Author:''|Paulo Soares (psoares (at) math (dot) ist (dot) utl (dot) pt) and [[Clint Checketts|http://www.checkettsweb.com]]|\n|''License:''|[[BSD open source license]]|\n|''~CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n<<tiddler SlideShowPluginDoc>>\n!Code\n***/\n//{{{\nconfig.macros.slideShow = {label: "slide show", maxTOCLength: 30};\nconfig.macros.slideShow.messages = {gotoLabel: "Go to slide:"};\nconfig.views.wikified.slideShow = {text: "slide show", tooltip: "Start slide show"};\nconfig.views.wikified.slideShow.quit = {text: "end", tooltip: "Quit the slide show"};\nconfig.views.wikified.slideShow.firstSlide = {text: "<<", tooltip: "first slide"};\nconfig.views.wikified.slideShow.previousSlide = {text: "<", tooltip: "previous slide"};\nconfig.views.wikified.slideShow.nextSlide = {text: ">", tooltip: "next slide"};\nconfig.views.wikified.slideShow.lastSlide = {text: ">>", tooltip: "last slide"};\nconfig.views.wikified.slideShow.resetClock = {text: " ", tooltip: "reset"};\n\nconfig.formatters.push( {\n name: "SlideSeparator",\n match: "^-s-+$\s\sn?",\n handler: function(w)\n {\n createTiddlyElement(w.output,"hr",null,'slideSeparator');\n }\n}\n)\n\nfunction changeStyleSheet(tiddlerName) {\n if (tiddlerName == null) tiddlerName = "StyleSheet";\n setStylesheet(store.getRecursiveTiddlerText("StyleSheetColors"),"StyleSheetColors");\n setStylesheet(store.getRecursiveTiddlerText("StyleSheetLayout"),"StyleSheetLayout");\n var theCSS = store.getRecursiveTiddlerText(tiddlerName,"");\n setStylesheet(theCSS,"StyleSheet");\n}\n\n//Excellent (and versatile) reparser created by Paul Petterson for parsing the paramString in a macro\nfunction reparse( params ) {\n var re = /([^:\ss]+)(?:\s:((?:\sd+)|(?:["'](?:[^"']+)["']))|\ss|$)/g;\n var ret = new Array() ;\n var m ;\n while( (m = re.exec( params )) != null ) ret[ m[1] ] = m[2]?m[2]:true ;\n return ret ;\n}\n\nfunction getElementsByClass(searchClass,node,tag) {\n var classElements = new Array();\n if ( node == null ) node = document;\n if ( tag == null ) tag = '*';\n var els = node.getElementsByTagName(tag);\n var elsLen = els.length;\n var pattern = new RegExp("(^|\s\ss)"+searchClass+"(\s\ss|$)");\n var j=0;\n for (var i = 0; i < elsLen; i++) {\n if ( pattern.test(els[i].className) ) {\n classElements[j] = els[i];\n j++;\n }\n }\n return classElements;\n}\n\n// 'keys' code adapted from S5 which in turn was adapted from MozPoint (http://mozpoint.mozdev.org/)\nfunction keys(key) {\n if (document.getElementById('contentWrapper').className == "slideShowMode"){\n if (!key) {\n key = event;\n key.which = key.keyCode;\n }\n switch (key.which) {\n case 32: // spacebar\n if(time>0){\n if(autoAdvance){\n clearInterval(autoAdvance);\n autoAdvance = null;\n } else {\n autoAdvance=setInterval("GoToSlide(1)", time);\n }\n }\n break;\n case 34: // page down\n case 39: // rightkey\n GoToSlide("n");\n break;\n case 40: // downkey\n GoToSlide(-1);\n break;\n case 33: // page up\n case 37: // leftkey\n GoToSlide("p");\n break;\n case 38: // upkey\n GoToSlide(1);\n break;\n case 36: // home\n GoToSlide("f");\n break;\n case 35: // end\n GoToSlide("l");\n break;\n case 27: // escape\n endSlideShow();\n break;\n }\n\n }\n return false;\n}\n\nfunction clicker(e) {\n if (!e) var e = window.event;\n var target = resolveTarget(e);\n //Whenever something is clicked that won't advance the slide make sure that the table of contents gets hidden\n if (target.getAttribute('href') != null || isParentOrSelf(target, 'toc') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object') || isParentOrSelf(target, 'pageFooter') || isParentOrSelf(target, 'navigator')){\n //Don't hide the TOC if the indexNumbers (which trigger the index) is clicked\n if(isParentOrSelf(target,'indexNumbers') || isParentOrSelf(target,'jumpInput')){\n return true;\n }\n showHideTOC('none');\n return true;\n }\n \n //Advance a slide if the TOC is visible otherwise make sure that the TOC gets hidden\n if ((!e.which && e.button == 1) || e.which == 1) {\n if (document.getElementById('toc').style.display != 'block'){\n GoToSlide("n");\n } else {\n showHideTOC('none');\n }\n }\n \n if ((!e.which && e.button == 2) || e.which == 3) {\n if (document.getElementById('toc').style.display != 'block'){\n GoToSlide("p");\n } else {\n showHideTOC('none');\n }\n return false;\n }\n}\n\nfunction isParentOrSelf(element, id) {\n if (element == null || element.nodeName=='BODY') return false;\n else if (element.id == id) return true;\n else return isParentOrSelf(element.parentNode, id);\n}\n\nGoToSlide=function(step) {\n var new_pos;\n var slideHolder = document.getElementById('slideContainer');\n //The parse float ensures that the attribute is returned as a number and not a string.\n var cur_pos = parseFloat(slideHolder.getAttribute('currentslide'));\n var numberSlides = parseFloat(slideHolder.getAttribute('numberSlides'));\n switch (step) {\n case "f":\n new_pos=0;\n break;\n case "l":\n new_pos=numberSlides-1;\n break;\n case "n":\n var numberOverlays = parseFloat(slideHolder.childNodes[cur_pos].getAttribute('numberOverlays'));\n var currentOverlay = parseFloat(slideHolder.getAttribute('currentOverlay'));\n if(numberOverlays==0 || currentOverlay==numberOverlays){\n new_pos=cur_pos+1;\n } else {\n var className="Overlay"+currentOverlay;\n var overlay=getElementsByClass(className,slideHolder.childNodes[cur_pos]);\n for(var i=0; i<overlay.length; i++) {overlay[i].className=className+' previousOverlay';}\n currentOverlay++;\n slideHolder.setAttribute('currentOverlay',currentOverlay);\n className="Overlay"+currentOverlay;\n overlay=getElementsByClass(className,slideHolder.childNodes[cur_pos]);\n for(i=0; i<overlay.length; i++) {overlay[i].className=className+' currentOverlay';}\n return false;\n }\n break;\n case "p":\n var numberOverlays = parseFloat(slideHolder.childNodes[cur_pos].getAttribute('numberOverlays'));\n var currentOverlay = parseFloat(slideHolder.getAttribute('currentOverlay'));\n if(numberOverlays==0 || currentOverlay==0){\n new_pos=cur_pos-1;\n } else {\n var className="Overlay"+currentOverlay;\n var overlays=getElementsByClass(className,slideHolder.childNodes[cur_pos]);\n for(var i=0; i<overlays.length; i++) {overlays[i].className=className+' nextOverlay';}\n currentOverlay--;\n className="Overlay"+currentOverlay;\n overlays=getElementsByClass(className,slideHolder.childNodes[cur_pos]);\n for(i=0; i<overlays.length; i++) {overlays[i].className=className+' currentOverlay';}\n slideHolder.setAttribute('currentOverlay',currentOverlay);\n return false;\n }\n break;\n default:\n new_pos=cur_pos+step;\n }\n\n if(slideShowCircularMode && new_pos == numberSlides) new_pos=0;\n if(slideShowCircularMode && new_pos<0) new_pos=(numberSlides - 1);\n if(step!=0 && new_pos>=0 && new_pos<numberSlides) {\n slideHolder.childNodes[cur_pos].style.display='none';\n slideHolder.childNodes[new_pos].style.display='block';\n slideHolder.setAttribute('currentslide',new_pos);\n var numberOverlays = parseFloat(slideHolder.childNodes[new_pos].getAttribute('numberOverlays'));\n if(step=="p"){\n var currentOverlay=numberOverlays;\n var state=' previousOverlay';\n } else {\n var currentOverlay=0;\n var state=' nextOverlay';\n }\n slideHolder.setAttribute('currentOverlay',currentOverlay);\n if(numberOverlays>0) {\n for(var i=1; i<=numberOverlays; i++){\n var className="Overlay"+i;\n var overlays=getElementsByClass(className,slideHolder.childNodes[new_pos]);\n for(var j=0; j<overlays.length; j++) {overlays[j].className=className+state;}\n }\n if(step=="p"){\n var className="Overlay"+numberOverlays;\n var overlays=getElementsByClass(className,slideHolder.childNodes[new_pos]);\n for(var j=0; j<overlays.length; j++) {overlays[j].className=className+' currentOverlay';}\n }\n }\n new_pos++;\n var indexNumbers = document.getElementById('indexNumbers');\n indexNumbers.firstChild.data = new_pos+'/'+numberSlides;\n if((new_pos==numberSlides) && !slideShowCircularMode && autoAdvance) clearInterval(autoAdvance);\n return true;\n }\n return false;\n}\n\nfunction tocShowSlide(e) {\n if (!e) var e = window.event;\n var target = resolveTarget(e);\n var slide = target.getAttribute('slideNumber');\n var cur_pos = document.getElementById('slideContainer').getAttribute('currentslide');\n var step = slide-cur_pos;\n if(step!=0) GoToSlide(step);\n showHideTOC('none');\n return;\n}\n\n//Toggle the display of the table of contents\nfunction showHideTOC(display){\n var toc = document.getElementById('toc');\n //Reset the input box\n document.getElementById('jumpInput').value = "";\n\n if (display == null || display.length == null){\n if (toc.style.display == 'none' || toc.style.display == ''){\n toc.style.display = 'block';\n document.getElementById('jumpInput').focus();\n } else {\n toc.style.display = 'none';\n }\n } else {\n toc.style.display = display;\n if (display == 'block')\n document.getElementById('jumpInput').focus();\n }\n}\n\nfunction makeSignature(title,params){\n var signature = title+store.getTiddler(title).modified;\n if(params['style']) signature += params['style'];\n if(params['repeat']) signature += "repeat";\n if(params['slidePause'] > 0) signature += params['slidePause'];\n if(params['autostart']) signature += "autostart";\n if(params['clock']) signature += params['clock'];\n if(params['noOverlays']) signature += "noOverlays";\n return signature;\n}\n\nfunction padZero(x){\n return (x>=10 || x<0 ? "" : "0")+x;\n}\n\nsetClock=function(){\n var actualTime = new Date();\n var newTime = actualTime.getTime() - clockStartTime;\n newTime = clockMultiplier*newTime+clockInterval+clockCorrection;\n actualTime.setTime(newTime);\n newTime = padZero(actualTime.getHours()) + ":" + padZero(actualTime.getMinutes())+ ":" + padZero(actualTime.getSeconds());\n var clock = document.getElementById('slideClock');\n clock.firstChild.nodeValue = newTime;\n}\n\nresetClock=function(){\n var time = new Date(0);\n if(clockStartTime>time){\n var startTime = new Date();\n clockStartTime=startTime.getTime();\n }\n}\n\nvar title;\nvar place;\nvar autoAdvance=null;\nvar autoStart=null;\nvar slideClock=null;\nvar noOverlays=false;\nvar time = 0;\nvar slideShowCircularMode;\nvar slideShowStyleSheet;\nvar slideShowParams;\nvar clockMultiplier;\nvar clockInterval;\nvar clockCorrection=0;\nvar clockStartTime;\nvar openTiddlers;\n\nconfig.macros.slideShow.handler = function(aPlace,macroName,params,wikifier,paramString,tiddler){\n if(tiddler instanceof Tiddler){\n var lingo = config.views.wikified.slideShow;\n var autostart = false;\n if (!e) var e = window.event;\n \n place = aPlace;\n title = tiddler.title;\n params = reparse(paramString);\n var onclick = function(){config.macros.slideShow.onClickSlideShow(params);};\n createTiddlyButton(aPlace,lingo.text,lingo.tooltip,onclick);\n \n var slideShowHolder = document.getElementById('slideShowWrapper');\n //If no show exist previously, create it\n if(params['autostart']){\n if(slideShowHolder != null){\n var signature = slideShowHolder.getAttribute('showSignature');\n if(signature.indexOf("autostart")==-1) autostart = true;\n } else {autostart = true;}\n if(autostart){\n slideShowParams = params;\n setTimeout(config.macros.slideShow.onClickSlideShow,100);\n }\n }\n }\n}\n\nvar disableFunction = function(e){return false;}\nvar enableFunction = function(e){}\n\nconfig.macros.slideShow.onClickSlideShow = function(newParams) {\n if(typeof(newParams)=="number") newParams=slideShowParams;\n openTiddlers = new Array;\n var viewer=document.getElementById('tiddlerDisplay');\n for(var i=0; i<viewer.childNodes.length; i++){\n var name = viewer.childNodes[i].getAttribute('tiddler');\n openTiddlers.push(name);\n }\n document.oncontextmenu = disableFunction;\n clockMultiplier = 1;\n clockInterval = 0;\n var startTime = new Date(0);\n slideShowCircularMode = false;\n time = 0;\n slideShowStyleSheet = null;\n if(newParams['style']){\n slideShowStyleSheet = eval(newParams['style']);\n } \n if(newParams['repeat']){\n slideShowCircularMode = true;\n }\n if(newParams['slidePause'] > 0){\n time = newParams['slidePause'];\n }\n if(newParams['clock']){\n clockCorrection=startTime.getTimezoneOffset()*60000;\n startTime = new Date();\n var clockType= eval(newParams['clock']);\n if(clockType != '+') {\n clockMultiplier = -1;\n clockInterval = -clockType*60000;\n }\n }\n clockStartTime=startTime.getTime();\n if(newParams['noOverlays']){\n noOverlays = true;\n }\n var contentWrapper = document.getElementById('contentWrapper');\n if (contentWrapper.className != "slideShowMode"){\n clearMessage();\n //Attach the key and mouse listeners\n document.onkeyup = keys;\n document.onmouseup = clicker;\n \n var slideShowHolder = document.getElementById('slideShowWrapper');\n story.refreshTiddler(title,"SlideShowViewTemplate",true);\n //If no show exist previously, create it\n if(slideShowHolder == null){\n createSlides(newParams);\n //If there was once waiting in the background and it matches the one we just started, resume it\n } else if (slideShowHolder.getAttribute('showSignature') == makeSignature(title,newParams)){\n \n //Remove dblClick on edit function\n var theTiddler = document.getElementById("tiddler"+title);\n theTiddler.ondblclick = function() {};\n\n // Grab the 'viewer' element and give it a signature so the show can be resumed if stopped\n var tiddlerElements = theTiddler.childNodes;\n var viewer;\n for (var i = 0; i < tiddlerElements.length; i++){\n if (tiddlerElements[i].className == "viewer") viewer = tiddlerElements[i];\n }\n theTiddler.insertBefore(slideShowHolder,viewer);\n theTiddler.removeChild(viewer);\n slideShowHolder.style.display = 'block';\n document.getElementById("pageFooter").className = "pageFooterOff";\n \n //If the show we started it totally new than the resumable one, create the new one and kill the resumable one\n } else {\n slideShowHolder.parentNode.removeChild(slideShowHolder);\n createSlides(newParams);\n }\n slideClock=setInterval("setClock()", 1000); \n if(time>0) autoAdvance=setInterval("GoToSlide(1)", time); \n story.closeAllTiddlers(title);\n toggleSlideStyles();\n } else {\n endSlideShow();\n }\n return ;\n \n}\n\nfunction endSlideShow(){\n //Set aside show so it can be resumed later\n var showHolder = document.getElementById('slideShowWrapper');\n showHolder.style.display = 'none';\n document.getElementById('contentWrapper').parentNode.appendChild(showHolder);\n document.oncontextmenu = enableFunction;\n if(autoAdvance) clearInterval(autoAdvance);\n if(slideClock) clearInterval(slideClock);\n story.refreshTiddler(title,null,true);\n story.closeAllTiddlers();\n toggleSlideStyles();\n story.displayTiddlers(null,openTiddlers,DEFAULT_VIEW_TEMPLATE);\n document.onmouseup = function(){};\n}\n\nfunction isInteger(s){\n var i;\n for (i = 0; i < s.length; i++){\n // Check that current character is number.\n var c = s.charAt(i);\n if (((c < "0") || (c > "9"))) return false;\n }\n // All characters are numbers.\n return true;\n}\n\nfunction jumpInputToSlide(e){\n if (!e) {\n e = window.event;\n e.which = e.keyCode;\n }\n if(e.which==13){\n var jumpInput= document.getElementById("jumpInput").value;\n if(isInteger(jumpInput)){\n var step=jumpInput-document.getElementById('slideContainer').getAttribute('currentslide')-1;\n if (GoToSlide(step)){\n showHideTOC('none'); \n }\n }\n }\n return;\n}\n\n//Used to shorten the TOC fields\nfunction abbreviateLabel(label){\n var maxTOCLength = config.macros.slideShow.maxTOCLength;\n if(label.length>maxTOCLength) {\n var temp = new Array();\n temp = label.split(' ');\n label = temp[0];\n for(var j=1; j<temp.length; j++){\n if((label.length+temp[j].length)<=maxTOCLength){\n label += " " + temp[j];\n } else {\n label += " ...";\n break;\n }\n }\n }\n return label;\n}\n\ncreateSlides = function(newParams){\n var lingo = config.views.wikified.slideShow;\n\n //Remove dblClick on edit function\n var theTiddler = document.getElementById("tiddler"+title);\n theTiddler.ondblclick = function() {};\n\n // Grab the 'viewer' element and give it a signature so the show can be resumed if stopped\n var tiddlerElements = theTiddler.childNodes;\n var viewer;\n for (var i = 0; i < tiddlerElements.length; i++){\n if (tiddlerElements[i].className == "viewer") viewer = tiddlerElements[i];\n }\n viewer.id = 'slideShowWrapper';\n viewer.setAttribute("showSignature",makeSignature(title,newParams));\n\n //Hide the text that comes before the first H1 element (I think I may put this into a cover page type thing)\n while(viewer.childNodes.length > 0 && viewer.firstChild.nodeName.toUpperCase() != "HR" && viewer.firstChild.className!="slideSeparator") {\n viewer.removeChild(viewer.firstChild);\n }\n \n //Cycle through the content and each time you hit an H1 begin a new slide div\n var slideNumber = 0;\n var slideHolder = document.createElement('DIV');\n slideHolder.id = "slideContainer";\n \n while(viewer.childNodes.length > 0){\n //Create a new slide a append it to the slide holder\n if (viewer.firstChild.nodeName.toUpperCase() == "HR" && viewer.firstChild.className=="slideSeparator"){\n slideNumber++;\n var slide = document.createElement('DIV');\n slide.id = "slideNumber"+slideNumber;\n slide.className = "slide";\n if (slideNumber > 1) {\n slideHolder.setAttribute('currentslide',0);\n slide.style.display='none';\n } else {\n slide.style.display='block';\n }\n slideHolder.appendChild(slide); \n viewer.removeChild(viewer.firstChild);\n } else {\n if(viewer.firstChild.nodeName=="SPAN" && viewer.firstChild.className=="" && viewer.firstChild.hasChildNodes()) {\n var anchor=viewer.firstChild.nextSibling;\n for (var ii=0;ii<viewer.firstChild.childNodes.length;ii++) {\n var clone=viewer.firstChild.childNodes[ii].cloneNode(true);\n viewer.insertBefore(clone,anchor);\n }\n viewer.removeChild(viewer.firstChild);\n } else {\n slide.appendChild(viewer.firstChild);\n }\n }\n }\n \n //Stick the slides back into the viewer\n viewer.appendChild(slideHolder);\n slideHolder.setAttribute('numberSlides',slideNumber);\n \n //Create the navigation bar\n var pagefooter = createTiddlyElement(viewer,"DIV","pageFooter","pageFooterOff");\n var navigator = createTiddlyElement(pagefooter,"SPAN","navigator");\n\n //Make it so that when the footer is hovered over the class will change to make it visible\n pagefooter.onmouseover = function () {pagefooter.className = "pageFooterOn"};\n pagefooter.onmouseout = function () {pagefooter.className = "pageFooterOff"};\n\n //Create the control button for the navigation \n var onClickQuit = function(){endSlideShow();};\n createTiddlyButton(navigator,lingo.quit.text,lingo.quit.tooltip,onClickQuit);\n createTiddlyButton(navigator,lingo.firstSlide.text,lingo.firstSlide.tooltip,first_slide);\n createTiddlyButton(navigator,lingo.previousSlide.text,lingo.previousSlide.tooltip,previous_slide);\n createTiddlyButton(navigator,lingo.nextSlide.text,lingo.nextSlide.tooltip,next_slide);\n createTiddlyButton(navigator,lingo.lastSlide.text,lingo.lastSlide.tooltip,last_slide); \n createTiddlyButton(navigator,lingo.resetClock.text,lingo.resetClock.tooltip,resetClock,"button","slideClock"); \n\n var indexNumbers = createTiddlyElement(pagefooter,"SPAN","indexNumbers","indexNumbers","1/"+slideNumber)\n indexNumbers.onclick = showHideTOC;\n var toc = createTiddlyElement(pagefooter,"UL","toc");\n var ovl=1;\n for (var i=0;i<slideHolder.childNodes.length;i++) {\n if(!noOverlays) {\n var ovl=1;\n while(1){\n var className="Overlay"+ovl;\n var overlays=getElementsByClass(className,slideHolder.childNodes[i]);\n if(overlays.length>0){\n for(var j=0; j<overlays.length; j++) {overlays[j].className+=' nextOverlay';}\n ovl++;\n } else {break;}\n }\n }\n slideHolder.childNodes[i].setAttribute("numberOverlays",ovl-1);\n slideHolder.setAttribute("currentOverlay",0);\n\n //Loop through each slide and check the header's content\n var tocLabel = null; \n for (var j=0;j<slideHolder.childNodes[i].childNodes.length;j++) {\n var node = slideHolder.childNodes[i].childNodes[j];\n if(node.nodeName=="H1" || node.nodeName=="H2" || node.nodeName=="H3" || node.nodeName=="H4") {\n var htstring = node.innerHTML;\n var stripped = htstring.replace(/(<([^>]+)>)/ig,"");\n tocLabel = abbreviateLabel(stripped);\n var tocLevel="tocLevel"+node.nodeName.charAt(1);\n var tocItem = createTiddlyElement(toc,"LI",null,tocLevel);\n var tocLink = createTiddlyElement(tocItem,"A",null,"tocItem",tocLabel);\n tocLink.setAttribute("slideNumber",i);\n tocLink.onclick=tocShowSlide;\n }\n }\n }\n \n\n //Input box to jump to s specific slide\n var tocItem = createTiddlyElement(toc,"LI",null,"tocJumpItem",config.macros.slideShow.messages.gotoLabel);\n var tocJumpInput = createTiddlyElement(tocItem,"INPUT","jumpInput");\n tocJumpInput.type="text";\n tocJumpInput.onkeyup=jumpInputToSlide;\n}\n\nvar next_slide= function(e){GoToSlide(1);}\nvar first_slide= function(e){GoToSlide("f");}\nvar previous_slide= function(e){GoToSlide(-1);}\nvar last_slide= function(e){GoToSlide("l");}\n\nfunction toggleSlideStyles(){\n var contentWrapper = document.getElementById('contentWrapper');\n if (contentWrapper.className == "slideShowMode"){\n contentWrapper.className = "";\n window.applyPageTemplate();\n if(slideShowStyleSheet) changeStyleSheet();\n } else{\n contentWrapper.className = "slideShowMode";\n window.applyPageTemplate("SlideShowPageTemplate");\n if(slideShowStyleSheet) changeStyleSheet(slideShowStyleSheet);\n }\n}\n\nsetStylesheet("/***\sn!Slide Mode Styles\sn***/\sn/*{{{*/\sn#contentWrapper.slideShowMode #slideContainer{\sn display: block;\sn}\sn\sn#contentWrapper.slideShowMode .Comment{\sn display: none;\sn}\sn\sn#contentWrapper.slideShowMode .nextOverlay{\sn visibility: hidden;\sn}\sn\sn#contentWrapper.slideShowMode .currentOverlay{\sn visibility: visible;\sn}\sn\sn#contentWrapper.slideShowMode .previousOverlay{\sn visibility: visible;\sn}\sn\sn#jump{\sn text-align: right;\sn}\sn\sn.pageFooterOff #navigator{\sn visibility: hidden;\sn}\sn\sn.pageFooterOn #navigator{\sn visibility: visible;\sn}\sn\sn#contentWrapper.slideShowMode #slideClock{\sn cursor: pointer; margin: 0 5px 0 5px; border: 1px solid #db4\sn}\sn\sn#contentWrapper.slideShowMode,\sn #contentWrapper.slideShowMode #displayArea{\sn width: 100%;\sn font-size: 1.5em;\sn margin: 0 !important;\sn padding: 0;\sn}\sn\sn#slideContainer{\sn display: none;\sn}\sn\sn.indexNumbers{\sn cursor: pointer;\sn}\sn\sn#navigator{\sn visibility: hidden;\sn bottom: 0;\sn}\sn\sn#toc{\sn display: none;\sn position: absolute;\sn font-size: .75em;\sn bottom: 2em;\sn right: 0;\sn background: #fff;\sn border: 1px solid #000;\sn text-align: left;\sn}\sn\snul#toc, #toc li{\sn margin: 0;\sn padding: 0;\sn list-style: none;\sn line-height: 1em;\sn}\sn\sn.tocJumpItem{\sn margin-right: 2em;\sn}\sn\sn.tocJumpItem input{\snmargin-right: 1em;\sn border: 0;\sn}\sn\sn#toc a,\sn#toc a.button{\sn display: block;\sn padding: .1em;\sn}\sn\sn#toc .tocLevel1{\snfont-size: .8em;\sn}\sn\sn#toc .tocLevel2{\sn margin-left: 1em;\sn font-size: .75em;\sn}\sn\sn#toc .tocLevel3{\sn margin-left: 2em;\snfont-size: .75em;\sn}\sn\sn#toc .tocLevel4{\sn margin-left: 3em;\snfont-size: .65em;\sn}\sn\sn#toc a{\sn cursor: pointer;\sn}\sn\snh1{\sn min-height: 1em;\sn}\sn\sn.slide h1{\sn min-height: 0;\sn}\sn\sn/* The '>' selector is ignored by IE6 and earlier so the proper rules are given */\sn#pageFooter{\sn position: fixed;\sn bottom: 2px;\sn right: 2px;\sn width: 100%;\sn text-align: right;\sn}\sn\sn/* This is a hack to trick IE6 and earlier to put the navbar on the bottom of the page */\sn* html #pageFooter {\sn position: absolute;\sn width: 100%;\sn text-align: right;\sn right: auto; bottom: auto;\sn left: expression( ( -20 - pageFooter.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );\sn top: expression( ( -10 - pageFooter.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );\sn}\sn\sn\sn\sn/*}}}*/","slideShowStyles");\n//}}}
!Description\nThis 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. \n\nThis plugin has been tested in Firefox and Internet Explorer. Let me know if something seems broken.\n!Usage\nTo 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.\n\nTo make a slide show simply drop {{{<<slideShow>>}}} at the beginning of a tiddler and use {{{--s--}}} to start each slide. \n\nIf 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.\n\nAny block of text marked as {{{{{Comment{For my eyes only!}}}}}} will not be displayed in the slide show.\n\nSee these and other features in this [[SlideShowExample]].\n!Incremental display\nA 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...}}}}}}, ...\n\nTo costumize the way overlays are shown you can redefine the following CSS classes\n*contentWrapper.slideShowMode .previousOverlay \n*contentWrapper.slideShowMode .currentOverlay \n*contentWrapper.slideShowMode .nextOverlay \nin a ~StyleSheet. The default style simply hides the next overlays and shows the current and the previous ones as normal text.\n!Slide show parameters\n*The slide show can be themed by providing a ~StyleSheet ({{{<<slideShow style:'MyStyleSheet'>>}}})\n*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\n*The slide show can be set to loop ({{{<<slideShow repeat>>}}})\n*You can set it so each slide changes after X milliseconds ({{{<<slideShow slidePause:X>>}}}) (auto advance mode)\n*Use auto start mode to begin the slideshow the moment the tiddler is opened ({{{<<slideShow autostart>>>}}})\n*You can disable overlays with {{{<<slideShow noOverlays>>}}}\n*These parameters can be mixed and matched in any order: {{{<<slideShow slidePause:1000 repeat>>}}} is the same as {{{<<slideShow repeat slidePause:1000>>}}}\n!Slide show navigation\nYou 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. \n!!Mouse navigation\nLeft (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.\n!!Keyboard navigation\nThe following keys are defined:\n*Left arrow - previous overlay\n*Down arrow - previous slide\n*Right arrow - next overlay\n*Up arrow - next slide\n*Home - first slide\n*End - last slide\n*Escape - exit slide show\n*Spacebar - pause/resume slide show in auto advance mode\n!Revision history\n*1.5.1 10/11/2006\n**added SlideShowPageTemplate and SlideShowViewTemplate. This way, the plugin no longer requires a standard TW layout. Thanks to Andrew Lister for the idea.\n*1.5.0 18/09/2006\n**fixed restoring stylesheet on exit\n**changed (again!) the way how slides are separated (slide shows prepared for previous versions must be fixed)\n*1.4.0 20/04/2006\n**changed the way how slides are separated (slide shows prepared for previous versions must be fixed)\n**now works with content included with the {{{<<tiddler>>}}} macro\n**added incremental display (overlays)\n**improved documentation\n**assorted small fixes\n*1.3.1 10/03/2006\n**removed empty slide titles\n**fixed wrong numberSlides when slides have div's\n**fixed wrong time in Windows\n*1.3.0 26/02/2006\n**restore open tiddlers on exit\n**fixed problem with markup in headers (should work with NestedSlidersPlugin)\n**added slide comments (blocks of text in the tiddler that don't show up in the presentation)\n*1.2.1 28/01/2006\n**pause timed slideshow with spacebar\n**added clock with 3 different modes\n**fixed bugs with style and abbreviation options\n**general cleanup\n*1.2.0 07/01/2006\n**added a resume feature\n