= 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 "
{$ax['iex_create_ics']} \n
{$ax['iex_file_name']}: .ics
{$ax['iex_file_description']}:

\n
{$ax['iex_filters']}
{$ax['iex_owner']}:
{$ax['iex_category']}:
{$ax['iex_between_dates']}: 📅 📅
{$ax['iex_changed_between']}: 📅 📅
\n"; if (isset($_POST['create']) and $msg == $ax['iex_file_created']) { $icalfName = $fileName ? $fileName : $set['calendarTitle']; $icalfName = substr(translit($icalfName,true).'.ics',0,60); $rName = str_replace('.','-'.date("Ymd-Hi").'.',$icalfName); echo "   \n"; } 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"; selectEvents(); echo "
\n
\n"; } else { echo "

{$ax['no_way']}

\n"; } ?>