/**
  * Returns all events for the given range, tag and considers the active project
  *
  * @param DateTimeValue $date
  * @param String $tags
  * @return unknown
  */
 static function getRangeProjectEvents(DateTimeValue $start_date, DateTimeValue $end_date, $user_filter = null, $inv_state = null)
 {
     $start_year = date("Y", mktime(0, 0, 1, $start_date->getMonth(), $start_date->getDay(), $start_date->getYear()));
     $start_month = date("m", mktime(0, 0, 1, $start_date->getMonth(), $start_date->getDay(), $start_date->getYear()));
     $start_day = date("d", mktime(0, 0, 1, $start_date->getMonth(), $start_date->getDay(), $start_date->getYear()));
     $end_year = date("Y", mktime(0, 0, 1, $end_date->getMonth(), $end_date->getDay(), $end_date->getYear()));
     $end_month = date("m", mktime(0, 0, 1, $end_date->getMonth(), $end_date->getDay(), $end_date->getYear()));
     $end_day = date("d", mktime(0, 0, 1, $end_date->getMonth(), $end_date->getDay(), $end_date->getYear()));
     if (!is_numeric($start_day) or !is_numeric($start_month) or !is_numeric($start_year) or !is_numeric($end_day) or !is_numeric($end_month) or !is_numeric($end_year)) {
         return NULL;
     }
     $user = null;
     if ($user_filter > 0) {
         $user = Contacts::findById($user_filter);
     }
     if ($user_filter != -1 && !$user instanceof Contact) {
         $user = logged_user();
     }
     $invited = "";
     if ($user instanceof Contact) {
         $invited = " AND o.`id` IN (SELECT `event_id` FROM `" . TABLE_PREFIX . "event_invitations` WHERE `contact_id` = " . $user->getId() . ")";
     }
     $tz_hm = "'" . floor(logged_user()->getTimezone()) . ":" . abs(logged_user()->getTimezone()) % 1 * 60 . "'";
     $s_date = new DateTimeValue($start_date->getTimestamp() - logged_user()->getTimezone() * 3600);
     $e_date = new DateTimeValue($end_date->getTimestamp() - logged_user()->getTimezone() * 3600);
     $e_date->add("d", 1);
     $start_date_str = $s_date->format("Y-m-d H:i:s");
     $end_date_str = $e_date->format("Y-m-d H:i:s");
     $first_d = $start_day;
     while ($first_d > 7) {
         $first_d -= 7;
     }
     $week_of_first_day = date("W", mktime(0, 0, 0, $start_month, $first_d, $start_year));
     $conditions = "\r\n\t\t\tAND (type_id=2 OR type_id=1 AND `duration` > `start`)\r\n\t\t\tAND \r\n\t\t\t(\r\n\t\t\t  (\r\n\t\t\t\t(\r\n\t\t\t\t\t`repeat_h` = 0\r\n\t\t\t\t\tAND `duration` >= '{$start_date_str}' \r\n\t\t\t\t\tAND `start` < '{$end_date_str}' \r\n\t\t\t\t) \r\n\t\t\t\tOR \r\n\t\t\t\t(\r\n\t\t\t\t\toriginal_event_id = 0\r\n\t\t\t\t\tAND\r\n\t\t\t\t\t`repeat_h` = 0 \r\n\t\t\t\t\tAND\r\n\t\t\t\t\tDATE(`start`) < '{$end_date_str}'\r\n\t\t\t\t\tAND\r\n\t\t\t\t\t(\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\tDATE_ADD(`start`, INTERVAL (`repeat_num`-1)*`repeat_d` DAY) >= '{$start_date_str}' \r\n\t\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t\trepeat_forever = 1\r\n\t\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t\trepeat_end >= '{$start_year}-{$start_month}-{$start_day}'\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\tDATE_ADD(`start`, INTERVAL (`repeat_num`-1)*`repeat_m` MONTH) >= '{$start_date_str}' \r\n\t\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t\trepeat_forever = 1\r\n\t\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t\trepeat_end >= '{$start_year}-{$start_month}-{$start_day}'\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\tDATE_ADD(`start`, INTERVAL (`repeat_num`-1)*`repeat_y` YEAR) >= '{$start_date_str}' \r\n\t\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t\trepeat_forever = 1\r\n\t\t\t\t\t\t\tOR\r\n\t\t\t\t\t\t\trepeat_end >= '{$start_year}-{$start_month}-{$start_day}'\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t)\t\t\r\n\t\t\t\t)\r\n\t\t\t\tOR\r\n\t\t\t\t(\r\n\t\t\t\t\toriginal_event_id = 0\r\n\t\t\t\t\tAND\r\n\t\t\t\t\tDATE(`start`) <= '{$end_date_str}'\r\n\t\t\t\t\tAND\r\n\t\t\t\t\t`repeat_h` = 1 \t\t\t\t\t\r\n\t\t\t\t\tAND\r\n\t\t\t\t\tMOD( ABS(PERIOD_DIFF(DATE_FORMAT(`start`, '%Y%m'), DATE_FORMAT('{$start_date_str}', '%Y%m'))), `repeat_mjump`) = 0\t\t\t\t\t\r\n\t\t\t\t)\r\n\t\t\t  )\r\n\t\t\t  {$invited}\r\n\t\t\t)";
     $result_events = self::instance()->listing(array("order" => 'start', "order_dir" => 'ASC', "extra_conditions" => $conditions))->objects;
     // Find invitations for events and logged user
     if (!($user_filter == null && $inv_state == null) && $user_filter != -1) {
         ProjectEvents::addInvitations($result_events, $user->getId());
         foreach ($result_events as $k => $event) {
             $inv = $event->getInvitations();
             if (!is_array($inv)) {
                 if ($inv == null || trim($inv_state) != '-1' && !strstr($inv_state, '' . $inv->getInvitationState()) && $inv->getContactId() == logged_user()->getId()) {
                     unset($result_events[$k]);
                 }
             } else {
                 if (count($inv) > 0) {
                     foreach ($inv as $key => $v) {
                         if ($v == null || trim($inv_state) != '-1' && !strstr($inv_state, '' . $v->getInvitationState()) && $v->getContactId() == logged_user()->getId()) {
                             unset($result_events[$k]);
                             break;
                         }
                     }
                 } else {
                     unset($result_events[$k]);
                 }
             }
         }
     }
     return $result_events;
 }
 /**
  * Reaturn all calendar Events
  *
  * @param Project $project
  * @return array
  */
 static function getAllEventsByProject($project = null, $archived = false, $inc_sub = true, $user = null)
 {
     if ($project instanceof Project) {
         if ($inc_sub) {
             $pids = $project->getAllSubWorkspacesQuery(true);
         } else {
             $pids = $project->getId();
         }
         $wsstring = " AND " . self::getWorkspaceString($pids);
     } else {
         $wsstring = "";
     }
     if ($user instanceof User) {
         $permissions = " AND " . permissions_sql_for_listings(self::instance(), ACCESS_LEVEL_READ, $user);
     } else {
         $permissions = "";
     }
     if ($archived) {
         $archived_cond = " `archived_by_id` <> 0";
     } else {
         $archived_cond = " `archived_by_id` = 0";
     }
     $cond_str = $archived_cond . $wsstring . $permissions;
     $result_events = self::findAll(array('conditions' => array($cond_str)));
     // findAll
     // Find invitations for events and logged user
     ProjectEvents::addInvitations($result_events, $user instanceof User ? $user->getId() : 0);
     return $result_events;
 }
 /**
  * Returns all events for the given range, tag and considers the active project
  *
  * @param DateTimeValue $date
  * @param String $tags
  * @return unknown
  */
 static function getRangeProjectEvents(DateTimeValue $start_date, DateTimeValue $end_date, $tags = '', $project = null, $archived = false)
 {
     $start_year = date("Y", mktime(0, 0, 1, $start_date->getMonth(), $start_date->getDay(), $start_date->getYear()));
     $start_month = date("m", mktime(0, 0, 1, $start_date->getMonth(), $start_date->getDay(), $start_date->getYear()));
     $start_day = date("d", mktime(0, 0, 1, $start_date->getMonth(), $start_date->getDay(), $start_date->getYear()));
     $end_year = date("Y", mktime(0, 0, 1, $end_date->getMonth(), $end_date->getDay(), $end_date->getYear()));
     $end_month = date("m", mktime(0, 0, 1, $end_date->getMonth(), $end_date->getDay(), $end_date->getYear()));
     $end_day = date("d", mktime(0, 0, 1, $end_date->getMonth(), $end_date->getDay(), $end_date->getYear()));
     if (!is_numeric($start_day) or !is_numeric($start_month) or !is_numeric($start_year) or !is_numeric($end_day) or !is_numeric($end_month) or !is_numeric($end_year)) {
         return NULL;
     }
     $invited = " AND `id` IN (SELECT `event_id` FROM `" . TABLE_PREFIX . "event_invitations` WHERE `contact_id` = " . logged_user()->getId() . ")";
     $tz_hm = "'" . floor(logged_user()->getTimezone()) . ":" . abs(logged_user()->getTimezone()) % 1 * 60 . "'";
     $s_date = new DateTimeValue($start_date->getTimestamp() - logged_user()->getTimezone() * 3600);
     $e_date = new DateTimeValue($end_date->getTimestamp() - logged_user()->getTimezone() * 3600);
     $e_date->add("d", 1);
     $start_date_str = $s_date->format("Y-m-d H:i:s");
     $end_date_str = $e_date->format("Y-m-d H:i:s");
     $first_d = $start_day;
     while ($first_d > 7) {
         $first_d -= 7;
     }
     $week_of_first_day = date("W", mktime(0, 0, 0, $start_month, $first_d, $start_year));
     $conditions = "\tAND ((\n\t\t\t\t(\n\t\t\t\t\t`repeat_h` = 0 \n\t\t\t\t\tAND `duration` >= '{$start_date_str}' \n\t\t\t\t\tAND `start` < '{$end_date_str}' \n\t\t\t\t) \n\t\t\t\tOR \n\t\t\t\t(\n\t\t\t\t\t`repeat_h` = 0 \n\t\t\t\t\tAND\n\t\t\t\t\tDATE(`start`) < '{$end_date_str}'\n\t\t\t\t\tAND\n\t\t\t\t\t(\t\t\t\t\t\t\t\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tDATE_ADD(`start`, INTERVAL (`repeat_num`-1)*`repeat_d` DAY) >= '{$start_date_str}' \n\t\t\t\t\t\t\tOR\n                                        repeat_forever = 1\n\t\t\t\t\t\t\tOR\n\t\t\t\t\t\t\trepeat_end >= '{$start_year}-{$start_month}-{$start_day}'\n\t\t\t\t)\n\t\t\t\tOR\n\t\t\t\t(\n\t\t\t\t\t\t\tDATE_ADD(`start`, INTERVAL (`repeat_num`-1)*`repeat_m` MONTH) >= '{$start_date_str}' \n\t\t\t\t\t\t\tOR\n\t\t\t\t\t\t\trepeat_forever = 1\n\t\t\t\t\t\t\tOR\n\t\t\t\t\t\t\trepeat_end >= '{$start_year}-{$start_month}-{$start_day}'\n\t\t\t\t\t\t)\n\t\t\t\t\t\tOR\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tDATE_ADD(`start`, INTERVAL (`repeat_num`-1)*`repeat_y` YEAR) >= '{$start_date_str}' \n\t\t\t\t\t\t\tOR\n\t\t\t\t\t\t\trepeat_forever = 1\n\t\t\t\t\t\t\tOR\n\t\t\t\t\t\t\trepeat_end >= '{$start_year}-{$start_month}-{$start_day}'\n\t\t\t\t\t\t)\n\t\t\t\t\t)\t\t\n\t\t\t\t)\n\t\t\t\tOR\n\t\t\t\t(\n\t\t\t\t\tDATE(`start`) <= '{$start_date_str}'\n\t\t\t\t\tAND\n\t\t\t\t\t`repeat_h` = 1 \n\t\t\t\t\tAND\n\t\t\t\t\t`repeat_dow` = DAYOFWEEK('{$start_date_str}') \n\t\t\t\t\tAND\n\t\t\t\t\t`repeat_wnum` + {$week_of_first_day} - 1 = WEEK('{$start_date_str}', 3) \n\t\t\t\t\tAND\n\t\t\t\t\tMOD( ABS(PERIOD_DIFF(DATE_FORMAT(`start`, '%Y%m'), DATE_FORMAT('{$start_date_str}', '%Y%m'))), `repeat_mjump`) = 0\t\t\t\t\t\n\t\t\t\t)\t\t\t\t\n\t\t\t)\n\t\t\t{$invited}\n\t\t)";
     //$result_events = self::getContentObjects(active_context(), ObjectTypes::findById(self::instance()->getObjectTypeId()), '`start`', 'ASC', $conditions, null, false, false, $start, $limit);
     $result_events = self::instance()->listing(array("order" => 'start', "order_dir" => 'ASC', "extra_conditions" => $conditions, "start" => $start, "limit" => $limit))->objects;
     // Find invitations for events and logged user
     ProjectEvents::addInvitations($result_events);
     return $result_events;
 }