-n_last="$(printf %s "$values[N]" |sed -rn 's:^([^;]*;){0} *([^;]*).*$:\2:p')"
-n_first="$(printf %s "$values[N]" |sed -rn 's:^([^;]*;){1} *([^;]*).*$:\2:p')"
-n_middle="$(printf %s "$values[N]" |sed -rn 's:^([^;]*;){2} *([^;]*).*$:\2:p')"
-n_pre="$(printf %s "$values[N]" |sed -rn 's:^([^;]*;){3} *([^;]*).*$:\2:p')"
-n_post="$(printf %s "$values[N]" |sed -rn 's:^([^;]*;){4} *([^;]*)*$:\2:p')"
-
-hi_number="${values[X-HEALTH-INSURANCE]%;*}"
-hi_company="${values[X-HEALTH-INSURANCE]#*;}"
+list_items(){
+ item="$1"
+ placeholder="$2"
+ [ -n "${values[$item]+x}" ] && printf '<h3>%s</h3>\n' "$(l10n $item)"
+ for n in "$item" "$item"{0..100}; do
+ if [ -n "${values[$n]+x}" ]; then
+ case "$item" in
+ (ADR|NOTE)
+ printf '<textarea class="item %s" name="%s">%s</textarea>\n' \
+ "$item" "$item" "$(htmlsafe ${values[$n]})"
+ ;;
+ (TEL)
+ teltype "${values[${n}_TYPE]}"
+ printf '<input class="item %s" name="%s" value="%s" />\n' \
+ "$item" "$item" "$(attribsafe ${values[$n]})"
+ ;;
+ (*)
+ printf '<input class="item %s" name="%s" value="%s" placeholder="%s"/>\n' \
+ "$item" "$item" "$(attribsafe ${values[$n]})" "$placeholder"
+ ;;
+ esac
+ else
+ break
+ fi
+ done
+}