SVN Alba r4745 - in prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador: actions lib templates
Author: josx Date: 2007-06-13 15:45:53 -0300 (Wed, 13 Jun 2007) New Revision: 4745 Added: prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/lib/ical_parser.php Modified: prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/actions/actions.class.php prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/templates/verPorDiaSuccess.php Log: La primera version funcional del Calendario diario para mostrar ical Modified: prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/actions/actions.class.php =================================================================== --- prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/actions/actions.class.php 2007-06-12 20:24:25 UTC (rev 4744) +++ prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/actions/actions.class.php 2007-06-13 18:45:53 UTC (rev 4745) @@ -36,6 +36,9 @@ return $x; } + + + public function executeVerPorDia() { // $aWeek = array('Domingo','Lunes','Martes'.'Miercoles','Jueves','Viernes','Sabado'); $aAllDay = array(); @@ -53,7 +56,6 @@ $unix_time = strtotime ("now"); } - $day_of_week = date("w", $unix_time); // get number of the day of the week $day_start_of_week = $unix_time - ($day_of_week * 86400); // get the starts day the of this week $day_end_of_week = $day_start_of_week + (7 * 86400); // get the end day the of this week @@ -66,165 +68,13 @@ $aTime[] = $time; } - $aEvent['20070508'] = array( - "1600" => array ( "xxx1" => array( - "event_start" => 1600, - "event_end" => 2200, - "start_unixtime" => 117864000, - "end_unixtime" => 1178661600, - "event_text" => "Primer", - "event_length" => 17900, - "event_overlap" => 2, - "description" => "Horas+de+maestro%2Fprofesor", - "status" => '', - "class" => "PUBLIC", - "spans_day" => '', - "location" => '', - "organizer" => "a:0:{}", - "attendee" => "a:0:{}", - "calnumber" => 1, - "calname" => 20070608153450, - "url" => '', - ), -), + require(sfConfig::get('sf_app_module_dir')."/icalVisualizador/".sfConfig::get('sf_app_module_lib_dir_name')."/ical_parser.php"); + $aEvent = @icalToArray("/tmp/pepe.ics"); - - - - "1700" => array ( "xxx1" => array( - "event_start" => 1700, - "event_end" => 2200, - "start_unixtime" => 1178643600, - "end_unixtime" => 1178661600, - "event_text" => "Primer", - "event_length" => 17900, - "event_overlap" => 2, - "description" => "Horas+de+maestro%2Fprofesor", - "status" => '', - "class" => "PUBLIC", - "spans_day" => '', - "location" => '', - "organizer" => "a:0:{}", - "attendee" => "a:0:{}", - "calnumber" => 1, - "calname" => 20070608153450, - "url" => '', - ), -"xxx44" => array( - "event_start" => 1700, - "event_end" => 2200, - "start_unixtime" => 1178643600, - "end_unixtime" => 1178661600, - "event_text" => "Primer", - "event_length" => 17900, - "event_overlap" => 2, - "description" => "Horas+de+maestro%2Fprofesor", - "status" => '', - "class" => "PUBLIC", - "spans_day" => '', - "location" => '', - "organizer" => "a:0:{}", - "attendee" => "a:0:{}", - "calnumber" => 1, - "calname" => 20070608153450, - "url" => '', - ), - - - - - - ), - - - - "1300" => array ( "xxx2" => array( - "event_start" => 1300, - "event_end" => 1400, - "start_unixtime" => 1181307600, - "end_unixtime" => 1181311200, - "event_text" => "JOSX", - "event_length" => 3600, - "event_overlap" => 2, - "description" => "Horas", - "status" => '', - "class" => "PUBLIC", - "spans_day" => '', - "location" => '', - "organizer" => "a:0:{}", - "attendee" => "a:0:{}", - "calnumber" => 1, - "calname" => 20070608153450, - "url" => '', - ), -/*"xxx3" => array( - "event_start" => 1300, - "event_end" => 1400, - "start_unixtime" => 1181307600, - "end_unixtime" => 1181311200, - "event_text" => "JOSX", - "event_length" => 3600, - "event_overlap" => 2, - "description" => "Horas+de+maestro%2Fprofesor", - "status" => '', - "class" => "PUBLIC", - "spans_day" => '', - "location" => '', - "organizer" => "a:0:{}", - "attendee" => "a:0:{}", - "calnumber" => 1, - "calname" => 20070608153450, - "url" => '', - ),*/ -"xxx5" => array( - "event_start" => 1300, - "event_end" => 1400, - "start_unixtime" => 1181307600, - "end_unixtime" => 1181311200, - "event_text" => "JOSX", - "event_length" => 3600, - "event_overlap" => 2, - "description" => "Horas+de+maestro%2Fprofesor", - "status" => '', - "class" => "PUBLIC", - "spans_day" => '', - "location" => '', - "organizer" => "a:0:{}", - "attendee" => "a:0:{}", - "calnumber" => 1, - "calname" => 20070608153450, - "url" => '', - ) - ), - - "1245" => array ( "xxx2" => array( - "event_start" => 1245, - "event_end" => 1400, - "start_unixtime" => 1181306700, - "end_unixtime" => 1181311200, - "event_text" => "JOSX", - "event_length" => 3600, - "event_overlap" => 2, - "description" => "Horas", - "status" => '', - "class" => "PUBLIC", - "spans_day" => '', - "location" => '', - "organizer" => "a:0:{}", - "attendee" => "a:0:{}", - "calnumber" => 1, - "calname" => 20070608153450, - "url" => '', - )), - - - - ); - $nbrGridCols = 1; foreach($aEvent as $day) { foreach($day as $time) { @@ -234,7 +84,6 @@ } } - $this->nbrGridCols = $nbrGridCols; $this->aEvent = $aEvent; $this->aWeek = $aWeek; @@ -247,45 +96,4 @@ } - -/* -[20070510] => Array - ( - [1400] => Array - ( - [[email protected]] => Array - ( - [event_start] => 1400 - [event_end] => 1500 - [start_unixtime] => 1178805600 - [end_unixtime] => 1178809200 - [event_text] => S%C3%83%C2%A9ptimo+Grado+B-Formaci%C3%83%C2%B3n+%C3%83%C2%A9tica+y+ciudadana.-222222222222+2222222222222 - [event_length] => 3600 - [event_overlap] => 0 - [description] => Horas+de+maestro%2Fprofesor - [status] => - [class] => PUBLIC - [spans_day] => - [location] => - [organizer] => a:0:{} - [attendee] => a:0:{} - [calnumber] => 1 - [calname] => 20070608153450 - [url] => - [recur] => Array - ( - [FREQ] => daily - [INTERVAL] => 1 - [UNTIL] => 30 de Diciembre - ) - - ) - - ) -*/ - - - - - ?> \ No newline at end of file Added: prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/lib/ical_parser.php =================================================================== --- prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/lib/ical_parser.php 2007-06-12 20:24:25 UTC (rev 4744) +++ prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/lib/ical_parser.php 2007-06-13 18:45:53 UTC (rev 4745) @@ -0,0 +1,1507 @@ +<? + + + + +// localizeDate() - similar to strftime but uses our preset arrays of localized +// months and week days and only supports %A, %a, %B, %b, %e, and %Y +// more can be added as needed but trying to keep it small while we can +function localizeDate($format, $timestamp) { + global $daysofweek_lang, $daysofweekshort_lang, $daysofweekreallyshort_lang, $monthsofyear_lang, $monthsofyear_lang, $monthsofyearshort_lang; + $year = date("Y", $timestamp); + $month = date("n", $timestamp)-1; + $day = date("j", $timestamp); + $dayofweek = date("w", $timestamp); + + $date = str_replace('%Y', $year, $format); + $date = str_replace('%e', $day, $date); + $date = str_replace('%B', $monthsofyear_lang[$month], $date); + $date = str_replace('%b', $monthsofyearshort_lang[$month], $date); + $date = str_replace('%A', $daysofweek_lang[$dayofweek], $date); + $date = str_replace('%a', $daysofweekshort_lang[$dayofweek], $date); + + return $date; + +} + + +// Remove an event from the overlap data. +// This could be completely bogus, since overlap array is empty when this gets called in my tests, but I'm leaving it in anyways. +function removeOverlap($ol_start_date, $ol_start_time, &$ol_key,$master_array, &$overlap_array) { +// global $master_array, $overlap_array; + if (isset($overlap_array[$ol_start_date])) { + if (sizeof($overlap_array[$ol_start_date]) > 0) { + $ol_end_time = $master_array[$ol_start_date][$ol_start_time][$ol_key]['event_end']; + foreach ($overlap_array[$ol_start_date] as $block_key => $block) { + if (in_array(array('time' => $ol_start_time, 'key' => $ol_key), $block['events'])) { + // Check if this is a 2-event block (i.e., there's no block left when we remove $ol_key + // and if so, just unset it and move on. + if (count($block['events']) == 2) { + foreach ($block['events'] as $event) { + $master_array[$ol_start_date][$event['time']][$event['key']]['event_overlap'] = 0; + } + unset($overlap_array[$ol_start_date][$block_key]); + } else { + // remove $ol_key from 'events' + $event_key = array_search(array('time' => $ol_start_time, 'key' => $ol_key), $block['events']); + unset($overlap_array[$ol_start_date][$block_key]['events'][$event_key]); + + // These may be bogus, since we're not using drawEventTimes. + // "clean up" 'overlapRanges' and calc the new maxOverlaps. + // use the special "-2" count to tell merge_range we're deleting. + $overlap_array[$ol_start_date][$block_key]['overlapRanges'] = merge_range($block['overlapRanges'], $ol_start_time, $ol_end_time, -2); + $overlap_array[$ol_start_date][$block_key]['maxOverlaps'] = find_max_overlap($block['overlapRanges']); + + // recreate blockStart and blockEnd from the other events, and fix maxOverlap while we're at it. + $blockStart = $ol_end_time; + $blockEnd = $ol_start_time; + foreach ($overlap_array[$ol_start_date][$block_key]['events'] as $event) { + $blockStart = min($blockStart, $event['time']); + $blockEnd = max($blockEnd, $master_array[$ol_start_date][$event['time']][$event['key']]['event_end']); + $master_array[$ol_start_date][$event['time']][$event['key']]['event_overlap'] = $overlap_array[$ol_start_date][$block_key]['maxOverlaps']; + } + $overlap_array[$ol_start_date][$block_key]['blockStart'] = $blockStart; + $overlap_array[$ol_start_date][$block_key]['blockEnd'] = $blockEnd; + } + } + } + } + } +} + + +// Finds the highest value of 'count' in $ol_ranges +function find_max_overlap($ol_ranges) { + + $count = 0; + foreach ($ol_ranges as $loop_range) { + if ($count < $loop_range['count']) + $count = $loop_range['count']; + } + + return $count; +} + + + +// Merges overlapping blocks +function flatten_ol_blocks($event_date, $ol_blocks, $new_block_key, &$master_array) { + +// global $master_array; + // Loop block = each other block in the array, the ones we're merging into new block. + // New block = the changed block that caused the flatten_ol_blocks call. Everything gets merged into this. + $new_block = $ol_blocks[$new_block_key]; + reset($ol_blocks); + while ($loop_block_array = each($ol_blocks)) { + $loop_block_key = $loop_block_array['key']; + $loop_block = $loop_block_array['value']; + // only compare with other blocks + if ($loop_block_key != $new_block_key) { + // check if blocks overlap + if (($loop_block['blockStart'] < $new_block['blockEnd']) && ($loop_block['blockEnd'] > $new_block['blockStart'])) { + // define start and end of merged overlap block + if ($new_block['blockStart'] > $loop_block['blockStart']) $ol_blocks[$new_block_key]['blockStart'] = $loop_block['blockStart']; + if ($new_block['blockEnd'] < $loop_block['blockEnd']) $ol_blocks[$new_block_key]['blockEnd'] = $loop_block['blockEnd']; + $ol_blocks[$new_block_key]['events'] = array_merge($new_block['events'], $loop_block['events']); + $new_block['events'] = $ol_blocks[$new_block_key]['events']; + foreach ($loop_block['overlapRanges'] as $ol_range) { + $new_block['overlapRanges'] = merge_range($new_block['overlapRanges'], $ol_range['start'], $ol_range['end'], $ol_range['count']); + } + $ol_blocks[$new_block_key]['overlapRanges'] = $new_block['overlapRanges']; + $ol_blocks[$new_block_key]['maxOverlaps'] = find_max_overlap($new_block['overlapRanges']); + foreach ($ol_blocks[$new_block_key]['events'] as $event) { + $master_array[$event_date][$event['time']][$event['key']]['event_overlap'] = $ol_blocks[$new_block_key]['maxOverlaps']; + } + unset($ol_blocks[$loop_block_key]); + reset($ol_blocks); + } + } + } + + return $ol_blocks; +} + + +// merge a given range into $ol_ranges. Returns the merged $ol_ranges. +// if count = -2, treat as a "delete" call (for removeOverlap) +// Why -2? That way, there's less fudging of the math in the code. +function merge_range($ol_ranges, $start, $end, $count = 0) { + + foreach ($ol_ranges as $loop_range_key => $loop_range) { + + if ($start < $end) { + // handle ranges between $start and $loop_range['start'] + if ($start < $loop_range['start']) { + $new_ol_ranges[] = array('count' => $count, 'start' => $start, 'end' => min($loop_range['start'], $end)); + $start = $loop_range['start']; + } + + // $start is always >= $loop_range['start'] at this point. + // handles ranges between $loop_range['start'] and $loop_range['end'] + if ($loop_range['start'] < $end && $start < $loop_range['end']) { + // handles ranges between $loop_range['start'] and $start + if ($loop_range['start'] < $start) { + $new_ol_ranges[] = array('count' => $loop_range['count'], 'start' => $loop_range['start'], 'end' => $start); + } + // handles ranges between $start and $end (where they're between $loop_range['start'] and $loop_range['end']) + $new_count = $loop_range['count'] + $count + 1; + if ($new_count >= 0) { + $new_ol_ranges[] = array('count' => $new_count, 'start' => $start, 'end' => min($loop_range['end'], $end)); + } + // handles ranges between $end and $loop_range['end'] + if ($loop_range['end'] > $end) { + $new_ol_ranges[] = array('count' => $loop_range['count'], 'start' => $end, 'end' => $loop_range['end']); + } + $start = $loop_range['end']; + } else { + $new_ol_ranges[] = $loop_range; + } + } else { + $new_ol_ranges[] = $loop_range; + } + } + + // Catches anything left over. + if ($start < $end) { + $new_ol_ranges[] = array('count' => $count, 'start' => $start, 'end' => $end); + } + + return $new_ol_ranges; +} + +// Builds $overlap_array structure, and updates event_overlap in $master_array for the given events. +function checkOverlap($event_date, $event_time, $uid, &$master_array, &$overlap_array) { +// global $master_array, $overlap_array; + if (!isset($event_date)) return; + $event = $master_array[$event_date][$event_time][$uid]; + // Copy out the array - we replace this at the end. + $ol_day_array = $overlap_array[$event_date]; + $drawTimes = drawEventTimes($event['event_start'], $event['event_end']); + + // For a given date, + // - check to see if the event's already in a block, and if so, add it. + // - make sure the new block doesn't overlap another block, and if so, merge the blocks. + // - check that there aren't any events we already passed that we should handle. + // - "flatten" the structure again, merging the blocks. + + // $overlap_array structure: + // array of ($event_dates) + // array of unique overlap blocks (no index) - + + // $overlap_block structure + // 'blockStart' - $start_time of block - earliest $start_time of the events in the block. + // Shouldn't be any overlap w/ a different overlap block in that day (as if they overlap, they get merged). + // 'blockEnd' - $end_time of block - latest $end_time of the events in the block. + // 'maxOverlaps' - max number of overlaps for the whole block (highest 'count' in overlapRanges) + // 'events' - array of event "pointers" (no index) - each event in the block. + // 'time' - $start_time of event in the block + // 'key' - $uid of event + // 'overlapRanges' - array of time ranges + overlap counts (no index) - the specific overlap info. + // Shouldn't be any overlap w/ the overlap ranges in a given overlap_block - if there is overlap, the block should be split. + // 'count' - number of overlaps that time range (can be zero if that range has no overlaps). + // 'start' - start_time for the overlap block. + // 'end' - end_time for the overlap block. + + $ol_day_array = $overlap_array[$event_date]; + // Track if $event has been merged in, so we don't re-add the details to 'event' or 'overlapRanges' multiple times. + $already_merged_once = false; + // First, check the existing overlap blocks, see if the event overlaps with any. + if (isset($ol_day_array)) { + foreach ($ol_day_array as $loop_block_key => $loop_ol_block) { + // Should $event be in this $ol_block? If so, add it. + if ($loop_ol_block['blockStart'] < $drawTimes['draw_end'] && $loop_ol_block['blockEnd'] > $drawTimes['draw_start']) { + // ... unless it's already in the $ol_block + if (!in_array(array('time' => $drawTimes['draw_start'], 'key' => $uid), $loop_ol_block['events'])) { + $loop_ol_block['events'][] = array('time' => $drawTimes['draw_start'], 'key' => $uid); + if ($loop_ol_block['blockStart'] > $drawTimes['draw_start']) $loop_ol_block['blockStart'] = $drawTimes['draw_start']; + if ($loop_ol_block['blockEnd'] < $drawTimes['draw_end']) $loop_ol_block['blockEnd'] = $drawTimes['draw_end']; + + // Merge in the new overlap range + $loop_ol_block['overlapRanges'] = merge_range($loop_ol_block['overlapRanges'], $drawTimes['draw_start'], $drawTimes['draw_end']); + $loop_ol_block['maxOverlaps'] = find_max_overlap($loop_ol_block['overlapRanges']); + foreach ($loop_ol_block['events'] as $max_overlap_event) { + $master_array[$event_date][$max_overlap_event['time']][$max_overlap_event['key']]['event_overlap'] = $loop_ol_block['maxOverlaps']; + } + $ol_day_array[$loop_block_key] = $loop_ol_block; + $ol_day_array = flatten_ol_blocks($event_date, $ol_day_array, $loop_block_key, $master_array); + $already_merged_once = true; + break; + // Handle repeat calls to checkOverlap - semi-bogus since the event shouldn't be created more than once, but this makes sure we don't get an invalid event_overlap. + } else { + $master_array[$event_date][$event_time][$uid]['event_overlap'] = $loop_ol_block['maxOverlaps']; + } + } + } + } + + // Then, check all the events, make sure there isn't a new overlap that we need to create. + foreach ($master_array[$event_date] as $time_key => $time) { + // Skip all-day events for overlap purposes. + if ($time_key != '-1') { + foreach ($time as $loop_event_key => $loop_event) { + // Make sure we haven't already dealt with the event, and we're not checking against ourself. + if ($loop_event['event_overlap'] == 0 && $loop_event_key != $uid) { + $loopDrawTimes = drawEventTimes($loop_event['event_start'], $loop_event['event_end']); + if ($loopDrawTimes['draw_start'] < $drawTimes['draw_end'] && $loopDrawTimes['draw_end'] > $drawTimes['draw_start']) { + if ($loopDrawTimes['draw_start'] < $drawTimes['draw_start']) { + $block_start = $loopDrawTimes['draw_start']; + } else { + $block_start = $drawTimes['draw_start']; + } + if ($loopDrawTimes['draw_end'] > $drawTimes['draw_end']) { + $block_end = $loopDrawTimes['draw_end']; + } else { + $block_end = $drawTimes['draw_end']; + } + $events = array(array('time' => $loopDrawTimes['draw_start'], 'key' => $loop_event_key)); + $overlap_ranges = array(array('count' => 0, 'start' => $loopDrawTimes['draw_start'], 'end' => $loopDrawTimes['draw_end'])); + // Only add $event if we haven't already put it in a block + if (!$already_merged_once) { + $events[] = array('time' => $drawTimes['draw_start'], 'key' => $uid); + $overlap_ranges = merge_range($overlap_ranges, $drawTimes['draw_start'], $drawTimes['draw_end']); + $already_merged_once = true; + } + $ol_day_array[] = array('blockStart' => $block_start, 'blockEnd' => $block_end, 'maxOverlaps' => 1, 'events' => $events, 'overlapRanges' => $overlap_ranges); + + foreach ($events as $max_overlap_event) { + $master_array[$event_date][$max_overlap_event['time']][$max_overlap_event['key']]['event_overlap'] = 1; + } + // Make sure we pass in the key of the newly added item above. + end($ol_day_array); + $last_day_key = key($ol_day_array); + $ol_day_array = flatten_ol_blocks($event_date, $ol_day_array, $last_day_key, $master_array); + } + } + } + } + } + + $overlap_array[$event_date] = $ol_day_array; + +//for debugging the checkOverlap function +//if ($event_date == '20050506') { +//print 'Date: ' . $event_date . ' / Time: ' . $event_time . ' / Key: ' . $uid . "<br />\n"; +//print '<pre>'; +//print_r($master_array[$event_date]); +//print_r($overlap_array[$event_date]); +//print '</pre>'; +//} + +} + +function drawEventTimes ($start, $end) { + $gridLength=15; + + preg_match ('/([0-9]{2})([0-9]{2})/', $start, $time); + $sta_h = $time[1]; + $sta_min = $time[2]; + $sta_min = sprintf("%02d", floor($sta_min / $gridLength) * $gridLength); + if ($sta_min == 60) { + $sta_h = sprintf("%02d", ($sta_h + 1)); + $sta_min = "00"; + } + + preg_match ('/([0-9]{2})([0-9]{2})/', $end, $time); + $end_h = $time[1]; + $end_min = $time[2]; + $end_min = sprintf("%02d", floor($end_min / $gridLength) * $gridLength); + if ($end_min == 60) { + $end_h = sprintf("%02d", ($end_h + 1)); + $end_min = "00"; + } + + if (($sta_h . $sta_min) == ($end_h . $end_min)) { + $end_min += $gridLength; + if ($end_min == 60) { + $end_h = sprintf("%02d", ($end_h + 1)); + $end_min = "00"; + } + } + + $draw_len = ($end_h * 60 + $end_min) - ($sta_h * 60 + $sta_min); + + return array ("draw_start" => ($sta_h . $sta_min), "draw_end" => ($end_h . $end_min), "draw_length" => $draw_len); +} + + +// calcTime calculates the unixtime of a new offset by comparing it to the current offset +// $have is the current offset (ie, '-0500') +// $want is the wanted offset (ie, '-0700') +// $time is the unixtime relative to $have +function calcTime($have, $want, $time) { + if ($have == 'none' || $want == 'none') return $time; + $have_secs = calcOffset($have); + $want_secs = calcOffset($want); + $diff = $want_secs - $have_secs; + $time += $diff; + return $time; +} + + +function chooseOffset($time, &$timezone, &$tz_array) { +// global $timezone, $tz_array; + if (!isset($timezone)) $timezone = ''; + switch ($timezone) { + case '': + $offset = 'none'; + break; + case 'Same as Server': + $offset = date('O', $time); + break; + default: + if (is_array($tz_array) && array_key_exists($timezone, $tz_array)) { + $dlst = date('I', $time); + $offset = $tz_array[$timezone][$dlst]; + } else { + $offset = '+0000'; + } + } + return $offset; +} + + +// Returns an array of the date and time extracted from the data +// passed in. This array contains (unixtime, date, time, allday). +// +// $data = A string representing a date-time per RFC2445. +// $property = The property being examined, e.g. DTSTART, DTEND. +// $field = The full field being examined, e.g. DTSTART;TZID=US/Pacific +function extractDateTime($data, $property, $field, &$tz_array) { +// global $tz_array; + + // Initialize values. + unset($unixtime, $date, $time, $allday); + + $allday =''; #suppress error on returning undef. + // Check for zulu time. + $zulu_time = false; + if (substr($data,-1) == 'Z') $zulu_time = true; + $data = str_replace('Z', '', $data); + + // Remove some substrings we don't want to look at. + $data = str_replace('T', '', $data); + $field = str_replace(';VALUE=DATE-TIME', '', $field); + + // Extract date-only values. + if ((preg_match('/^'.$property.';VALUE=DATE/i', $field)) || (ereg ('^([0-9]{4})([0-9]{2})([0-9]{2})$', $data))) { + // Pull out the date value. Minimum year is 1970. + ereg ('([0-9]{4})([0-9]{2})([0-9]{2})', $data, $dt_check); + if ($dt_check[1] < 1970) { + $data = '1971'.$dt_check[2].$dt_check[3]; + } + + // Set the values. + $unixtime = strtotime($data); + $date = date('Ymd', $unixtime); + $allday = $data; + } + + // Extract date-time values. + else { + // Pull out the timezone, or use GMT if zulu time was indicated. + if (preg_match('/^'.$property.';TZID=/i', $field)) { + $tz_tmp = explode('=', $field); + $tz_dt = parse_tz($tz_tmp[1]); + unset($tz_tmp); + } elseif ($zulu_time) { + $tz_dt = 'GMT'; + } + + // Pull out the date and time values. Minimum year is 1970. + preg_match ('/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})/', $data, $regs); + if ($regs[1] < 1970) { + $regs[1] = '1971'; + } + $date = $regs[1] . $regs[2] . $regs[3]; + $time = $regs[4] . $regs[5]; + $unixtime = mktime($regs[4], $regs[5], 0, $regs[2], $regs[3], $regs[1]); + + // Check for daylight savings time. + $dlst = date('I', $unixtime); + $server_offset_tmp = chooseOffset($unixtime, $timezone, $tz_array); + if (isset($tz_dt)) { + if (array_key_exists($tz_dt, $tz_array)) { + $offset_tmp = $tz_array[$tz_dt][$dlst]; + } else { + $offset_tmp = '+0000'; + } + } elseif (isset($calendar_tz)) { + if (array_key_exists($calendar_tz, $tz_array)) { + $offset_tmp = $tz_array[$calendar_tz][$dlst]; + } else { + $offset_tmp = '+0000'; + } + } else { + $offset_tmp = $server_offset_tmp; + } + + // Set the values. + $unixtime = calcTime($offset_tmp, $server_offset_tmp, $unixtime); + $date = date('Ymd', $unixtime); + $time = date('Hi', $unixtime); + } + + // Return the results. + return array($unixtime, $date, $time, $allday); +} + + + +function icalToArray($filename) { +// $filename = "/var/www/phpicalendar/calendars/pepe.ics"; + $master_array = array(); + $ifile = @fopen($filename, "r"); + if ($ifile == FALSE) exit("Cant Open file: ". $filename."\n"); + $nextline = fgets($ifile, 1024); + if (trim($nextline) != 'BEGIN:VCALENDAR') exit("It is not a valid ical file: ". $filename."\n"); + + // Set a value so we can check to make sure $master_array contains valid data +// $master_array['-1'] = 'valid cal file'; + + // Set default calendar name - can be overridden by X-WR-CALNAME + $calendar_name = $cal_filename; +// $master_array['calendar_name'] = $calendar_name; + + // read file in line by line + // XXX end line is skipped because of the 1-line readahead + while (!feof($ifile)) { + $line = $nextline; + $nextline = fgets($ifile, 1024); + $nextline = ereg_replace("[\r\n]", "", $nextline); + #handle continuation lines that start with either a space or a tab (MS Outlook) + while ($nextline{0} == " " || $nextline{0} == "\t") { + $line = $line . substr($nextline, 1); + $nextline = fgets($ifile, 1024); + $nextline = ereg_replace("[\r\n]", "", $nextline); + } + $line = trim($line); + + switch ($line) { + case 'BEGIN:VEVENT': + // each of these vars were being set to an empty string + unset ( + $start_time, $end_time, $start_date, $end_date, $summary, + $allday_start, $allday_end, $start, $end, $the_duration, + $beginning, $rrule_array, $start_of_vevent, $description, $url, + $valarm_description, $start_unixtime, $end_unixtime, $display_end_tmp, $end_time_tmp1, + $recurrence_id, $uid, $class, $location, $rrule, $abs_until, $until_check, + $until, $bymonth, $byday, $bymonthday, $byweek, $byweekno, + $byminute, $byhour, $bysecond, $byyearday, $bysetpos, $wkst, + $interval, $number + ); + + $except_dates = array(); + $except_times = array(); + $bymonth = array(); + $bymonthday = array(); + $first_duration = TRUE; + $count = 1000000; + $valarm_set = FALSE; + $attendee = array(); + $organizer = array(); + + break; + + case 'END:VEVENT': + + if (!isset($url)) $url = ''; + if (!isset($type)) $type = ''; + + // Handle DURATION + if (!isset($end_unixtime) && isset($the_duration)) { + $end_unixtime = $start_unixtime + $the_duration; + $end_time = date ('Hi', $end_unixtime); + } + + // CLASS support + if (isset($class)) { + if ($class == 'PRIVATE') { + $summary ='**PRIVATE**'; + $description ='**PRIVATE**'; + } elseif ($class == 'CONFIDENTIAL') { + $summary ='**CONFIDENTIAL**'; + $description ='**CONFIDENTIAL**'; + } + } + + // make sure we have some value for $uid + if (!isset($uid)) { + $uid = $uid_counter; + $uid_counter++; + $uid_valid = false; + } else { + $uid_valid = true; + } + + if ($uid_valid && isset($processed[$uid]) && isset($recurrence_id['date'])) { + + $old_start_date = $processed[$uid][0]; + $old_start_time = $processed[$uid][1]; + if ($recurrence_id['value'] == 'DATE') $old_start_time = '-1'; + $start_date_tmp = $recurrence_id['date']; + if (!isset($start_date)) $start_date = $old_start_date; + if (!isset($start_time)) $start_time = $master_array[$old_start_date][$old_start_time][$uid]['event_start']; + if (!isset($start_unixtime)) $start_unixtime = $master_array[$old_start_date][$old_start_time][$uid]['start_unixtime']; + if (!isset($end_unixtime)) $end_unixtime = $master_array[$old_start_date][$old_start_time][$uid]['end_unixtime']; + if (!isset($end_time)) $end_time = $master_array[$old_start_date][$old_start_time][$uid]['event_end']; + if (!isset($summary)) $summary = $master_array[$old_start_date][$old_start_time][$uid]['event_text']; + if (!isset($length)) $length = $master_array[$old_start_date][$old_start_time][$uid]['event_length']; + if (!isset($description)) $description = $master_array[$old_start_date][$old_start_time][$uid]['description']; + if (!isset($location)) $location = $master_array[$old_start_date][$old_start_time][$uid]['location']; + if (!isset($organizer)) $organizer = $master_array[$old_start_date][$old_start_time][$uid]['organizer']; + if (!isset($status)) $status = $master_array[$old_start_date][$old_start_time][$uid]['status']; + if (!isset($attendee)) $attendee = $master_array[$old_start_date][$old_start_time][$uid]['attendee']; + if (!isset($url)) $url = $master_array[$old_start_date][$old_start_time][$uid]['url']; + removeOverlap($start_date_tmp, $old_start_time, $uid, $master_array, $overlap_array); + if (isset($master_array[$start_date_tmp][$old_start_time][$uid])) { + unset($master_array[$start_date_tmp][$old_start_time][$uid]); // SJBO added $uid twice here + if (sizeof($master_array[$start_date_tmp][$old_start_time]) == 0) { + unset($master_array[$start_date_tmp][$old_start_time]); + } + } + + $write_processed = false; + } else { + $write_processed = true; + } + + if (!isset($summary)) $summary = ''; + if (!isset($description)) $description = ''; + if (!isset($status)) $status = ''; + if (!isset($class)) $class = ''; + if (!isset($location)) $location = ''; + + $mArray_begin = mktime (0,0,0,12,21,($this_year - 1)); + $mArray_end = mktime (0,0,0,1,12,($this_year + 1)); + + if (isset($start_time) && isset($end_time)) { + // Mozilla style all-day events or just really long events + if (($end_time - $start_time) > 2345) { + $allday_start = $start_date; + $allday_end = ($start_date + 1); + } + } + if (isset($start_unixtime,$end_unixtime) && date('Ymd',$start_unixtime) != date('Ymd',$end_unixtime)) { + $spans_day = true; + $bleed_check = (($start_unixtime - $end_unixtime) < (60*60*24)) ? '-1' : '0'; + } else { + $spans_day = false; + $bleed_check = 0; + } + if (isset($start_time) && $start_time != '') { + preg_match ('/([0-9]{2})([0-9]{2})/', $start_time, $time); + preg_match ('/([0-9]{2})([0-9]{2})/', $end_time, $time2); + if (isset($start_unixtime) && isset($end_unixtime)) { + $length = $end_unixtime - $start_unixtime; + } else { + $length = ($time2[1]*60+$time2[2]) - ($time[1]*60+$time[2]); + } + + $drawKey = drawEventTimes($start_time, $end_time); + + preg_match ('/([0-9]{2})([0-9]{2})/', $drawKey['draw_start'], $time3); + $hour = $time3[1]; + $minute = $time3[2]; + } + + // RECURRENCE-ID Support + if (isset($recurrence_d)) { + + $recurrence_delete["$recurrence_d"]["$recurrence_t"] = $uid; + } + + // handle single changes in recurring events + // Maybe this is no longer need since done at bottom of parser? - CL 11/20/02 + if ($uid_valid && $write_processed) { + if (!isset($hour)) $hour = 00; + if (!isset($minute)) $minute = 00; + $processed[$uid] = array($start_date,($hour.$minute), $type); + } + + // Handling of the all day events + if ((isset($allday_start) && $allday_start != '')) { + $start = strtotime($allday_start); + if ($spans_day) { + $allday_end = date('Ymd',$end_unixtime); + } + if (isset($allday_end)) { + $end = strtotime($allday_end); + } else { + $end = strtotime('+1 day', $start); + } + // Changed for 1.0, basically write out the entire event if it starts while the array is written. + # while loop handles multi-day allday events to write separate master_array elements for each day. + if (($start < $mArray_end) && ($start < $end)) { + while (($start != $end) && ($start < $mArray_end)) { + $start_date2 = date('Ymd', $start); + $master_array[($start_date2)][('-1')][$uid]= array ( + 'event_text' => $summary, + 'description' => $description, + 'location' => $location, + 'organizer' => serialize($organizer), + 'attendee' => serialize($attendee), + 'calnumber' => $calnumber, + 'calname' => $actual_calname, + 'url' => $url, + 'status' => $status, + 'class' => $class ); + $start = strtotime('+1 day', $start); + } + if (!$write_processed) $master_array[($start_date)]['-1'][$uid]['exception'] = true; + } + } + + // Handling regular events + if ((isset($start_time) && $start_time != '') && (!isset($allday_start) || $allday_start == '')) { + if (($end_time >= $bleed_time) && ($bleed_check == '-1')) { + $start_tmp = strtotime(date('Ymd',$start_unixtime)); + $end_date_tmp = date('Ymd',$end_unixtime); + while ($start_tmp < $end_unixtime) { + $start_date_tmp = date('Ymd',$start_tmp); + if ($start_date_tmp == $start_date) { + $time_tmp = $hour.$minute; + $start_time_tmp = $start_time; + } else { + $time_tmp = '0000'; + $start_time_tmp = '0000'; + } + if ($start_date_tmp == $end_date_tmp) { + $end_time_tmp = $end_time; + } else { + $end_time_tmp = '2400'; + $display_end_tmp = $end_time; + } + + $master_array[$start_date_tmp][$time_tmp][$uid] = array ( + 'event_start' => $start_time_tmp, + 'event_end' => $end_time_tmp, + 'start_unixtime' => $start_unixtime, + 'end_unixtime' => $end_unixtime, + 'event_text' => $summary, + 'event_length' => $length, + 'event_overlap' => 0, + 'description' => $description, + 'status' => $status, + 'class' => $class, + 'spans_day' => true, + 'location' => $location, + 'organizer' => serialize($organizer), + 'attendee' => serialize($attendee), + 'calnumber' => $calnumber, + 'calname' => $actual_calname, + 'url' => $url ); + if (isset($display_end_tmp)){ + $master_array[$start_date_tmp][$time_tmp][$uid]['display_end'] = $display_end_tmp; + } + checkOverlap($start_date_tmp, $time_tmp, $uid, $master_array, $overlap_array); + $start_tmp = strtotime('+1 day',$start_tmp); + } + if (!$write_processed) $master_array[$start_date][($hour.$minute)][$uid]['exception'] = true; + } else { + if ($bleed_check == '-1') { + $display_end_tmp = $end_time; + $end_time_tmp1 = '2400'; + } + + if (!isset($end_time_tmp1)) $end_time_tmp1 = $end_time; + + // This if statement should prevent writing of an excluded date if its the first recurrance - CL + if (!in_array($start_date, $except_dates)) { + $master_array[($start_date)][($hour.$minute)][$uid] = array ( + 'event_start' => $start_time, + 'event_end' => $end_time_tmp1, + 'start_unixtime' => $start_unixtime, + 'end_unixtime' => $end_unixtime, + 'event_text' => $summary, + 'event_length' => $length, + 'event_overlap' => 0, + 'description' => $description, + 'status' => $status, + 'class' => $class, + 'spans_day' => false, + 'location' => $location, + 'organizer' => serialize($organizer), + 'attendee' => serialize($attendee), + 'calnumber' => $calnumber, + 'calname' => $actual_calname, + 'url' => $url ); + if (isset($display_end_tmp)){ + $master_array[($start_date)][($hour.$minute)][$uid]['display_end'] = $display_end_tmp; + } + checkOverlap($start_date, ($hour.$minute), $uid, $master_array, $overlap_array); + if (!$write_processed) $master_array[($start_date)][($hour.$minute)][$uid]['exception'] = true; + } + } + } + + // Handling of the recurring events, RRULE + if (isset($rrule_array) && is_array($rrule_array)) { + if (isset($allday_start) && $allday_start != '') { + $hour = '-'; + $minute = '1'; + $rrule_array['START_DAY'] = $allday_start; + $rrule_array['END_DAY'] = $allday_end; + $rrule_array['END'] = 'end'; + $recur_start = $allday_start; + $start_date = $allday_start; + if (isset($allday_end)) { + $diff_allday_days = dayCompare($allday_end, $allday_start); + } else { + $diff_allday_days = 1; + } + } else { + $rrule_array['START_DATE'] = $start_date; + $rrule_array['START_TIME'] = $start_time; + $rrule_array['END_TIME'] = $end_time; + $rrule_array['END'] = 'end'; + } + + $start_date_time = strtotime($start_date); + if (!isset($fromdate)){ + #this should happen if not in one of the rss views + $this_month_start_time = strtotime($this_year.$this_month.'01'); + if ($current_view == 'year' || ($save_parsed_cals == 'yes' && !$is_webcal)|| $current_view == 'print' && $printview == 'year') { + $start_range_time = strtotime($this_year.'-01-01 -2 weeks'); + $end_range_time = strtotime($this_year.'-12-31 +2 weeks'); + } else { + $start_range_time = strtotime('-1 month -2 day', $this_month_start_time); + $end_range_time = strtotime('+2 month +2 day', $this_month_start_time); + } + }else{ + $start_range_time = strtotime($fromdate); + $end_range_time = strtotime($todate)+60*60*24; + } + foreach ($rrule_array as $key => $val) { + switch($key) { + case 'FREQ': + switch ($val) { + case 'YEARLY': $freq_type = 'year'; break; + case 'MONTHLY': $freq_type = 'month'; break; + case 'WEEKLY': $freq_type = 'week'; break; + case 'DAILY': $freq_type = 'day'; break; + case 'HOURLY': $freq_type = 'hour'; break; + case 'MINUTELY': $freq_type = 'minute'; break; + case 'SECONDLY': $freq_type = 'second'; break; + } + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = strtolower($val); + break; + case 'COUNT': + $count = $val; + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $count; + break; + case 'UNTIL': + $until = str_replace('T', '', $val); + $until = str_replace('Z', '', $until); + if (strlen($until) == 8) $until = $until.'235959'; + $abs_until = $until; + ereg ('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})', $until, $regs); + $until = mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[3],$regs[1]); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = localizeDate($dateFormat_week,$until); + break; + case 'INTERVAL': + if ($val > 0){ + $number = $val; + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $number; + } + break; + case 'BYSECOND': + $bysecond = $val; + $bysecond = split (',', $bysecond); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bysecond; + break; + case 'BYMINUTE': + $byminute = $val; + $byminute = split (',', $byminute); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byminute; + break; + case 'BYHOUR': + $byhour = $val; + $byhour = split (',', $byhour); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byhour; + break; + case 'BYDAY': + $byday = $val; + $byday = split (',', $byday); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byday; + break; + case 'BYMONTHDAY': + $bymonthday = $val; + $bymonthday = split (',', $bymonthday); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bymonthday; + break; + case 'BYYEARDAY': + $byyearday = $val; + $byyearday = split (',', $byyearday); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byyearday; + break; + case 'BYWEEKNO': + $byweekno = $val; + $byweekno = split (',', $byweekno); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byweekno; + break; + case 'BYMONTH': + $bymonth = $val; + $bymonth = split (',', $bymonth); + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bymonth; + break; + case 'BYSETPOS': + $bysetpos = $val; + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bysetpos; + break; + case 'WKST': + $wkst = $val; + $master_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $wkst; + break; + case 'END': + + $recur = $master_array[($start_date)][($hour.$minute)][$uid]['recur']; + + // Modify the COUNT based on BYDAY + if ((is_array($byday)) && (isset($count))) { + $blah = sizeof($byday); + $count = ($count / $blah); + unset ($blah); + } + + if (!isset($number)) $number = 1; + // if $until isn't set yet, we set it to the end of our range we're looking at + + if (!isset($until)) $until = $end_range_time; + if (!isset($abs_until)) $abs_until = date('YmdHis', $end_range_time); + $end_date_time = $until; + $start_range_time_tmp = $start_range_time; + $end_range_time_tmp = $end_range_time; + + // If the $end_range_time is less than the $start_date_time, or $start_range_time is greater + // than $end_date_time, we may as well forget the whole thing + // It doesn't do us any good to spend time adding data we aren't even looking at + // this will prevent the year view from taking way longer than it needs to + if ($end_range_time_tmp >= $start_date_time && $start_range_time_tmp <= $end_date_time) { + + // if the beginning of our range is less than the start of the item, we may as well set it equal to it + if ($start_range_time_tmp < $start_date_time){ + $start_range_time_tmp = $start_date_time; + } + if ($end_range_time_tmp > $end_date_time) $end_range_time_tmp = $end_date_time; + + // initialize the time we will increment + $next_range_time = $start_range_time_tmp; + + // FIXME: This is a hack to fix repetitions with $interval > 1 + if ($count > 1 && $number > 1) $count = 1 + ($count - 1) * $number; + + $count_to = 0; + // start at the $start_range and go until we hit the end of our range. + if(!isset($wkst)) $wkst='SU'; + $wkst3char = two2threeCharDays($wkst); + + while (($next_range_time >= $start_range_time_tmp) && ($next_range_time <= $end_range_time_tmp) && ($count_to != $count)) { + $func = $freq_type.'Compare'; + $diff = $func(date('Ymd',$next_range_time), $start_date); + if ($diff < $count) { + if ($diff % $number == 0) { + $interval = $number; + switch ($rrule_array['FREQ']) { + case 'DAILY': + $next_date_time = $next_range_time; + $recur_data[] = $next_date_time; + break; + case 'WEEKLY': + // Populate $byday with the default day if it's not set. + if (!isset($byday)) { + $byday[] = strtoupper(substr(date('D', $start_date_time), 0, 2)); + } + if (is_array($byday)) { + foreach($byday as $day) { + $day = two2threeCharDays($day); + #need to find the first day of the appropriate week. + #dateOfweek uses weekstartday as a global variable. This has to be changed to $wkst, + #but then needs to be reset for other functions + $week_start_day_tmp = $week_start_day; + $week_start_day = $wkst3char; + + $the_sunday = dateOfWeek(date("Ymd",$next_range_time), $wkst3char); + $next_date_time = strtotime($day,strtotime($the_sunday)) + (12 * 60 * 60); + $week_start_day = $week_start_day_tmp; #see above reset to global value + + #reset $next_range_time to first instance in this week. + if ($next_date_time < $next_range_time){ + $next_range_time = $next_date_time; + } + // Since this renders events from $next_range_time to $next_range_time + 1 week, I need to handle intervals + // as well. This checks to see if $next_date_time is after $day_start (i.e., "next week"), and thus + // if we need to add $interval weeks to $next_date_time. + if ($next_date_time > strtotime($week_start_day, $next_range_time) && $interval > 1) { + # $next_date_time = strtotime('+'.($interval - 1).' '.$freq_type, $next_date_time); + } + $recur_data[] = $next_date_time; + } + } + break; + case 'MONTHLY': + if (empty($bymonth)) $bymonth = array(1,2,3,4,5,6,7,8,9,10,11,12); + $next_range_time = strtotime(date('Y-m-01', $next_range_time)); + $next_date_time = $next_date_time; + if (isset($bysetpos)){ + /* bysetpos code from dustinbutler + start on day 1 or last day. + if day matches any BYDAY the count is incremented. + SETPOS = 4, need 4th match + SETPOS = -1, need 1st match + */ + $year = date('Y', $next_range_time); + $month = date('m', $next_range_time); + if ($bysetpos > 0) { + $next_day = '+1 day'; + $day = 1; + } else { + $next_day = '-1 day'; + $day = $totalDays[$month]; + } + $day = mktime(0, 0, 0, $month, $day, $year); + $countMatch = 0; + while ($countMatch != abs($bysetpos)) { + /* Does this day match a BYDAY value? */ + $thisDay = $day; + $textDay = strtoupper(substr(date('D', $thisDay), 0, 2)); + if (in_array($textDay, $byday)) { + $countMatch++; + } + $day = strtotime($next_day, $thisDay); + } + $recur_data[] = $thisDay; + }elseif ((isset($bymonthday)) && (!isset($byday))) { + foreach($bymonthday as $day) { + if ($day < 0) $day = ((date('t', $next_range_time)) + ($day)) + 1; + $year = date('Y', $next_range_time); + $month = date('m', $next_range_time); + if (checkdate($month,$day,$year)) { + $next_date_time = mktime(0,0,0,$month,$day,$year); + $recur_data[] = $next_date_time; + } + } + } elseif (is_array($byday)) { + foreach($byday as $day) { + ereg ('([-\+]{0,1})?([0-9]{1})?([A-Z]{2})', $day, $byday_arr); + //Added for 2.0 when no modifier is set + if ($byday_arr[2] != '') { + $nth = $byday_arr[2]-1; + } else { + $nth = 0; + } + $on_day = two2threeCharDays($byday_arr[3]); + $on_day_num = two2threeCharDays($byday_arr[3],false); + if ((isset($byday_arr[1])) && ($byday_arr[1] == '-')) { + $last_day_tmp = date('t',$next_range_time); + $next_range_time = strtotime(date('Y-m-'.$last_day_tmp, $next_range_time)); + $last_tmp = (date('w',$next_range_time) == $on_day_num) ? '' : 'last '; + $next_date_time = strtotime($last_tmp.$on_day, $next_range_time) - $nth * 604800; + $month = date('m', $next_date_time); + if (in_array($month, $bymonth)) { + $recur_data[] = $next_date_time; + } + #reset next_range_time to start of month + $next_range_time = strtotime(date('Y-m-'.'1', $next_range_time)); + + } elseif (isset($bymonthday) && (!empty($bymonthday))) { + // This supports MONTHLY where BYDAY and BYMONTH are both set + foreach($bymonthday as $day) { + $year = date('Y', $next_range_time); + $month = date('m', $next_range_time); + if (checkdate($month,$day,$year)) { + $next_date_time = mktime(0,0,0,$month,$day,$year); + $daday = strtolower(strftime("%a", $next_date_time)); + if ($daday == $on_day && in_array($month, $bymonth)) { + $recur_data[] = $next_date_time; + } + } + } + } elseif ((isset($byday_arr[1])) && ($byday_arr[1] != '-')) { + $next_date_time = strtotime($on_day, $next_range_time) + $nth * 604800; + $month = date('m', $next_date_time); + if (in_array($month, $bymonth)) { + $recur_data[] = $next_date_time; + } + } + $next_date = date('Ymd', $next_date_time); + } + } + break; + case 'YEARLY': + if ((!isset($bymonth)) || (sizeof($bymonth) == 0)) { + $m = date('m', $start_date_time); + $bymonth = array("$m"); + } + + foreach($bymonth as $month) { + // Make sure the month & year used is within the start/end_range. + if ($month < date('m', $next_range_time)) { + $year = date('Y', $next_range_time); + } else { + $year = date('Y', $next_range_time); + } + if (isset($bysetpos)){ + /* bysetpos code from dustinbutler + start on day 1 or last day. + if day matches any BYDAY the count is incremented. + SETPOS = 4, need 4th match + SETPOS = -1, need 1st match + */ + if ($bysetpos > 0) { + $next_day = '+1 day'; + $day = 1; + } else { + $next_day = '-1 day'; + $day = date("t",$month); + } + $day = mktime(12, 0, 0, $month, $day, $year); + $countMatch = 0; + while ($countMatch != abs($bysetpos)) { + /* Does this day match a BYDAY value? */ + $thisDay = $day; + $textDay = strtoupper(substr(date('D', $thisDay), 0, 2)); + if (in_array($textDay, $byday)) { + $countMatch++; + } + $day = strtotime($next_day, $thisDay); + } + $recur_data[] = $thisDay; + } + if ((isset($byday)) && (is_array($byday))) { + $checkdate_time = mktime(0,0,0,$month,1,$year); + foreach($byday as $day) { + ereg ('([-\+]{0,1})?([0-9]{1})?([A-Z]{2})', $day, $byday_arr); + if ($byday_arr[2] != '') { + $nth = $byday_arr[2]-1; + } else { + $nth = 0; + } + $on_day = two2threeCharDays($byday_arr[3]); + $on_day_num = two2threeCharDays($byday_arr[3],false); + if ($byday_arr[1] == '-') { + $last_day_tmp = date('t',$checkdate_time); + $checkdate_time = strtotime(date('Y-m-'.$last_day_tmp, $checkdate_time)); + $last_tmp = (date('w',$checkdate_time) == $on_day_num) ? '' : 'last '; + $next_date_time = strtotime($last_tmp.$on_day.' -'.$nth.' week', $checkdate_time); + } else { + $next_date_time = strtotime($on_day.' +'.$nth.' week', $checkdate_time); + } + } + } else { + $day = date('d', $start_date_time); + $next_date_time = mktime(0,0,0,$month,$day,$year); + //echo date('Ymd',$next_date_time).$summary.'<br>'; + } + $recur_data[] = $next_date_time; + } + if (isset($byyearday)) { + foreach ($byyearday as $yearday) { + ereg ('([-\+]{0,1})?([0-9]{1,3})', $yearday, $byyearday_arr); + if ($byyearday_arr[1] == '-') { + $ydtime = mktime(0,0,0,12,31,$this_year); + $yearnum = $byyearday_arr[2] - 1; + $next_date_time = strtotime('-'.$yearnum.' days', $ydtime); + } else { + $ydtime = mktime(0,0,0,1,1,$this_year); + $yearnum = $byyearday_arr[2] - 1; + $next_date_time = strtotime('+'.$yearnum.' days', $ydtime); + } + $recur_data[] = $next_date_time; + } + } + break; + default: + // anything else we need to end the loop + $next_range_time = $end_range_time_tmp + 100; + $count_to = $count; + } + } else { + $interval = 1; + } + $next_range_time = strtotime('+'.$interval.' '.$freq_type, $next_range_time); + } else { + // end the loop because we aren't going to write this event anyway + $count_to = $count; + } + // use the same code to write the data instead of always changing it 5 times + if (isset($recur_data) && is_array($recur_data)) { + $recur_data_hour = @substr($start_time,0,2); + $recur_data_minute = @substr($start_time,2,2); + foreach($recur_data as $recur_data_time) { + $recur_data_year = date('Y', $recur_data_time); + $recur_data_month = date('m', $recur_data_time); + $recur_data_day = date('d', $recur_data_time); + $recur_data_date = $recur_data_year.$recur_data_month.$recur_data_day; + + if (($recur_data_time > $start_date_time) && ($recur_data_time <= $end_date_time) && ($count_to != $count) && !in_array($recur_data_date, $except_dates)) { + if (isset($allday_start) && $allday_start != '') { + $start_time2 = $recur_data_time; + $end_time2 = strtotime('+'.$diff_allday_days.' days', $recur_data_time); + while ($start_time2 < $end_time2) { + $start_date2 = date('Ymd', $start_time2); + $master_array[($start_date2)][('-1')][$uid] = array ('event_text' => $summary, 'description' => $description, 'location' => $location, 'organizer' => serialize($organizer), 'attendee' => serialize($attendee), 'calnumber' => $calnumber, 'calname' => $actual_calname, 'url' => $url, 'status' => $status, 'class' => $class, 'recur' => $recur ); + $start_time2 = strtotime('+1 day', $start_time2); + } + } else { + $start_unixtime_tmp = mktime($recur_data_hour,$recur_data_minute,0,$recur_data_month,$recur_data_day,$recur_data_year); + $end_unixtime_tmp = $start_unixtime_tmp + $length; + + if (($end_time >= $bleed_time) && ($bleed_check == '-1')) { + $start_tmp = strtotime(date('Ymd',$start_unixtime_tmp)); + $end_date_tmp = date('Ymd',$end_unixtime_tmp); + while ($start_tmp < $end_unixtime_tmp) { + $start_date_tmp = date('Ymd',$start_tmp); + if ($start_date_tmp == $recur_data_year.$recur_data_month.$recur_data_day) { + $time_tmp = $hour.$minute; + $start_time_tmp = $start_time; + } else { + $time_tmp = '0000'; + $start_time_tmp = '0000'; + } + if ($start_date_tmp == $end_date_tmp) { + $end_time_tmp = $end_time; + } else { + $end_time_tmp = '2400'; + $display_end_tmp = $end_time; + } + + // Let's double check the until to not write past it + $until_check = $start_date_tmp.$time_tmp.'00'; + if ($abs_until > $until_check) { + $master_array[$start_date_tmp][$time_tmp][$uid] = array ( + 'event_start' => $start_time_tmp, + 'event_end' => $end_time_tmp, + 'start_unixtime' => $start_unixtime_tmp, + 'end_unixtime' => $end_unixtime_tmp, + 'event_text' => $summary, + 'event_length' => $length, + 'event_overlap' => 0, + 'description' => $description, + 'status' => $status, + 'class' => $class, + 'spans_day' => true, + 'location' => $location, + 'organizer' => serialize($organizer), + 'attendee' => serialize($attendee), + 'calnumber' => $calnumber, + 'calname' => $actual_calname, + 'url' => $url, + 'recur' => $recur); + if (isset($display_end_tmp)){ + $master_array[$start_date_tmp][$time_tmp][$uid]['display_end'] = $display_end_tmp; + } + checkOverlap($start_date_tmp, $time_tmp, $uid, $master_array, $overlap_array); + } + $start_tmp = strtotime('+1 day',$start_tmp); + } + } else { + if ($bleed_check == '-1') { + $display_end_tmp = $end_time; + $end_time_tmp1 = '2400'; + + } + if (!isset($end_time_tmp1)) $end_time_tmp1 = $end_time; + + // Let's double check the until to not write past it + $until_check = $recur_data_date.$hour.$minute.'00'; + if ($abs_until > $until_check) { + $master_array[($recur_data_date)][($hour.$minute)][$uid] = array ( + 'event_start' => $start_time, + 'event_end' => $end_time_tmp1, + 'start_unixtime' => $start_unixtime_tmp, + 'end_unixtime' => $end_unixtime_tmp, + 'event_text' => $summary, + 'event_length' => $length, + 'event_overlap' => 0, + 'description' => $description, + 'status' => $status, + 'class' => $class, + 'spans_day' => false, + 'location' => $location, + 'organizer' => serialize($organizer), + 'attendee' => serialize($attendee), + 'calnumber' => $calnumber, + 'calname' => $actual_calname, + 'url' => $url, + 'recur' => $recur); + if (isset($display_end_tmp)){ + $master_array[($recur_data_date)][($hour.$minute)][$uid]['display_end'] = $display_end_tmp; + } + checkOverlap($recur_data_date, ($hour.$minute), $uid, $master_array, $overlap_array); + } + } + } + } + } + unset($recur_data); + } + } + } + } + } + } + + // This should remove any exdates that were missed. + // Added for version 0.9.5 modified in 2.22 remove anything that doesn't have an event_start + if (is_array($except_dates)) { + foreach ($except_dates as $key => $value) { + if (isset ($master_array[$value])){ + foreach ($master_array[$value] as $time => $value2){ + if (!isset($value2[$uid]['event_start'])){ + unset($master_array[$value][$time][$uid]); + } + } + } + } + } + + // Clear event data now that it's been saved. + unset($start_time, $start_time_tmp, $end_time, $end_time_tmp, $start_unixtime, $start_unixtime_tmp, $end_unixtime, $end_unixtime_tmp, $summary, $length, $description, $status, $class, $location, $organizer, $attendee); + + break; + case 'END:VTODO': + if ((!$vtodo_priority) && ($status == 'COMPLETED')) { + $vtodo_sort = 11; + } elseif (!$vtodo_priority) { + $vtodo_sort = 10; + } else { + $vtodo_sort = $vtodo_priority; + } + + // CLASS support + if (isset($class)) { + if ($class == 'PRIVATE') { + $summary = '**PRIVATE**'; + $description = '**PRIVATE**'; + } elseif ($class == 'CONFIDENTIAL') { + $summary = '**CONFIDENTIAL**'; + $description = '**CONFIDENTIAL**'; + } + } + + $master_array['-2']["$vtodo_sort"]["$uid"] = array ('start_date' => $start_date, 'start_time' => $start_time, 'vtodo_text' => $summary, 'due_date'=> $due_date, 'due_time'=> $due_time, 'completed_date' => $completed_date, 'completed_time' => $completed_time, 'priority' => $vtodo_priority, 'status' => $status, 'class' => $class, 'categories' => $vtodo_categories, 'description' => $description, 'calname' => $actual_calname); + unset ($start_date, $start_time, $due_date, $due_time, $completed_date, $completed_time, $vtodo_priority, $status, $class, $vtodo_categories, $summary, $description); + $vtodo_set = FALSE; + + break; + + case 'BEGIN:VTODO': + $vtodo_set = TRUE; + break; + case 'BEGIN:VALARM': + $valarm_set = TRUE; + break; + case 'END:VALARM': + $valarm_set = FALSE; + break; + + default: + + unset ($field, $data, $prop_pos, $property); + if (ereg ("([^:]+):(.*)", $line, $line)){ + $field = $line[1]; + $data = $line[2]; + + $property = $field; + $prop_pos = strpos($property,';'); + if ($prop_pos !== false) $property = substr($property,0,$prop_pos); + $property = strtoupper($property); + + switch ($property) { + + // Start VTODO Parsing + // + case 'DUE': + $datetime = extractDateTime($data, $property, $field, $tz_array); + $due_date = $datetime[1]; + $due_time = $datetime[2]; + break; + + case 'COMPLETED': + $datetime = extractDateTime($data, $property, $field, $tz_array); + $completed_date = $datetime[1]; + $completed_time = $datetime[2]; + break; + + case 'PRIORITY': + $vtodo_priority = "$data"; + break; + + case 'STATUS': + $status = "$data"; + break; + + case 'CLASS': + $class = "$data"; + break; + + case 'CATEGORIES': + $vtodo_categories = "$data"; + break; + // + // End VTODO Parsing + + case 'DTSTART': + $datetime = extractDateTime($data, $property, $field, $tz_array); + $start_unixtime = $datetime[0]; + $start_date = $datetime[1]; + $start_time = $datetime[2]; + $allday_start = $datetime[3]; + break; + + case 'DTEND': + $datetime = extractDateTime($data, $property, $field, $tz_array); + $end_unixtime = $datetime[0]; + $end_date = $datetime[1]; + $end_time = $datetime[2]; + $allday_end = $datetime[3]; + break; + + case 'EXDATE': + $data = split(",", $data); + foreach ($data as $exdata) { + $exdata = str_replace('T', '', $exdata); + $exdata = str_replace('Z', '', $exdata); + preg_match ('/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})/', $exdata, $regs); + $except_dates[] = $regs[1] . $regs[2] . $regs[3]; + // Added for Evolution, since they dont think they need to tell me which time to exclude. + if (($regs[4] == '') && ($start_time != '')) { + $except_times[] = $start_time; + } else { + $except_times[] = $regs[4] . $regs[5]; + } + } + break; + + case 'SUMMARY': + $data = str_replace("\\n", "<br />", $data); + $data = str_replace("\\t", " ", $data); + $data = str_replace("\\r", "<br />", $data); + $data = str_replace('$', '$', $data); + $data = stripslashes($data); + $data = htmlentities(urlencode($data)); + if ($valarm_set == FALSE) { + $summary = $data; + } else { + $valarm_summary = $data; + } + break; + + case 'DESCRIPTION': + $data = str_replace("\\n", "<br />", $data); + $data = str_replace("\\t", " ", $data); + $data = str_replace("\\r", "<br />", $data); + $data = str_replace('$', '$', $data); + $data = stripslashes($data); + $data = htmlentities(urlencode($data)); + if ($valarm_set == FALSE) { + $description = $data; + } else { + $valarm_description = $data; + } + break; + + case 'RECURRENCE-ID': + $parts = explode(';', $field); + foreach($parts as $part) { + $eachval = split('=',$part); + if ($eachval[0] == 'RECURRENCE-ID') { + // do nothing + } elseif ($eachval[0] == 'TZID') { + $recurrence_id['tzid'] = parse_tz($eachval[1]); + } elseif ($eachval[0] == 'RANGE') { + $recurrence_id['range'] = $eachval[1]; + } elseif ($eachval[0] == 'VALUE') { + $recurrence_id['value'] = $eachval[1]; + } else { + $recurrence_id[] = $eachval[1]; + } + } + unset($parts, $part, $eachval); + + $data = str_replace('T', '', $data); + $data = str_replace('Z', '', $data); + ereg ('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})', $data, $regs); + $recurrence_id['date'] = $regs[1] . $regs[2] . $regs[3]; + $recurrence_id['time'] = $regs[4] . $regs[5]; + + $recur_unixtime = mktime($regs[4], $regs[5], 0, $regs[2], $regs[3], $regs[1]); + + $dlst = date('I', $recur_unixtime); + $server_offset_tmp = chooseOffset($recur_unixtime, &$timezone, &$tz_array); + if (isset($recurrence_id['tzid'])) { + $tz_tmp = $recurrence_id['tzid']; + $offset_tmp = $tz_array[$tz_tmp][$dlst]; + } elseif (isset($calendar_tz)) { + $offset_tmp = $tz_array[$calendar_tz][$dlst]; + } else { + $offset_tmp = $server_offset_tmp; + } + $recur_unixtime = calcTime($offset_tmp, $server_offset_tmp, $recur_unixtime); + $recurrence_id['date'] = date('Ymd', $recur_unixtime); + $recurrence_id['time'] = date('Hi', $recur_unixtime); + $recurrence_d = date('Ymd', $recur_unixtime); + $recurrence_t = date('Hi', $recur_unixtime); + unset($server_offset_tmp); + break; + + case 'UID': + $uid = $data; + break; + case 'X-WR-CALNAME': + $actual_calname = $data; + $master_array['calendar_name'] = $actual_calname; + $cal_displaynames[$cal_key] = $actual_calname; #correct the default calname based on filename + break; + case 'X-WR-TIMEZONE': + $calendar_tz = parse_tz($data); + $master_array['calendar_tz'] = $calendar_tz; + break; + case 'DURATION': + if (($first_duration == TRUE) && (!stristr($field, '=DURATION'))) { + ereg ('^P([0-9]{1,2}[W])?([0-9]{1,2}[D])?([T]{0,1})?([0-9]{1,2}[H])?([0-9]{1,2}[M])?([0-9]{1,2}[S])?', $data, $duration); + $weeks = str_replace('W', '', $duration[1]); + $days = str_replace('D', '', $duration[2]); + $hours = str_replace('H', '', $duration[4]); + $minutes = str_replace('M', '', $duration[5]); + $seconds = str_replace('S', '', $duration[6]); + $the_duration = ($weeks * 60 * 60 * 24 * 7) + ($days * 60 * 60 * 24) + ($hours * 60 * 60) + ($minutes * 60) + ($seconds); + $first_duration = FALSE; + } + break; + case 'RRULE': + $data = str_replace ('RRULE:', '', $data); + $rrule = split (';', $data); + foreach ($rrule as $recur) { + ereg ('(.*)=(.*)', $recur, $regs); + $rrule_array[$regs[1]] = $regs[2]; + } + break; + case 'ATTENDEE': + $field = str_replace("ATTENDEE;CN=", "", $field); + $data = str_replace ("mailto:", "", $data); + $attendee[] = array ('name' => stripslashes($field), 'email' => stripslashes($data)); + break; + case 'ORGANIZER': + $field = str_replace("ORGANIZER;CN=", "", $field); + $data = str_replace ("mailto:", "", $data); + $organizer[] = array ('name' => stripslashes($field), 'email' => stripslashes($data)); + break; + case 'LOCATION': + $data = str_replace("\\n", "<br />", $data); + $data = str_replace("\\t", " ", $data); + $data = str_replace("\\r", "<br />", $data); + $data = stripslashes($data); + $location = $data; + break; + case 'URL': + $url = $data; + break; + } + } + } + } + return $master_array; +} + +?> \ No newline at end of file Property changes on: prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/lib/ical_parser.php ___________________________________________________________________ Name: svn:keywords + "Id Author URL Date Rev" Modified: prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/templates/verPorDiaSuccess.php =================================================================== --- prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/templates/verPorDiaSuccess.php 2007-06-12 20:24:25 UTC (rev 4744) +++ prosistem/alba/trunk/alba/apps/principal/modules/icalVisualizador/templates/verPorDiaSuccess.php 2007-06-13 18:45:53 UTC (rev 4745) @@ -121,7 +121,7 @@ <td rowspan="<?php echo $rowspan?>" width="<?php echo floor(460/($event['event_overlap']+1))?>" colspan="<?php echo floor($nbrGridCols / ($event['event_overlap']+1)) ?>" align="left" valign="top" class="eventbg2_1"> <div class="eventfont"> <div class="eventbg_1"><b><?php echo date("H:i A", $event['start_unixtime'])?></b> - <?php echo date("H:i A", $event['end_unixtime'])?></div> - <div class="padd"> + <div class="padd" style="width:<?php echo floor(460/($event['event_overlap']+1))?>px"> <a class="ps" title="<?php echo $event['event_text']?>" href="#" onclick="openEventWindow(0); return false;"><?php echo $event['event_text']?></a> </div> </div> @@ -131,12 +131,12 @@ if($j==0) { ?> - <td colspan="<?php echo $nbrGridCols?>" class="dayborder"> </td> + <!-- <td colspan="<?php echo $nbrGridCols?>" class="dayborder"> </td>--> </tr> <?php } else { ?> - <td colspan="<?php echo $nbrGridCols?>" class="dayborder<?php echo ($j%2==0)?'':'2'?>"> </td> +<!-- <td colspan="<?php echo $nbrGridCols?>" class="dayborder<?php echo ($j%2==0)?'':'2'?>"> </td>--> </tr> <? }
participants (1)
-
commits@pressenter.com.ar