File: /home/awaldron/www/archive/demo/functions/_event.php
<?php
function schedule_recurrance($rid,$eid) {
$r = quickROW("SELECT * FROM event_recur WHERE recur_id=".$rid);
$e = quickROW("SELECT * FROM event WHERE event_id=".$eid);
$rp = explode("||",$r[recur_pattern]);
pre_print_r($rp);
$start = $r[recur_start];
$d = getdate($start);
$time = $start % 86400;
$sql_pref = "INSERT INTO event_sched (event_id,recur_id,eid,sched_title,venue_id,sched_venue_oth,sched_time,sched_dur) VALUES (";
$sql_pref .= $eid.",".$rid.",".$_SESSION[eid].",'".addslashes($e[event_title])."',".$e[venue_id].",'".addslashes($e[event_venue_oth])."',";
$sql_suff = ",".$r[recur_dur].")";
if ($rp[0] == 1) {
// DAILY RECURRENCE
if ($rp[1] == 1) $incr = 86400 * $rp[2];
else if ($rp[1] == 2) $incr = 86400;
//else return false;
$sched_time = $start;
while ($sched_time <= $r[recur_expire]) {
//quickUPDATE($sql_pref.$sched_time.$sql_suff);
echo "<br>DATE ".++$i.": ".date("m/d/Y H:i:s",$sched_time);
$sched_time += $incr;
}
} else if ($rp[0] == 2) {
// WEEKLY RECURRENCE
$days = string_split($rp[2]);
$wk_incr = $rp[1];
// FIND SUNDAY OF EVERY WEEK INCREMENT STARTING WITH THE WEEK OF THE START DATE
$sched_time = $start;
$sun_time = $start - ($d[wday] * 86400);
$sun_date = getdate($sun_time);
//quickUPDATE($sql_pref.$sched_time.$sql_suff);
echo "<br>DATE ".++$j.": ".date("m/d/Y H:i:s",$sched_time);
while ($sched_time <= $r[recur_expire]) {
for ($i=0; $i < 7; $i++) {
if (in_array($i,$days)) {
$sched_time = $sun_time + ($i * 86400);
if ($sched_time > $start) {
//quickUPDATE($sql_pref.$sched_time.$sql_suff);
echo "<br>DATE ".++$j.": ".date("m/d/Y H:i:s (I)",$sched_time)." || ".date_std($sched_time)." ".date_time($sched_time);
}
}
}
$sun_time += ($wk_incr * 604800);
}
} else if ($rp[0] == 3) {
// MONTHLY RECURRENCE
if ($rp[1] == 1) {
$sched_time = $start;
while ($sched_time <= $r[recur_expire]) {
//quickUPDATE($sql_pref.$sched_time.$sql_suff);
echo "<br>DATE ".++$i.": ".date("m/d/Y H:i:s",$sched_time);
$sched_time = next_monthly_1($sched_time,$rp[2],$rp[3],$d[hours],$d[minutes],$d[seconds]);
}
} else if ($rp[1] == 2) {
$sched_time = $start;
while ($sched_time <= $r[recur_expire]) {
//quickUPDATE($sql_pref.$sched_time.$sql_suff);
echo "<br>DATE ".++$i.": ".date("m/d/Y H:i:s",$sched_time);
$sched_time = next_monthly_2($sched_time,$rp[2],$rp[3],$rp[4],$d[hours],$d[minutes],$d[seconds]);
}
}
} else if ($rp[0] == 4) {
// ANNUAL RECURRENCE
if ($rp[1] == 1) {
$sched_time = $start;
while ($sched_time <= $r[recur_expire]) {
//quickUPDATE($sql_pref.$sched_time.$sql_suff);
echo "<br>DATE ".++$i.": ".date("m/d/Y H:i:s",$sched_time);
$sched_date = getdate($sched_time);
$sched_time = mktime($sched_date[hours],$sched_date[minutes],$sched_date[seconds],$rp[2],$rp[3],($sched_date[year]+1));
}
} else if ($rp[1] == 2) {
$sched_time = $start;
while ($sched_time <= $r[recur_expire]) {
//quickUPDATE($sql_pref.$sched_time.$sql_suff);
echo "<br>DATE ".++$i.": ".date("m/d/Y H:i:s",$sched_time);
$sched_time = next_annual_2($sched_time,$rp[2],$rp[3],$rp[4],$d[hours],$d[minutes],$d[seconds]);
}
}
}
}
function next_annual_2($time,$interval,$wday,$mon,$h,$m,$s,$incr_year=0) {
$d = getdate($time);
if ($incr_year) $year = ++$d[year];
else $year = $d[year];
$return_time = 0;
if ($interval == 5) {
// FIND LAST
for ($test_mday = 31; $test_mday >= 1; $test_mday--) {
if (checkdate($mon,$test_mday,$year)) {
$test_time = mktime($h,$m,$s,$mon,$test_mday,$year);
$test_date = getdate($test_time);
if ($wday <= 7) {
if (($wday - 1) == $test_date[wday]) { $return_time = ($return_time==0?$test_time:$return_time); }
} else if ($wday == 8) {
$return_time = ($return_time==0?$test_time:$return_time);
} else if ($wday == 9) {
if (($test_date[wday] > 0) && ($test_date[wday] < 6)) { $return_time = ($return_time==0?$test_time:$return_time); }
} else if ($wday == 10) {
if (($test_date[wday] == 0) || ($test_date[wday] == 6)) { $return_time = ($return_time==0?$test_time:$return_time); }
}
}
}
} else {
for ($test_mday = 1; (($test_mday <= 31) && ($return_time == 0)); $test_mday++) {
if (checkdate($mon,$test_mday,$year)) {
$test_time = mktime($h,$m,$s,$mon,$test_mday,$year);
$test_date = getdate($test_time);
if ($wday <= 7) {
if (($wday - 1) == $test_date[wday]) { $return_time = $test_time; }
} else if ($wday == 8) {
$return_time = $test_time;
} else if ($wday == 9) {
if (($test_date[wday] > 0) && ($test_date[wday] < 6)) {
if ($interval == 1) $return_time = $test_time;
else $return_time = next_weekday($test_time,$interval);
}
} else if ($wday == 10) {
if (($test_date[wday] == 0) || ($test_date[wday] == 6)) {
if ($interval == 1) $return_time = $test_time;
else $return_time = next_weekendday($test_time,$interval);
}
}
}
}
}
if ($return_time <= $time) return next_annual_2($time,$interval,$wday,$mon,$h,$m,$s,1);
else return $return_time;
}
function next_monthly_1($time,$mday,$mon_incr,$h,$m,$s) {
$d = getdate($time);
$d[mon] = $d[mon] + $mon_incr;
if ($d[mon] > 12) {
$d[mon] %= 12;
$d[year]++;
}
return mktime($h,$m,$s,$d[mon],$mday,$d[year]);
}
function next_monthly_2($time,$interval,$wday,$mon_incr,$h,$m,$s,$incr=0) {
$d = getdate($time);
if ($incr) {
$d[mon] = $d[mon] + $mon_incr;
if ($d[mon] > 12) { $d[mon] %= 12; $d[year]++; }
}
$return_time = 0;
if ($interval == 5) {
// FIND LAST
for ($test_mday = 31; $test_mday >= 1; $test_mday--) {
if (checkdate($d[mon],$test_mday,$d[year])) {
$test_time = mktime($h,$m,$s,$d[mon],$test_mday,$d[year]);
$test_date = getdate($test_time);
if ($wday <= 7) {
if (($wday - 1) == $test_date[wday]) { $return_time = ($return_time==0?$test_time:$return_time); }
} else if ($wday == 8) {
$return_time = ($return_time==0?$test_time:$return_time);
} else if ($wday == 9) {
if (($test_date[wday] > 0) && ($test_date[wday] < 6)) { $return_time = ($return_time==0?$test_time:$return_time); }
} else if ($wday == 10) {
if (($test_date[wday] == 0) || ($test_date[wday] == 6)) { $return_time = ($return_time==0?$test_time:$return_time); }
}
}
}
} else {
for ($test_mday = 1; (($test_mday <= 31) && ($return_time == 0)); $test_mday++) {
if (checkdate($d[mon],$test_mday,$d[year])) {
$test_time = mktime($h,$m,$s,$d[mon],$test_mday,$d[year]);
$test_date = getdate($test_time);
if ($wday <= 7) {
if (($wday - 1) == $test_date[wday]) { $return_time = $test_time; }
} else if ($wday == 8) {
$return_time = $test_time;
} else if ($wday == 9) {
if (($test_date[wday] > 0) && ($test_date[wday] < 6)) {
if ($interval == 1) $return_time = $test_time;
else $return_time = next_weekday($test_time,$interval);
}
} else if ($wday == 10) {
if (($test_date[wday] == 0) || ($test_date[wday] == 6)) {
if ($interval == 1) $return_time = $test_time;
else $return_time = next_weekendday($test_time,$interval);
}
}
}
}
}
if ($return_time <= $time) return next_monthly_2($time,$interval,$wday,$mon_incr,$h,$m,$s,1);
else return $return_time;
}
function next_weekday($time,$int) {
$i = 1;
$wday = 0;
while ($i < $int) {
$time += 86400;
$d = getdate($time);
$wday = $d[wday];
if (($wday > 0) && ($wday < 6)) $i++;
}
return $time;
}
function next_weekendday($time,$int) {
$i = 1;
$wday = 0;
while ($i < $int) {
$time += 86400;
//echo $time." : ";
$d = getdate($time);
$wday = $d[wday];
if (($wday == 0) || ($wday == 6)) $i++;
}
return $time;
}
function lz($n) {
// lz is short for Lead Zero
return ($n < 10 ? "0".$n : $n);
}
function string_split($str, $nr=1){
return array_slice(split("-l-", chunk_split($str, $nr, '-l-')), 0, -1);
}
?>