--- /dev/null
+#!/bin/sh
+
+. "${_EXEC}"/pdiread.sh
+
+SUP_FIELDS="COMMENT"
+
+edit_course(){
+ local coursefile="$_DATA/ical/$1"
+ local tempfile course
+
+ . $_EXEC/session_lock.sh
+
+ if ! tempfile="$(CHECK_SLOCK "$coursefile")"; then
+ printf '[div .message %s]' "$(l10n "This course is not set up for editing within this session.")"
+ else
+ course="$(pdi_load "$tempfile")"
+ cat <<-EOF
+ [form .course #${coursefile##*/} action="/courses/update_course.sh" method="POST"
+ [input type="hidden" name="course" value="${coursefile##*/}"]
+ [input type="hidden" name="tid" value="$(transid ${tempfile})"]
+ [div .section .basic . $(
+ edit_item "$course" SUMMARY COMMENT
+ )]
+ [div .section .dtstart . $(
+ edit_item "$course" DTSTART
+ )]
+ [div .section .recur . $(
+ edit_item "$course" RRULE
+ )]
+ [div .section .attendance . $(
+ edit_item "$course" attendance
+ )]
+ [div .control
+ [!-- select .item name=newfield
+ [option disabled="disabled" selected . $(l10n edit_addfieldtext)]
+ $(for f in $SUP_FIELDS; do printf '[option value="%s" . %s]\n' "$f" "$(l10n "$f")"; done)
+ ]
+ [button .item type="submit" name="action" value="addfield" . $(l10n edit_addfield) --]
+ [button .item type="submit" name="action" value="update" . $(l10n edit_update)]
+ [button .item type="submit" name="action" value="cancel" . $(l10n edit_cancel)]
+ [div .item .delete label="$(l10n edit_delete)"
+ [input type="checkbox" #delete]
+ [label for="delete" $(l10n edit_delete)]
+ [button type="submit" name="action" value="delete" $(l10n edit_delete)]
+ ]
+ ]
+ ]
+ EOF
+ fi
+}
+
+print_course(){
+ local coursefile="$1"
+ local course="$(pdi_load "$coursefile")"
+ cat <<-EOF
+ [div .course #${coursefile##*/}
+ [div .section .basic . $(
+ cal_item "$course" SUMMARY DTSTART RRULE
+ )]
+ [div .section .COMMENT . $(cal_item "$course" COMMENT)]
+ [div .section .attendance [h3 $(l10n course_attendance) ] [ul .
+ $(grep -F "${coursefile##*/} " "$_DATA/mappings/attendance" |while read discard each; do
+ printf '[li [a .item .attendance href="/cards/#%s" . %s]]\n' \
+ "$each" \
+ "$(pdi_value "$(pdi_load "$_DATA/vcard/$each")" FN |unescape |HTML)"
+ done |sort -k7)]
+ ]
+ [div .control
+ [a .item href="/courses/edit_course.sh?course=${coursefile##*/}" $(l10n edit)]
+ [a .item href="/courses/export_pdf.sh?course=${coursefile##*/}" target="blank" $(l10n courselist)]
+ [a .item href="/courses/export_ical.sh?course=${coursefile##*/}" $(l10n ics_export)]
+ [a .item href="mailto:zack@vuesch.org?bcc=$(course_mail "${coursefile##*/}" |HTML)" $(l10n course_mail)]
+ ]
+ ]
+ EOF
+}
+
+course_mail() {
+ course="$1"
+ grep -F "${course} " "$_DATA/mappings/attendance" |while read junk card; do
+ cat "${_DATA}/vcard/${card}"
+ done \
+ | pdi_load - \
+ | sed -nE 's;^EMAIL(\;[^:]*)*:(.+)\r?$;\2,;p' \
+ | tr -d \\n \
+ | unescape
+}
+
+print_courses(){
+ local calfile cachefile date size name ldate=0 lsize lname
+
+ while read calfile; do
+ cachefile="${_DATA}/cache/${calfile##*/}.cache"
+ if [ -s "$cachefile" -a "$cachefile" -nt "$calfile" ]; then
+ cat "$cachefile"
+ else
+ print_course "$calfile" |tee "$cachefile"
+ fi
+ done
+}
+
+order_courses() {
+ local calfile course
+
+ while read calfile; do
+ icstime="$(pdi_value "$(pdi_load "$calfile")" DTSTART |cal_date)"
+ case $order in
+ DOW) printf '%s %s\n' "$(date -d "$icstime" "+%u %H:%M:%S")" "$calfile";;
+ TOD) printf '%s %s\n' "$(date -d "$icstime" "+%H:%M:%S")" "$calfile";;
+ esac
+ done \
+ | sort \
+ | sed -E 's;^.*\t;;g'
+}
+
+list_courses(){
+ printf '%s\n' ${_DATA}/ical/*.ics \
+ | order_courses \
+ | print_courses
+}