protected function buildData()
 {
     // ############# Build Array of dates
     $this->eventsDataByDay = array();
     //print "START ".$this->start->format('Y-m-d H:i:s')."<br>";
     //print "END ".$this->start->format('Y-m-d H:i:s')."<br>";
     $now = new \DateTime($this->start->format('Y-m-d H:i:s'), new \DateTimeZone('UTC'));
     $now->setTime(23, 59, 59);
     $this->eventsDataByDay[] = $this->getTemplateForDaysData($now, true);
     $oneDay = new \DateInterval('P1D');
     while ($now->getTimestamp() < $this->end->getTimestamp()) {
         $now->add($oneDay);
         $this->eventsDataByDay[] = $this->getTemplateForDaysData($now);
     }
     // ############# Get events
     $this->eventRepositoryBuilder->setAfter($this->start);
     $this->eventRepositoryBuilder->setBefore($this->end);
     $this->events = $this->eventRepositoryBuilder->fetchAll();
     foreach ($this->events as $event) {
         foreach ($this->eventsDataByDay as $k => $data) {
             $startAt = $event->getStartAt()->getTimestamp();
             if ($data['startTimestamp'] <= $startAt && $startAt <= $data['endTimestamp']) {
                 $this->eventsDataByDay[$k]['events'][] = $event;
             } else {
                 if ($startAt < $data['startTimestamp'] && $event->getEndAt()->getTimestamp() > $data['startTimestamp']) {
                     $this->eventsDataByDay[$k]['eventsContinuing'][] = $event;
                 }
             }
         }
     }
 }
 function getDataJson(Application $app)
 {
     $steps = 120;
     $venueRepo = new VenueRepository();
     $data = array('data' => array());
     if ($_POST['speed'] == '3600') {
         $interval = new \DateInterval("PT1H");
     } else {
         if ($_POST['speed'] == '21600') {
             $interval = new \DateInterval("PT6H");
         } else {
             $interval = new \DateInterval("PT1M");
         }
     }
     $start = new \DateTime("", new \DateTimeZone($app['currentTimeZone']));
     $start->setDate($_POST['year'], $_POST['month'], $_POST['day']);
     $start->setTime($_POST['hour'], $_POST['min'], 0);
     $time = clone $start;
     $end = clone $start;
     for ($i = 1; $i <= $steps; $i++) {
         $end->add($interval);
     }
     $erb = new EventRepositoryBuilder();
     $erb->setSite($app['currentSite']);
     $erb->setAfter($start);
     $erb->setBefore($end);
     $erb->setIncludeDeleted(false);
     $erb->setMustHaveLatLng(true);
     $events = $erb->fetchAll();
     $eventsStatus = array();
     for ($i = 1; $i <= $steps; $i++) {
         $thisData = array('year' => $time->format('Y'), 'month' => $time->format('n'), 'day' => $time->format('j'), 'hour' => $time->format('H'), 'min' => $time->format('i'), 'events' => array(), 'eventsContinuing' => array());
         foreach ($events as $event) {
             if (!isset($eventsStatus[$event->getId()])) {
                 if ($event->getStartAt()->getTimestamp() < $time->getTimestamp()) {
                     $eventsStatus[$event->getId()] = true;
                     $thisData['events'][$event->getSlug()] = array('slug' => $event->getSlug(), 'venue_slug' => $event->getVenue()->getSlug(), 'venue_lat' => $event->getVenue()->getLat(), 'venue_lng' => $event->getVenue()->getLng(), 'venue_title' => $event->getVenue()->getTitle(), 'event_title' => $event->getSummaryDisplay());
                 }
             } else {
                 if ($event->getEndAt()->getTimestamp() >= $time->getTimestamp()) {
                     $thisData['eventsContinuing'][$event->getSlug()] = true;
                 }
             }
         }
         $data['data'][] = $thisData;
         $time->add($interval);
     }
     $response = new Response(json_encode($data));
     $response->headers->set('Content-Type', 'application/json');
     return $response;
 }
 function getPossibleDuplicates()
 {
     /**
      * If no Start or End time on event then we aren't even going to try to look for dupes.
      * There would be to many options and not enought to search on.
      */
     if (!$this->event->getStartAt() || !$this->event->getEndAt()) {
         return array();
     }
     ## Get events
     $eventRepositoryBuilder = new EventRepositoryBuilder();
     $eventRepositoryBuilder->setSite($this->site);
     $eventRepositoryBuilder->setIncludeAreaInformation(true);
     $eventRepositoryBuilder->setIncludeDeleted(true);
     $eventRepositoryBuilder->setIncludeCancelled(true);
     $after = clone $this->event->getStartAt();
     $after->sub(new \DateInterval("PT4H"));
     $eventRepositoryBuilder->setAfter($after);
     $before = clone $this->event->getStartAt();
     $before->add(new \DateInterval("PT4H"));
     $eventRepositoryBuilder->setBefore($before);
     $events = $eventRepositoryBuilder->fetchAll();
     ## Score
     $eventsWithScore = array();
     foreach ($events as $event) {
         if (!in_array($event->getSlug(), $this->notTheseSlugs)) {
             $eventsWithScore[] = array('event' => $event, 'score' => $this->getScoreForConsideredEvent($event));
         }
     }
     ## sort
     $sortFunc = function ($a, $b) {
         if ($a['score'] == $b['score']) {
             return 0;
         } elseif ($a['score'] > $b['score']) {
             return 1;
         } elseif ($a['score'] < $b['score']) {
             return -1;
         }
     };
     usort($eventsWithScore, $sortFunc);
     ## Results
     $results = array();
     foreach ($eventsWithScore as $eventWithScore) {
         if (count($results) < $this->showEventsCount && $eventWithScore['score'] >= $this->showEventsThreshhold) {
             $results[] = $eventWithScore['event'];
         }
     }
     return $results;
 }