public function getFeedEvents($start_date, $end_date)
 {
     $start = sfDate::getInstance($start_date);
     // single day views don't pass end dates
     if ($end_date) {
         $end = sfDate::getInstance($end_date);
     } else {
         $end = $start;
     }
     $feeds = $this->Feeds();
     $feedevents = new ArrayList();
     foreach ($feeds as $feed) {
         $feedreader = new ICSReader($feed->URL);
         $events = $feedreader->getEvents();
         foreach ($events as $event) {
             // translate iCal schema into CalendarAnnouncement schema (datetime + title/content)
             $feedevent = new CalendarAnnouncement();
             $feedevent->Title = $event['SUMMARY'];
             if (isset($event['DESCRIPTION'])) {
                 $feedevent->Content = $event['DESCRIPTION'];
             }
             $startdatetime = $this->iCalDateToDateTime($event['DTSTART']);
             if (array_key_exists('DTEND', $event) && $event['DTEND'] != NULL) {
                 $enddatetime = $this->iCalDateToDateTime($event['DTEND']);
             } elseif (array_key_exists('DURATION', $event) && $event['DURATION'] != NULL) {
                 $enddatetime = $this->iCalDurationToEndTime($event['DTSTART'], $event['DURATION']);
             }
             if ($startdatetime->get() < $start->get() && $enddatetime->get() < $start->get() || $startdatetime->get() > $end->get() && $enddatetime->get() > $end->get()) {
                 // do nothing; dates outside range
             } else {
                 $feedevent->StartDate = $startdatetime->format('Y-m-d');
                 $feedevent->StartTime = $startdatetime->format('H:i:s');
                 $feedevent->EndDate = $enddatetime->format('Y-m-d');
                 $feedevent->EndTime = $enddatetime->format('H:i:s');
                 $feedevents->push($feedevent);
             }
         }
     }
     return $feedevents;
 }
 public function doSyncFromFeed($data, $form)
 {
     $feeds = $this->Feeds();
     foreach ($feeds as $feed) {
         $feedreader = new ICSReader($feed->URL);
         $events = $feedreader->getEvents();
         foreach ($events as $event) {
             // translate iCal schema into Match schema
             $uid = strtok($event['UID'], '@');
             if ($match = Match::get()->filter(array("UID" => $uid))->First()) {
                 $feedevent = $match;
             } else {
                 $feedevent = Match::create();
                 $feedevent->UID = $uid;
             }
             $feedevent->Title = $event['SUMMARY'];
             //Get opposition with some string fun
             $feedevent->Opposition = trim(str_replace(array("-", "Black Doris Rovers", "vs"), "", $event['SUMMARY']));
             if (preg_match('/Round/', $feedevent->Opposition)) {
                 $opp = explode(" ", $feedevent->Opposition);
                 $opp = array_slice($opp, 2);
                 $feedevent->Opposition = trim(implode(" ", $opp));
             }
             if (isset($event['DESCRIPTION']) && !empty($event['DESCRIPTION']) && $event['DESCRIPTION'] != " ") {
                 $scores = str_replace("Result\n", "", $event['DESCRIPTION']);
                 $scores = explode("-", $scores);
                 foreach ($scores as $score) {
                     $score = trim($score);
                     $bits = explode(" ", $score);
                     if (preg_match('/Black Doris Rovers/', $score)) {
                         $feedevent->BDRScore = end($bits);
                     } else {
                         $feedevent->OppositionScore = end($bits);
                     }
                 }
                 if (intval($feedevent->BDRScore) > intval($feedevent->OppositionScore)) {
                     $feedevent->Result = 'Win';
                 } elseif (intval($feedevent->BDRScore) < intval($feedevent->OppositionScore)) {
                     $feedevent->Result = 'Loss';
                 } else {
                     $feedevent->Result = 'Draw';
                 }
             } else {
                 $feedevent->BDRScore = NULL;
                 $feedevent->OppositionScore = NULL;
                 $feedevent->Result = NULL;
             }
             $startdatetime = $this->iCalDateToDateTime($event['DTSTART']);
             if (array_key_exists('DTEND', $event) && $event['DTEND'] != NULL) {
                 $enddatetime = $this->iCalDateToDateTime($event['DTEND']);
             } elseif (array_key_exists('DURATION', $event) && $event['DURATION'] != NULL) {
                 $enddatetime = $this->iCalDurationToEndTime($event['DTSTART'], $event['DURATION']);
             }
             $new = false;
             if ($feedevent->DateTimes()->Count() == 0) {
                 $cdt = CalendarDateTime::create();
                 $new = true;
             } else {
                 $cdt = $feedevent->DateTimes()->First();
             }
             $cdt->StartDate = $startdatetime->format('Y-m-d');
             $cdt->StartTime = $startdatetime->format('H:i:s');
             $cdt->EndDate = $enddatetime->format('Y-m-d');
             $cdt->EndTime = $enddatetime->format('H:i:s');
             if ($new == true) {
                 $feedevent->DateTimes()->add($cdt);
             } else {
                 $cdt->write();
             }
             $feedevent->ParentID = $this->ID;
             $feedevent->write();
             $feedevent->publish('Stage', 'Live');
         }
     }
     $form->sessionMessage('Sync Succeeded', 'good');
     $data = $this->data();
     $data->LastSyncDate = date("Y-m-d H:i:s");
     $data->write();
     $data->publish('Stage', 'Live');
     return $this->redirectBack();
 }