I needed to do something similar, and I started with:
http://www.luciddesigns.com/calendar/
...but the monthly recurring code was broken in 'event_posted.php3' I fixed it this way:
case "monthly":
$dwt1 = date("w", $initial_time);
$longdwt1 = date("l", $initial_time);
$wmt1 = (integer)(($day-1)/7);
$longwmt1 = array ("first", "second", "third", "fourth");
for( $i=0 ; $i < $recurring_duration ; $i++ ){
$xmonth = (($month + $i - 1) % 12) +1;
$xyear = $year + (integer)(($month + $i -1) / 12);
$dw1m = date("w", mktime(0,0,0,$xmonth,1,$xyear));
$offset = (7 - $dw1m + $dwt1) % 7;
$tsmr = mktime(0,0,0,$xmonth,1+$offset+($wmt1*7),$xyear);
$tsmrdate = date("M d Y" , $tsmr);
$insmonth = date("m" , $tsmr);
$insday = date("d" , $tsmr);
$insyear = date("Y" , $tsmr);
// SQL HERE
// MORE LOOPING