-tstamp=$(TZ="$tzid" date +%Y%m%dT%H%M%S)
-
-dts_year="${_POST[DTSYEAR]}"
-dts_month="${_POST[DTSMONTH]}"
-dts_day="${_POST[DTSDAY]}"
-[ -n "${_POST[DTSDAY0]}" ] && dts_day="${_POST[DTSDAY0]}"
-dts_hour="${_POST[DTSHOUR]}"
-dts_minute="${_POST[DTSMINUTE]}"
-
-[ -z $dts_year ] && dts_year=$(date +%Y)
-[ -z $dts_month ] && dts_month=$(date +%m)
-[ -z $dts_day ] && dts_day=$(date +%d)
-date -d ${dts_year}-${dts_month}-${dts_day} >/dev/null 2>/dev/null || dts_day="01"
-[ -z $dts_hour ] && dts_hour=$(date +%H)
-[ -z $dts_minute ] && dts_minute=$(date +%M)
-
-dtstart="TZID=${tzid}:${dts_year}${dts_month}${dts_day}T${dts_hour}${dts_minute}00"
-
-rr_int="${_POST[RRULE_INTERVAL]}"
-rr_freq="${_POST[RRULE_FREQ]}"
-rr_limit="${_POST[RRULE_LIMIT]}"
-case "$rr_limit" in
- ETERN)
- rrule="FREQ=$rr_freq;INTERVAL=$rr_int"
- ;;
- COUNT)
- t="${_POST[RRULE_COUNT]}"
- rrule="FREQ=$rr_freq;INTERVAL=$rr_int;COUNT=$t"
- ;;
- UNTIL)
- uy="${_POST[RRULE_UYEAR]}"
- um="${_POST[RRULE_UMONTH]}"
- ud="${_POST[RRULE_UDAY]}"
- rrule="FREQ=$rr_freq;INTERVAL=$rr_int;UNTIL=${uy}${um}${ud}T000000Z"
- ;;
+
+ics="$(pdi_update_attrib "$ics" DTSTAMP 1 "TZID=${tzid}")"
+ics="$(pdi_update_value "$ics" DTSTAMP 1 "$(TZ="$tzid" date +%Y%m%dT%H%M%S)")"
+
+dts_year="$( POST DTS_YEAR |grep -m1 -xE '[0-9]{4}' || date +%Y)"
+dts_month="$( POST DTS_MONTH |grep -m1 -xE '0[1-9]|1[012]' || date +%m)"
+dts_day="$( POST DTS_DAY |grep -m1 -xE '0[1-9]|[12][0-9]|3[01]' || date +%d)"
+dts_hour="$( POST DTS_HOUR |grep -m1 -xE '[0-9]|1[0-9]|2[0-3]' || date +%H)"
+dts_minute="$(POST DTS_MINUTE |grep -m1 -xE '[0-9]|[1-5][0-9]' || date +%M)"
+[ ${#dts_hour} -eq 1 ] && dts_minute="0$dts_hour"
+[ ${#dts_minute} -eq 1 ] && dts_minute="0$dts_minute"
+DTSTART="${dts_year}${dts_month}${dts_day}T${dts_hour}${dts_minute}00"
+
+ics="$(pdi_update_attrib "$ics" DTSTART 1 "TZID=${tzid}")"
+ics="$(pdi_update_value "$ics" DTSTART 1 "$DTSTART")"
+
+rr_int=$( POST RRULE_INTERVAL |grep -m1 -xE '[0-9]+' || printf 1)
+rr_count=$(POST RRULE_COUNT |grep -m1 -xE '[0-9]+' || printf 1)
+rr_freq=$( POST RRULE_FREQ |grep -m1 -xE 'DAILY|WEEKLY|MONTHLY|YEARLY' || printf MONTHLY)
+rr_uy=$( POST RRULE_UYEAR |grep -m1 -xE '[0-9]{4}' || date +%Y)
+rr_um=$( POST RRULE_UMONTH |grep -m1 -xE '[1-9]|1[012]' || date +%m)
+rr_ud=$( POST RRULE_UDAY |grep -m1 -xE '[1-9]|[12][0-9]|3[01]' || date +%d)
+[ ${#rr_um} -eq 1 ] && rr_um="0$rr_um"
+[ ${#rr_ud} -eq 1 ] && rr_ud="0$rr_ud"
+
+case $(POST RRULE_LIMIT) in
+ COUNT) RRULE="FREQ=$rr_freq;INTERVAL=$rr_int;COUNT=$rr_count";;
+ UNTIL) RRULE="FREQ=$rr_freq;INTERVAL=$rr_int;UNTIL=${rr_uy}${rr_um}${rr_ud}T000000Z";;
+ ETERN|*) RRULE="FREQ=$rr_freq;INTERVAL=$rr_int";;