]> git.mxchange.org Git - friendica.git/blobdiff - include/event.php
Opps ...
[friendica.git] / include / event.php
index 73e61f25cf3949a20585aafc9dff55a172be6da2..44261b36910a7b81bba9acfc389cfc6437552c9e 100644 (file)
@@ -10,7 +10,7 @@ require_once('include/datetime.php');
 
 function format_event_html($ev, $simple = false) {
 
-       if(! ((is_array($ev)) && count($ev)))
+       if (! ((is_array($ev)) && count($ev)))
                return '';
 
        $bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
@@ -32,10 +32,10 @@ function format_event_html($ev, $simple = false) {
 
                $o .= "<h4>".t('Starts:')."</h4><p>".$event_start."</p>";
 
-               if(! $ev['nofinish'])
+               if (! $ev['nofinish'])
                        $o .= "<h4>".t('Finishes:')."</h4><p>".$event_end."</p>";
 
-               if(strlen($ev['location']))
+               if (strlen($ev['location']))
                        $o .= "<h4>".t('Location:')."</h4><p>".$ev['location']."</p>";
 
                return $o;
@@ -53,13 +53,13 @@ function format_event_html($ev, $simple = false) {
                . '" >'.$event_start
                . '</abbr></p>' . "\r\n";
 
-       if(! $ev['nofinish'])
+       if (! $ev['nofinish'])
                $o .= '<p class="event-end" >' . t('Finishes:') . ' <abbr class="dtend" title="'
                        . datetime_convert('UTC','UTC',$ev['finish'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
                        . '" >'.$event_end
                        . '</abbr></p>'  . "\r\n";
 
-       if(strlen($ev['location'])){
+       if (strlen($ev['location'])){
                $o .= '<p class="event-location"> ' . t('Location:') . ' <span class="location">'
                        . bbcode($ev['location'])
                        . '</span></p>' . "\r\n";
@@ -92,26 +92,26 @@ function parse_event($h) {
                logger('parse_event: parse error: ' . $e);
        }
 
-       if(! $dom)
+       if (! $dom)
                return $ret;
 
        $items = $dom->getElementsByTagName('*');
 
-       foreach($items as $item) {
-               if(attribute_contains($item->getAttribute('class'), 'vevent')) {
+       foreach ($items as $item) {
+               if (attribute_contains($item->getAttribute('class'), 'vevent')) {
                        $level2 = $item->getElementsByTagName('*');
-                       foreach($level2 as $x) {
-                               if(attribute_contains($x->getAttribute('class'),'dtstart') && $x->getAttribute('title')) {
+                       foreach ($level2 as $x) {
+                               if (attribute_contains($x->getAttribute('class'),'dtstart') && $x->getAttribute('title')) {
                                        $ret['start'] = $x->getAttribute('title');
-                                       if(! strpos($ret['start'],'Z'))
+                                       if (! strpos($ret['start'],'Z'))
                                                $ret['adjust'] = true;
                                }
-                               if(attribute_contains($x->getAttribute('class'),'dtend') && $x->getAttribute('title'))
+                               if (attribute_contains($x->getAttribute('class'),'dtend') && $x->getAttribute('title'))
                                        $ret['finish'] = $x->getAttribute('title');
 
-                               if(attribute_contains($x->getAttribute('class'),'description'))
+                               if (attribute_contains($x->getAttribute('class'),'description'))
                                        $ret['desc'] = $x->textContent;
-                               if(attribute_contains($x->getAttribute('class'),'location'))
+                               if (attribute_contains($x->getAttribute('class'),'location'))
                                        $ret['location'] = $x->textContent;
                        }
                }
@@ -119,23 +119,23 @@ function parse_event($h) {
 
        // sanitise
 
-       if((x($ret,'desc')) && ((strpos($ret['desc'],'<') !== false) || (strpos($ret['desc'],'>') !== false))) {
+       if ((x($ret,'desc')) && ((strpos($ret['desc'],'<') !== false) || (strpos($ret['desc'],'>') !== false))) {
                $config = HTMLPurifier_Config::createDefault();
                $config->set('Cache.DefinitionImpl', null);
                $purifier = new HTMLPurifier($config);
                $ret['desc'] = html2bbcode($purifier->purify($ret['desc']));
        }
 
-       if((x($ret,'location')) && ((strpos($ret['location'],'<') !== false) || (strpos($ret['location'],'>') !== false))) {
+       if ((x($ret,'location')) && ((strpos($ret['location'],'<') !== false) || (strpos($ret['location'],'>') !== false))) {
                $config = HTMLPurifier_Config::createDefault();
                $config->set('Cache.DefinitionImpl', null);
                $purifier = new HTMLPurifier($config);
                $ret['location'] = html2bbcode($purifier->purify($ret['location']));
        }
 
-       if(x($ret,'start'))
+       if (x($ret,'start'))
                $ret['start'] = datetime_convert('UTC','UTC',$ret['start']);
-       if(x($ret,'finish'))
+       if (x($ret,'finish'))
                $ret['finish'] = datetime_convert('UTC','UTC',$ret['finish']);
 
        return $ret;
@@ -146,22 +146,22 @@ function format_event_bbcode($ev) {
 
        $o = '';
 
-       if($ev['summary'])
+       if ($ev['summary'])
                $o .= '[event-summary]' . $ev['summary'] . '[/event-summary]';
 
-       if($ev['desc'])
+       if ($ev['desc'])
                $o .= '[event-description]' . $ev['desc'] . '[/event-description]';
 
-       if($ev['start'])
+       if ($ev['start'])
                $o .= '[event-start]' . $ev['start'] . '[/event-start]';
 
-       if(($ev['finish']) && (! $ev['nofinish']))
+       if (($ev['finish']) && (! $ev['nofinish']))
                $o .= '[event-finish]' . $ev['finish'] . '[/event-finish]';
 
-       if($ev['location'])
+       if ($ev['location'])
                $o .= '[event-location]' . $ev['location'] . '[/event-location]';
 
-       if($ev['adjust'])
+       if ($ev['adjust'])
                $o .= '[event-adjust]' . $ev['adjust'] . '[/event-adjust]';
 
 
@@ -172,7 +172,7 @@ function format_event_bbcode($ev) {
 function bbtovcal($s) {
        $o = '';
        $ev = bbtoevent($s);
-       if($ev['desc'])
+       if ($ev['desc'])
                $o = format_event_html($ev);
        return $o;
 }
@@ -183,22 +183,22 @@ function bbtoevent($s) {
        $ev = array();
 
        $match = '';
-       if(preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is",$s,$match))
+       if (preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is",$s,$match))
                $ev['summary'] = $match[1];
        $match = '';
-       if(preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is",$s,$match))
+       if (preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is",$s,$match))
                $ev['desc'] = $match[1];
        $match = '';
-       if(preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is",$s,$match))
+       if (preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is",$s,$match))
                $ev['start'] = $match[1];
        $match = '';
-       if(preg_match("/\[event\-finish\](.*?)\[\/event\-finish\]/is",$s,$match))
+       if (preg_match("/\[event\-finish\](.*?)\[\/event\-finish\]/is",$s,$match))
                $ev['finish'] = $match[1];
        $match = '';
-       if(preg_match("/\[event\-location\](.*?)\[\/event\-location\]/is",$s,$match))
+       if (preg_match("/\[event\-location\](.*?)\[\/event\-location\]/is",$s,$match))
                $ev['location'] = $match[1];
        $match = '';
-       if(preg_match("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is",$s,$match))
+       if (preg_match("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is",$s,$match))
                $ev['adjust'] = $match[1];
        $ev['nofinish'] = (((x($ev, 'start') && $ev['start']) && (!x($ev, 'finish') || !$ev['finish'])) ? 1 : 0);
        return $ev;
@@ -206,7 +206,7 @@ function bbtoevent($s) {
 }
 
 
-function sort_by_date(App &$a) {
+function sort_by_date($a) {
 
        usort($a,'ev_compare');
        return $a;
@@ -218,7 +218,7 @@ function ev_compare($a,$b) {
        $date_a = (($a['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$a['start']) : $a['start']);
        $date_b = (($b['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$b['start']) : $b['start']);
 
-       if($date_a === $date_b)
+       if ($date_a === $date_b)
                return strcasecmp($a['desc'],$b['desc']);
 
        return strcmp($date_a,$date_b);
@@ -246,8 +246,9 @@ function event_store($arr) {
        $arr['cid']     = ((intval($arr['cid'])) ? intval($arr['cid']) : 0);
        $arr['uri']     = (x($arr,'uri') ? $arr['uri'] : item_new_uri($a->get_hostname(),$arr['uid']));
        $arr['private'] = ((x($arr,'private')) ? intval($arr['private']) : 0);
+       $arr['guid']    = get_guid(32);
 
-       if($arr['cid'])
+       if ($arr['cid'])
                $c = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
                        intval($arr['cid']),
                        intval($arr['uid'])
@@ -257,13 +258,13 @@ function event_store($arr) {
                        intval($arr['uid'])
                );
 
-       if(count($c))
+       if (count($c))
                $contact = $c[0];
 
 
        // Existing event being modified
 
-       if($arr['id']) {
+       if ($arr['id']) {
 
                // has the event actually changed?
 
@@ -271,7 +272,7 @@ function event_store($arr) {
                        intval($arr['id']),
                        intval($arr['uid'])
                );
-               if((! dbm::is_result($r)) || ($r[0]['edited'] === $arr['edited'])) {
+               if ((! dbm::is_result($r)) || ($r[0]['edited'] === $arr['edited'])) {
 
                        // Nothing has changed. Grab the item id to return.
 
@@ -333,16 +334,16 @@ function event_store($arr) {
                call_hooks("event_updated", $arr['id']);
 
                return $item_id;
-       }
-       else {
+       } else {
 
                // New event. Store it.
 
-               $r = q("INSERT INTO `event` ( `uid`,`cid`,`uri`,`created`,`edited`,`start`,`finish`,`summary`, `desc`,`location`,`type`,
+               $r = q("INSERT INTO `event` (`uid`,`cid`,`guid`,`uri`,`created`,`edited`,`start`,`finish`,`summary`, `desc`,`location`,`type`,
                        `adjust`,`nofinish`,`allow_cid`,`allow_gid`,`deny_cid`,`deny_gid`)
-                       VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",
+                       VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",
                        intval($arr['uid']),
                        intval($arr['cid']),
+                       dbesc($arr['guid']),
                        dbesc($arr['uri']),
                        dbesc($arr['created']),
                        dbesc($arr['edited']),
@@ -411,7 +412,7 @@ function event_store($arr) {
                //      $plink = App::get_baseurl() . '/display/' . $r[0]['nickname'] . '/' . $item_id;
 
 
-               if($item_id) {
+               if ($item_id) {
                        //q("UPDATE `item` SET `plink` = '%s', `event-id` = %d  WHERE `uid` = %d AND `id` = %d",
                        //      dbesc($plink),
                        //      intval($event['id']),
@@ -492,9 +493,29 @@ function get_event_strings() {
        return $i18n;
 }
 
+/// @todo We should replace this with a separate update function if there is some time left
+/**
+ * @brief Removes duplicated birthday events
+ *
+ * @param array $dates Array of possibly duplicated events
+ * @return array Cleaned events
+ */
+function event_remove_duplicates($dates) {
+       $dates2 = array();
+
+       foreach ($dates AS $date) {
+               if ($date['type'] == 'birthday') {
+                       $dates2[$date['uid']."-".$date['cid']."-".$date['start']] = $date;
+               } else {
+                       $dates2[] = $date;
+               }
+       }
+       return $dates2;
+}
+
 /**
  * @brief Get an event by its event ID
- * 
+ *
  * @param type $owner_uid The User ID of the owner of the event
  * @param type $event_params An assoziative array with
  *     int 'event_id' => The ID of the event in the event table
@@ -503,46 +524,46 @@ function get_event_strings() {
  */
 function event_by_id($owner_uid = 0, $event_params, $sql_extra = '') {
        // ownly allow events if there is a valid owner_id
-       if($owner_uid == 0)
+       if ($owner_uid == 0)
                return;
 
        // query for the event by event id
        $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
                        `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event`
-               STRAIGHT_JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid`
+               LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid`
                WHERE `event`.`uid` = %d AND `event`.`id` = %d $sql_extra",
                intval($owner_uid),
                intval($event_params["event_id"])
        );
 
-       if (dbm::is_result($r))
-               return $r;
-
+       if (dbm::is_result($r)) {
+               return event_remove_duplicates($r);
+       }
 }
 
 /**
  * @brief Get all events in a specific timeframe
- * 
+ *
  * @param int $owner_uid The User ID of the owner of the events
  * @param array $event_params An assoziative array with
- *     int 'ignored' => 
+ *     int 'ignored' =>
  *     string 'start' => Start time of the timeframe
  *     string 'finish' => Finish time of the timeframe
- *     string 'adjust_start' => 
  *     string 'adjust_start' =>
- *     
+ *     string 'adjust_start' =>
+ *
  * @param string $sql_extra Additional sql conditions (e.g. permission request)
  * @return array Query results
  */
 function events_by_date($owner_uid = 0, $event_params, $sql_extra = '') {
        // ownly allow events if there is a valid owner_id
-       if($owner_uid == 0)
+       if ($owner_uid == 0)
                return;
 
        // query for the event by date
        $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
                                `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event`
-                       STRAIGHT_JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid`
+                       LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid`
                        WHERE `event`.`uid` = %d AND event.ignore = %d
                        AND ((`adjust` = 0 AND (`finish` >= '%s' OR (nofinish AND start >= '%s')) AND `start` <= '%s')
                        OR  (`adjust` = 1 AND (`finish` >= '%s' OR (nofinish AND start >= '%s')) AND `start` <= '%s'))
@@ -557,23 +578,24 @@ function events_by_date($owner_uid = 0, $event_params, $sql_extra = '') {
                        dbesc($event_params["adjust_finish"])
        );
 
-       if (dbm::is_result($r))
-               return $r;
+       if (dbm::is_result($r)) {
+               return event_remove_duplicates($r);
+       }
 }
 
 /**
  * @brief Convert an array query results in an arry which could be used by the events template
- * 
+ *
  * @param array $arr Event query array
  * @return array Event array for the template
  */
-function process_events ($arr) {
+function process_events($arr) {
        $events=array();
 
        $last_date = '';
        $fmt = t('l, F j');
        if (count($arr)) {
-               foreach($arr as $rr) {
+               foreach ($arr as $rr) {
 
                        $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
                        $d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
@@ -592,7 +614,7 @@ function process_events ($arr) {
                        $last_date = $d;
                        $edit = ((! $rr['cid']) ? array(App::get_baseurl().'/events/event/'.$rr['id'],t('Edit event'),'','') : null);
                        $title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
-                       if(! $title) {
+                       if (! $title) {
                                list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
                                $title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
                        }
@@ -622,15 +644,15 @@ function process_events ($arr) {
 
 /**
  * @brief Format event to export format (ical/csv)
- * 
+ *
  * @param array $events Query result for events
  * @param string $format The output format (ical/csv)
  * @param string $timezone The timezone of the user (not implemented yet)
- * 
+ *
  * @return string Content according to selected export format
  */
 function event_format_export ($events, $format = 'ical', $timezone) {
-       if(! ((is_array($events)) && count($events)))
+       if (! ((is_array($events)) && count($events)))
                return;
 
        switch ($format) {
@@ -640,7 +662,7 @@ function event_format_export ($events, $format = 'ical', $timezone) {
                        $o = '"Subject", "Start Date", "Start Time", "Description", "End Date", "End Time", "Location"' . PHP_EOL;
 
                        foreach ($events as $event) {
-                       /// @todo the time / date entries don't include any information about the 
+                       /// @todo the time / date entries don't include any information about the
                        // timezone the event is scheduled in :-/
                                $tmp1 = strtotime($event['start']);
                                $tmp2 = strtotime($event['finish']);
@@ -649,7 +671,7 @@ function event_format_export ($events, $format = 'ical', $timezone) {
                                $o .= '"'.$event['summary'].'", "'.strftime($date_format, $tmp1) .
                                        '", "'.strftime($time_format, $tmp1).'", "'.$event['desc'] .
                                        '", "'.strftime($date_format, $tmp2) .
-                                       '", "'.strftime($time_format, $tmp2) . 
+                                       '", "'.strftime($time_format, $tmp2) .
                                        '", "'.$event['location'].'"' . PHP_EOL;
                        }
                        break;
@@ -671,7 +693,7 @@ function event_format_export ($events, $format = 'ical', $timezone) {
                        foreach ($events as $event) {
                                if ($event['adjust'] == 1) {
                                        $UTC = 'Z';
-                               } else { 
+                               } else {
                                        $UTC = '';
                                }
                                $o .= 'BEGIN:VEVENT' . PHP_EOL;
@@ -715,28 +737,30 @@ function event_format_export ($events, $format = 'ical', $timezone) {
 
 /**
  * @brief Get all events for a user ID
- * 
+ *
  *    The query for events is done permission sensitive
  *    If the user is the owner of the calendar he/she
  *    will get all of his/her available events.
  *    If the user is only a visitor only the public events will
  *    be available
- * 
+ *
  * @param int $uid The user ID
  * @param int $sql_extra Additional sql conditions for permission
- * 
+ *
  * @return array Query results
  */
 function events_by_uid($uid = 0, $sql_extra = '') {
-       if($uid == 0)
+       if ($uid == 0) {
                return;
+       }
 
        // The permission condition if no condition was transmitted
-       if($sql_extra == '')
+       if ($sql_extra == '') {
                $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' ";
+       }
 
-       //  does the user who requests happen to be the owner of the events 
-       //  requested? then show all of your events, otherwise only those that 
+       //  does the user who requests happen to be the owner of the events
+       //  requested? then show all of your events, otherwise only those that
        //  don't have limitations set in allow_cid and allow_gid
        if (local_user() == $uid) {
                $r = q("SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location`, `nofinish`
@@ -750,12 +774,13 @@ function events_by_uid($uid = 0, $sql_extra = '') {
                );
        }
 
-       if (dbm::is_result($r))
+       if (dbm::is_result($r)) {
                return $r;
+       }
 }
 
 /**
- * 
+ *
  * @param int $uid The user ID
  * @param string $format Output format (ical/csv)
  * @return array With the results
@@ -763,7 +788,7 @@ function events_by_uid($uid = 0, $sql_extra = '') {
  *     string 'format' => The output format
  *     string 'extension' => The file extension of the output format
  *     string 'content' => The formatted output content
- * 
+ *
  * @todo Respect authenticated users with events_by_uid()
  */
 function event_export($uid, $format = 'ical') {
@@ -773,20 +798,23 @@ function event_export($uid, $format = 'ical') {
        // we are allowed to show events
        // get the timezone the user is in
        $r = q("SELECT `timezone` FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid));
-       if (dbm::is_result($r))
+       if (dbm::is_result($r)) {
                $timezone = $r[0]['timezone'];
+       }
 
        // get all events which are owned by a uid (respects permissions);
        $events = events_by_uid($uid);
 
        //  we have the events that are available for the requestor
        //  now format the output according to the requested format
-       if(count($events))
+       if (count($events)) {
                $res = event_format_export($events, $format, $timezone);
+       }
 
        // If there are results the precess was successfull
-       if(x($res))
+       if (x($res)) {
                $process = true;
+       }
 
        // get the file extension for the format
        switch ($format) {
@@ -814,7 +842,7 @@ function event_export($uid, $format = 'ical') {
 
 /**
  * @brief Get the events widget
- * 
+ *
  * @return string Formated html of the evens widget
  */
 function widget_events() {
@@ -829,22 +857,25 @@ function widget_events() {
        // The permission testing is a little bit tricky because we have to respect many cases
 
        // It's not the private events page (we don't get the $owner_uid for /events)
-       if(! local_user() && ! $owner_uid)
+       if (! local_user() && ! $owner_uid) {
                return;
+       }
 
        // Cal logged in user (test permission at foreign profile page)
        // If the $owner uid is available we know it is part of one of the profile pages (like /cal)
-       // So we have to test if if it's the own profile page of the logged in user 
+       // So we have to test if if it's the own profile page of the logged in user
        // or a foreign one. For foreign profile pages we need to check if the feature
        // for exporting the cal is enabled (otherwise the widget would appear for logged in users
        // on foreigen profile pages even if the widget is disabled)
-       if(intval($owner_uid) && local_user() !== $owner_uid && ! feature_enabled($owner_uid, "export_calendar")) 
+       if (intval($owner_uid) && local_user() !== $owner_uid && ! feature_enabled($owner_uid, "export_calendar")) {
                return;
+       }
 
        // If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and
        // export feature isn't enabled
-       if(intval($owner_uid) && ! local_user() && ! feature_enabled($owner_uid, "export_calendar"))
+       if (intval($owner_uid) && ! local_user() && ! feature_enabled($owner_uid, "export_calendar")) {
                return;
+       }
 
        return replace_macros(get_markup_template("events_aside.tpl"), array(
                '$etitle' => t("Export"),