--- /dev/null
+#!/bin/zsh
+
+# Copyright 2014, 2016 Paul Hänsch
+#
+# This file is part of Confetti.
+#
+# Confetti is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Confetti is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Confetti. If not, see <http://www.gnu.org/licenses/>.
+
+cgi_refdata
+
+filter="&filter=${_REF[filter]}"
+filtertype="&filtertype=${_REF[filtertype]}"
+order="&order=${_REF[order]}"
+
+card="${_POST[card]}"
+tempfile="$_DATA/temp/$card"
+cardfile="$_DATA/vcard/$card"
+attfile="$_DATA/mappings/attendance"
+
+vcf_escape(){
+ for each in "$@"; do
+ printf %s\\n "$each" \
+ | sed -r ':X;$!{N;bX}; s;\r\n;\n;g; s;([;,\\]);\\\1;g; s;\n;\\n;g;'
+ done \
+ | sed -r ':X;$!{N;bX}; s;\n;\;;g'
+}
+
+[ "${_POST[hi_select]}" = "list" ] || _POST[hi_company]="${_POST[hi_other]}"
+[ -n "${_POST[hi_company]}${_POST[hi_number]}${_POST[hi_status]}" ] \
+&& _POST[X-HEALTH-INSURANCE]="$(vcf_escape "${_POST[hi_company]}" "${_POST[hi_number]}" "${_POST[hi_status]}")"
+
+sed -r 's;$;\r;' >"$tempfile" <<EOF
+BEGIN:VCARD
+VERSION:4.0
+N:$(vcf_escape "${_POST[0N]}" "${_POST[1N]}" "${_POST[2N]}" "${_POST[3N]}" "${_POST[4N]}")
+UID:${_POST[UID]}
+$(
+ for field in $VCF_FIELDS; do for key in $field $field{0..100}; do
+ [ -z "${_POST[$key]+x}" ] && break
+ [ -z "${_POST[$key]}" ] && continue
+ case "$key" in
+ (TEL[0-9]*)
+ printf '%s;TYPE=%s:%s\r\n' "${field}" "${_POST[phonetype${key#TEL}]}" "$(vcf_escape "${_POST[$key]}")"
+ ;;
+ (X-HEALTH-INSURANCE)
+ printf '%s:%s\r\n' "${field}" "${_POST[$key]}"
+ ;;
+ (*)
+ printf '%s:%s\r\n' "${field}" "$(vcf_escape "${_POST[$key]}")"
+ ;;
+ esac
+ done; done
+ [ "${_POST[action]}" = addfield ] && printf '%s:\r\n' "${_POST[newfield]}"
+)
+END:VCARD
+EOF
+
+case "${_POST[action]}" in
+ addfield)
+ redirect "?p=cards${filter}${filtertype}${order}&edit=$card"
+ ;;
+ update)
+ attendance=()
+ for att in attendance attendance{0..100}; do
+ [ -n "${_POST[$att]}" ] && attendance+=("${_POST[$att]}")
+ done
+ sed -rn 's:^(.+)'$card'$:\1:p' "$attfile" |while read course; do
+ touch "$_DATA/ical/$course"
+ done
+ sed -i -r '/^(.+)\t'$card'$/d' "$attfile"
+ for each in $attendance; do
+ echo "$each\t$card"
+ done >>"$attfile"
+ sed -rn 's:^(.+)'$card'$:\1:p' "$attfile" |while read course; do
+ touch "$_DATA/ical/$course"
+ done
+
+ mv "$tempfile" "$cardfile"
+ redirect "?p=cards${filter}${filtertype}${order}#$card"
+ ;;
+ cancel)
+ rm "$tempfile"
+ [ -f "$cardfile" ] \
+ && redirect "?p=cards${filter}${filtertype}${order}#$card" \
+ || redirect "?p=cards${filter}${filtertype}${order}"
+ ;;
+ delete)
+ rm "$tempfile" "$cardfile"
+ redirect "?p=cards${filter}${filtertype}${order}"
+ ;;
+esac