= 0 ORDER BY `sequence`");
echo "\n";
while ($row = $stH->fetch(PDO::FETCH_ASSOC)) {
$selected = ($selCat == $row['name']) ? ' selected' : '';
$catColor = ($row['color'] ? "color:{$row['color']};" : '').($row['bgColor'] ? "background-color:{$row['bgColor']};" : '');
echo "\n";
}
}
function userMenu($selUser) {
global $ax;
$stH = dbQuery("SELECT `name` FROM `users` ORDER BY `name`");
echo "\n";
while ($row = $stH->fetch(PDO::FETCH_ASSOC)) {
$selected = ($selUser == $row['name']) ? ' selected' : '';
echo "\n";
}
}
/* main functions */
function selectEvents() {
global $ax, $set, $msg, $fileName, $fileDes, $usrName, $catName, $fromDda, $fromMda, $tillDda, $tillMda, $lcI;
if (!$fileName) {
$fileName = substr(translit($set['calendarTitle'],true),0,60);
}
echo "
\n\n";
}
function makeFile() {
global $ax, $evtList, $set, $fileName, $fileDes, $usrName, $catName, $fromDda, $fromMda, $tillDda, $tillMda;
$icsHead = "BEGIN:VCALENDAR\r\n";
$icsHead .= "VERSION:2.0\r\n";
$icsHead .= "METHOD:PUBLISH\r\n";
$icsHead .= "PRODID:- // LuxCal ".LCV." // {$set['calendarTitle']} // EN\r\n";
$icsHead .= "X-LC-CONTENT:user: ".(($usrName != '*') ? $usrName : "all");
$icsHead .= " // cat: ".(($catName != '*') ? $catName : "all");
$icsHead .= " // due: ".(($fromDda) ? $fromDda : "begin")." - ".(($tillDda) ? $tillDda : "end");
$icsHead .= " // mod: ".(($fromMda) ? $fromMda : "begin")." - ".(($tillMda) ? $tillMda : "end")."\r\n";
$icsHead .= "X-WR-CALNAME:".(($fileDes) ? htmlspecialchars_decode($fileDes,ENT_QUOTES) : "Events")."\r\n";
$icsHead .= "X-WR-TIMEZONE:".date_default_timezone_get()."\r\n";
$icsHead .= "CALSCALE:GREGORIAN\r\n";
//set event filter
$filter = ($usrName != '*') ? " AND u.`name` = '$usrName'" : '';
if ($catName != '*') { $filter .= " AND c.`name` = '$catName'"; }
if ($fromMda) { $filter .= " AND SUBSTR(e.`mDateTime`,1,10) >= '$fromMda'"; }
if ($tillMda) { $filter .= " AND SUBSTR(e.`mDateTime`,1,10) <= '$tillMda'"; }
//set event date range
$sRange = ($fromDda) ? $fromDda : date('Y-m-d',time()-31536000); //-1 year
$eRange = ($tillDda) ? $tillDda : date('Y-m-d',time()+31536000); //+1 year
retrieve($sRange,$eRange,'',substr($filter,5)); //grab events
if (count($evtList) == 0) { return $ax['iex_no_events_found']; }
$icsBody = '';
$from = array(',',';','
');
$to = array('\,','\;','\n');
$eidDone = array(); //events processed
foreach ($evtList as $evtListDate) {
foreach ($evtListDate as $evt) {
if (!in_array($evt['eid'], $eidDone)) { //event not yet processed
$vDescription = str_replace($from,$to,htmlspecialchars_decode(makeE($evt,$set['evtTemplGen'],'br','\n','345'),ENT_QUOTES));
$vDescription = chunk_split_unicode($vDescription,72,"\r\n "); //fold to 72 chars line length
//compile DTSTART and DTEND values
$dateS = str_replace('-','',$evt['sda']);
$dateE = ($evt['eda'][0] != '9') ? str_replace('-','',$evt['eda']) : $dateS;
$timeS = str_replace(':','',$evt['sti']);
$timeE = str_replace(':','',$evt['eti']);
if ($evt['ald']) { //all day
$timeS = '0000';
$dateE = date('Ymd',strtotime($dateE.'12:00:00') + 86400); //+1 day
} else {
$dateS .= 'T'.$timeS.'00';
$dateE .= 'T'.(!empty($timeE) ? $timeE.'00' : $timeS.'01');
}
//compile RRULE property
$rrule = '';
if ($evt['r_t'] == 1) { //every 1|2|3|4 d|w|m|y
$rrule .= "FREQ=";
switch ($evt['r_p']) {
case 1: $rrule .= 'DAILY'; break;
case 2: $rrule .= 'WEEKLY'; break;
case 3: $rrule .= 'MONTHLY'; break;
case 4: $rrule .= 'YEARLY';
}
$rrule .= ";INTERVAL=".$evt['r_i'];
}
if ($evt['r_t'] == 2) { //every 1|2|3|4|5 m|t|w|t|f|s|s of the month
$rrule .= $evt['r_m'] ? "FREQ=YEARLY" : "FREQ=MONTHLY";
$rrule .= ";BYDAY=".(($evt['r_i'] != 5) ? $evt['r_i'] : '-1');
switch ($evt['r_p']) {
case 1: $rrule .= 'MO'; break;
case 2: $rrule .= 'TU'; break;
case 3: $rrule .= 'WE'; break;
case 4: $rrule .= 'TH'; break;
case 5: $rrule .= 'FR'; break;
case 6: $rrule .= 'SA'; break;
case 7: $rrule .= 'SU';
}
if ($evt['r_m']) {
$rrule .= ";BYMONTH=".$evt['r_m'];
}
}
if ($evt['r_u'][0] != '9') {
$rrule .= ";UNTIL=".str_replace('-','',$evt['r_u']).'T235900';
}
$tStamp = mktime(substr($timeS,0,2),substr($timeS,2,2),0,substr($dateS,4,2),substr($dateS,6,2),substr($dateS,0,4));
$icsBody .= "BEGIN:VEVENT\r\n";
$icsBody .= "DTSTAMP:".gmdate('Ymd\THis\Z')."\r\n";
if ($evt['adt']) {
$icsBody .= "CREATED:".gmdate('Ymd\THis\Z',strtotime($evt['adt']))."\r\n";
}
if ($evt['mdt']) {
$icsBody .= "LAST-MODIFIED:".gmdate('Ymd\THis\Z',strtotime($evt['mdt']) + 86400)."\r\n";
}
$calUrlShort = preg_match('~.+://([^?/]+)~',$set['calendarUrl'],$matches); //strip http(s)://
$icsBody .= "UID:".gmdate("Ymd\THis\Z", $tStamp).trim(substr(iconv('UTF-8','ASCII//TRANSLIT//IGNORE',$evt['tit']),0,4))."-LuxCal@{$matches[1]}\r\n";
$icsBody .= "SUMMARY:".str_replace(",","\,",htmlspecialchars_decode($evt['tit'],ENT_QUOTES))."\r\n";
if ($vDescription) { $icsBody .= "DESCRIPTION:{$vDescription}\r\n"; }
$icsBody .= "CATEGORIES:".str_replace(",","\,",$evt['cnm'])."\r\n";
if ($evt['pri']) { $icsBody .= "CLASS:PRIVATE\r\n"; }
if ($evt['ven']) { $icsBody .= "LOCATION:".str_replace(",","\,",htmlspecialchars_decode($evt['ven'],ENT_QUOTES))."\r\n"; }
if ($rrule) { $icsBody .= "RRULE:{$rrule}\r\n"; }
$icsBody .= "DTSTART;".($evt['ald'] ? "VALUE=DATE" : "TZID=".date_default_timezone_get()).":{$dateS}\r\n";
$icsBody .= "DTEND;".($evt['ald'] ? "VALUE=DATE" : "TZID=".date_default_timezone_get()).":{$dateE}\r\n"; //+1 ?
$icsBody .= "END:VEVENT\r\n";
$eidDone[] = $evt['eid']; //mark as processed
}
}
}
$icsTail = "END:VCALENDAR";
//save to iCal file
$icalfName = $fileName ? $fileName : $set['calendarTitle'];
$icalfName = translit($icalfName,true);
if (file_put_contents("./files/{$icalfName}.ics", $icsHead.$icsBody.$icsTail, LOCK_EX) !== false) {
$result = $ax['iex_file_created'];
} else {
$result = $ax['iex_write error'];
}
return $result;
}
//control logic
$msg = ''; //init
if ($usr['privs'] == 9) { //admin
if (isset($_POST['create'])) {
$msg = makeFile();
}
echo "{$msg}
\n";
} else {
echo "{$ax['no_way']}
\n";
}
?>