/**
  * Add a single task to the database
  *
  * @param array Hash array with task properties (see header of this file)
  * @return mixed New event ID on success, False on error
  * @see tasklist_driver::create_task()
  */
 public function create_task($task)
 {
     $cal_id = $task['list'];
     if (!is_array($task['tags'])) {
         $task['tags'] = array(0 => $this->lists[$cal_id]['name']);
     }
     $task_id = parent::create_task($task);
     if ($task['isclone']) {
         return $task_id;
     }
     $task['_type'] = 'task';
     if ($task_id !== false && isset($this->sync_clients[$cal_id])) {
         if ($task['tags']) {
             $task['categories'] = $task['tags'];
         }
         if ($task['startdate']) {
             $time = $task['startdate'];
             if ($task['starttime']) {
                 $time .= ' ' . $task['starttime'] . ':00';
             }
             if (strtotime($time)) {
                 $task['start'] = new DateTime($time);
             }
         }
         if ($task['date']) {
             $time = $task['date'];
             if ($task['time']) {
                 $time .= ' ' . $task['time'] . ':00';
             }
             if (strtotime($time)) {
                 $task['due'] = new DateTime($time);
             }
         }
         if ($task['parent_id']) {
             $parent_task = parent::get_task(array('id' => $task['parent_id']));
             $temp = explode('-', $task['parent_id']);
             if (count($temp) > 1) {
                 $ts = end($temp);
             } else {
                 $ts = false;
             }
             $task['parent_id'] = $parent_task['uid'] . ($ts ? '-' . $ts : '');
         }
         $sync_client = $this->sync_clients[$cal_id];
         $task = $this->_save_preprocess($task);
         $props = $sync_client->create_event($task);
         if ($props === false) {
             self::debug_log("Unkown error while creating caldav task, undo creating local task \"{$task_id}\"!");
             $task['id'] = $task_id;
             parent::delete_task($task, true);
             return false;
         } else {
             self::debug_log("Successfully pushed task \"{$task_id}\" to caldav server.");
             $this->_set_caldav_props($task_id, self::OBJ_TYPE_VTODO, $props);
             // Trigger calendar sync to update ctags and etags.
             $this->_sync_calendar($cal_id);
             $this->_reload_list();
             return $task_id;
         }
     } else {
         $this->_reload_list();
         return $task_id ? $task_id : false;
     }
 }
 /**
  * Add a single event to the database
  *
  * @param array Hash array with event properties
  * @see calendar_driver::new_event()
  */
 public function new_event($event)
 {
     if ($event['_type'] == 'task') {
         if (!class_exists('tasklist_driver')) {
             require_once dirname(__FILE__) . '/../../../tasklist/drivers/tasklist_driver.php';
         }
         if (!class_exists('tasklist_database_driver')) {
             require_once dirname(__FILE__) . '/../../../tasklist/drivers/database/tasklist_database_driver.php';
         }
         $tasks = new tasklist_database_driver($this->cal);
         $event['list'] = $event['calendar'];
         return $tasks->create_task($event);
     }
     if (!$this->validate($event)) {
         return false;
     }
     if (!empty($this->calendars)) {
         if ($event['calendar'] && !$this->calendars[$event['calendar']]) {
             return false;
         }
         if (!$event['calendar']) {
             $event['calendar'] = reset(array_keys($this->calendars));
         }
         $event['sequence'] = 0;
         $event = $this->_save_preprocess($event);
         $now = gmdate(self::DB_DATE_FORMAT);
         $this->rc->db->query(sprintf("INSERT INTO " . $this->_get_table($this->db_events) . "\n         (calendar_id, created, changed, uid, %s, %s, duration, tzname, all_day, recurrence, title, description, location, categories, url, free_busy, priority, sensitivity, attendees, alarms, notifyat)\n         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", $this->rc->db->quote_identifier('start'), $this->rc->db->quote_identifier('end')), $event['calendar'], $now, $now, strval($event['uid']), $event['allday'] ? $event['start']->format(self::DB_DATE_FORMAT_ALLDAY) : $event['start']->format(self::DB_DATE_FORMAT), $event['allday'] ? $event['end']->format(self::DB_DATE_FORMAT_ALLDAY) : $event['end']->format(self::DB_DATE_FORMAT), $event['duration'], $event['allday'] ? 'UTC' : ($event['tzname'] ? $event['tzname'] : $this->cal->timezone->getName()), intval($event['all_day']), $event['_recurrence'], strval($event['title']), strval($event['description']), strval($event['location']), join(',', (array) $event['categories']), strval($event['url']), intval($event['free_busy']), intval($event['priority']), intval($event['sensitivity']), $event['attendees'], $event['alarms'], $event['notifyat']);
         $event_id = $this->rc->db->insert_id($this->_get_table($this->db_events));
         if ($event_id) {
             $event['id'] = $event_id;
             // add attachments
             if (!empty($event['attachments'])) {
                 foreach ($event['attachments'] as $attachment) {
                     $this->add_attachment($attachment, $event_id);
                     unset($attachment);
                 }
             }
             $this->_update_recurrences($event);
         }
         return $event_id;
     }
     return false;
 }