function findByExtCalUserId($user)
 {
     return ExternalCalendars::findAll(array('conditions' => array('`ext_cal_user_id` = ?', $user)));
 }
 function findByExtCalUserIdValue($user)
 {
     return ExternalCalendars::findOne(array('conditions' => array('`ext_cal_user_id` = ' . $user . ' AND `calendar_feng` = 1')));
 }
 /**
  * This function will return paginated result. Result is an array where first element is
  * array of returned object and second populated pagination object that can be used for
  * obtaining and rendering pagination data using various helpers.
  *
  * Items and pagination array vars are indexed with 0 for items and 1 for pagination
  * because you can't use associative indexing with list() construct
  *
  * @access public
  * @param array $arguments Query argumens (@see find()) Limit and offset are ignored!
  * @param integer $items_per_page Number of items per page
  * @param integer $current_page Current page number
  * @return array
  */
 function paginate($arguments = null, $items_per_page = 10, $current_page = 1)
 {
     if (isset($this) && instance_of($this, 'ExternalCalendars')) {
         return parent::paginate($arguments, $items_per_page, $current_page);
     } else {
         return ExternalCalendars::instance()->paginate($arguments, $items_per_page, $current_page);
         //$instance =& MailAccounts::instance();
         //return $instance->paginate($arguments, $items_per_page, $current_page);
     }
     // if
 }
 /**
  * Return manager instance
  *
  * @access protected
  * @param void
  * @return ExternalCalendars 
  */
 function manager()
 {
     if (!$this->manager instanceof ExternalCalendars) {
         $this->manager = ExternalCalendars::instance();
     }
     return $this->manager;
 }
 function created_event_google_calendar($object, $event)
 {
     require_once 'Zend/Loader.php';
     Zend_Loader::loadClass('Zend_Gdata');
     Zend_Loader::loadClass('Zend_Gdata_AuthSub');
     Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
     Zend_Loader::loadClass('Zend_Gdata_Calendar');
     $users = ExternalCalendarUsers::findByContactId();
     $calendar = ExternalCalendars::findById($event->getExtCalId());
     $user = $users->getAuthUser();
     $pass = $users->getAuthPass();
     $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
     $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
     $calendarUrl = 'http://www.google.com/calendar/feeds/' . $calendar->getCalendarUser() . '/private/full';
     $gdataCal = new Zend_Gdata_Calendar($client);
     $newEvent = $gdataCal->newEventEntry();
     $newEvent->title = $gdataCal->newTitle($event->getObjectName());
     $newEvent->content = $gdataCal->newContent($event->getDescription());
     $star_time = explode(" ", $event->getStart()->format("Y-m-d H:i:s"));
     $end_time = explode(" ", $event->getDuration()->format("Y-m-d H:i:s"));
     if ($event->getTypeId() == 2) {
         $when = $gdataCal->newWhen();
         $when->startTime = $star_time[0];
         $when->endTime = $end_time[0];
         $newEvent->when = array($when);
     } else {
         $when = $gdataCal->newWhen();
         $when->startTime = $star_time[0] . "T" . $star_time[1] . ".000-00:00";
         $when->endTime = $end_time[0] . "T" . $end_time[1] . ".000-00:00";
         $newEvent->when = array($when);
     }
     // insert event
     $createdEvent = $gdataCal->insertEvent($newEvent, $calendarUrl);
     $event_id = explode("/", $createdEvent->id->text);
     $special_id = end($event_id);
     $event->setSpecialID($special_id);
     $event->setExtCalId($calendar->getId());
     $event->save();
 }
        function import_google_calendar() {
                ajx_current("empty");
                $users = ExternalCalendarUsers::findByContactId();  
                if($users){
                    $calendars = ExternalCalendars::findByExtCalUserId($users->getId());

                    require_once 'Zend/Loader.php';

                    Zend_Loader::loadClass('Zend_Gdata');
                    Zend_Loader::loadClass('Zend_Gdata_AuthSub');
                    Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
                    Zend_Loader::loadClass('Zend_Gdata_Calendar');

                    $user = $users->getAuthUser();
                    $pass = $users->getAuthPass();
                    $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;

                    try
                    {
                            $client = Zend_Gdata_ClientLogin::getHttpClient($user,$pass,$service);                                                       
                            $gdataCal = new Zend_Gdata_Calendar($client);

                            //update or insert events for calendars                        
                            foreach ($calendars as $calendar){

                                //check the deleted calendars
                                $delete_calendar = false;
                                $calFeed = $gdataCal->getCalendarListFeed();        
                                foreach ($calFeed as $calF){
                                    $cal_src = explode("/",$calF->content->src);
                                    array_pop($cal_src);
                                    $calendar_visibility = end($cal_src);
                                    array_pop($cal_src);
                                    $calendar_user = end($cal_src); 

                                    if($calendar_user == $calendar->getCalendarUser()){
                                        $delete_calendar = true;
                                    }
                                }

                                if($delete_calendar){
                                    $calendar_user = $calendar->getCalendarUser();
                                    $calendar_visibility = $calendar->getCalendarVisibility();
                                    $start_sel = date('Y-m-d', strtotime('-1 week'));
                                    $end_sel = date('Y-m-d', strtotime('+2 year'));

                                    $query = $gdataCal->newEventQuery();
                                    $query->setUser($calendar_user);
                                    $query->setVisibility($calendar_visibility);
                                    $query->setSingleEvents(true);
                                    $query->setProjection('full');
                                    $query->setOrderby('starttime');
                                    $query->setSortOrder('ascending'); 
                                    $query->setStartMin($start_sel);
                                    $query->setStartMax($end_sel);
                                    $query->setMaxResults(50);
                                    // execute and get results
                                    $event_list = $gdataCal->getCalendarEventFeed($query);

                                    $array_events_google = array();
                                    foreach ($event_list as $event){                                        
                                        $event_id = explode("/",$event->id->text);
                                        $special_id = end($event_id); 
                                        $event_name = lang("untitle event");
                                        if($event->title->text != ""){
                                            $event_name = $event->title->text;
                                        }
                                        $array_events_google[] = $special_id;
                                        $new_event = ProjectEvents::findBySpecialId($special_id);
                                        if($new_event){
                                            if(strtotime(ProjectEvents::date_google_to_sql($event->updated)) > $new_event->getUpdateSync()->getTimestamp()){
                                                $start = strtotime(ProjectEvents::date_google_to_sql($event->when[0]->startTime));
                                                $fin = strtotime(ProjectEvents::date_google_to_sql($event->when[0]->endTime));
                                                if(($fin - $start) == 86400){
                                                    $new_event->setStart(date("Y-m-d H:i:s",$start));
                                                    $new_event->setDuration(date("Y-m-d H:i:s",$start));
                                                    $new_event->setTypeId(2);
                                                }elseif(($fin - $start) > 86400){                                                
                                                    $t_s = explode(' ', date("Y-m-d H:i:s",$start));
                                                    $t_f = explode(' ', date("Y-m-d H:i:s",$fin));

                                                    $date_s = new DateTimeValue(strtotime($t_s[0]."00:00:00") - logged_user()->getTimezone() * 3600);
                                                    $date_f = new DateTimeValue(strtotime($t_f[0]."23:59:59 -1 day") - logged_user()->getTimezone() * 3600);

                                                    $new_event->setStart(date("Y-m-d H:i:s",$date_s->getTimestamp()));
                                                    $new_event->setDuration(date("Y-m-d H:i:s",$date_f->getTimestamp()));
                                                    $new_event->setTypeId(2);
                                                }else{
                                                    $new_event->setStart(ProjectEvents::date_google_to_sql($event->when[0]->startTime));
                                                    $new_event->setDuration(ProjectEvents::date_google_to_sql($event->when[0]->endTime));
                                                }

                                                $new_event->setObjectName($event_name);
                                                $new_event->setDescription($event->content->text);
                                                $new_event->setUpdateSync(ProjectEvents::date_google_to_sql($event->updated));
                                                $new_event->setExtCalId($calendar->getId());
                                                $new_event->save(); 
                                            }
                                        }else{
                                            $new_event = new ProjectEvent();
                                            
                                            $start = strtotime(ProjectEvents::date_google_to_sql($event->when[0]->startTime));
                                            $fin = strtotime(ProjectEvents::date_google_to_sql($event->when[0]->endTime));
                                            if(($fin - $start) == 86400){
                                                $new_event->setStart(date("Y-m-d H:i:s",$start));
                                                $new_event->setDuration(date("Y-m-d H:i:s",$start));
                                                $new_event->setTypeId(2);
                                            }elseif(($fin - $start) > 86400){
                                                $t_s = explode(' ', date("Y-m-d H:i:s",$start));
                                                $t_f = explode(' ', date("Y-m-d H:i:s",$fin));
                                                
                                                $date_s = new DateTimeValue(strtotime($t_s[0]."00:00:00") - logged_user()->getTimezone() * 3600);
                                                $date_f = new DateTimeValue(strtotime($t_f[0]."23:59:59 -1 day") - logged_user()->getTimezone() * 3600);
                                                
                                                $new_event->setStart(date("Y-m-d H:i:s",$date_s->getTimestamp()));
                                                $new_event->setDuration(date("Y-m-d H:i:s",$date_f->getTimestamp()));
                                                $new_event->setTypeId(2);
                                            }else{
                                                $new_event->setStart(ProjectEvents::date_google_to_sql($event->when[0]->startTime));
                                                $new_event->setDuration(ProjectEvents::date_google_to_sql($event->when[0]->endTime));
                                                $new_event->setTypeId(1);
                                            }
                                            
                                            $new_event->setObjectName($event_name);
                                            $new_event->setDescription($event->content->text);
                                            $new_event->setSpecialID($special_id);
                                            $new_event->setUpdateSync(ProjectEvents::date_google_to_sql($event->updated));
                                            $new_event->setExtCalId($calendar->getId());                                            
                                            $new_event->save(); 
                                            
                                            $conditions = array('event_id' => $new_event->getId(), 'contact_id' => logged_user()->getId());
                                            //insert only if not exists 
                                            if (EventInvitations::findById($conditions) == null) { 
                                                $invitation = new EventInvitation();
                                                $invitation->setEventId($new_event->getId());
                                                $invitation->setContactId(logged_user()->getId());
                                                $invitation->setInvitationState(1);
                                                $invitation->save();
                                            }
                                            
                                            //insert only if not exists 
                                            if (ObjectSubscriptions::findBySubscriptions($new_event->getId()) == null) { 
                                                $subscription = new ObjectSubscription();
                                                $subscription->setObjectId($new_event->getId());
                                                $subscription->setContactId(logged_user()->getId());
                                                $subscription->save();
                                            }

                                            if($users->getRelatedTo()){
                                                $member = array();
                                                $member_ids = explode(",",$users->getRelatedTo());
                                                foreach ($member_ids as $member_id){
                                                    $member[] = $member_id;
                                                }
                                                $object_controller = new ObjectController();
                                                $object_controller->add_to_members($new_event, $member); 
                                            }else{
                                                $member_ids = array();
                                                $context = active_context();
                                                foreach ($context as $selection) {
                                                    if ($selection instanceof Member) $member_ids[] = $selection->getId();
                                                }		        
                                                $object_controller = new ObjectController();
                                                $object_controller->add_to_members($new_event, $member_ids); 
                                            }                                            
                                        }           
                                    }// foreach event list 

                                    //check the deleted events
                                    $events_delete = ProjectEvents::findByExtCalId($calendar->getId());
                                    if($events_delete){
                                        foreach($events_delete as $event_delete){  
                                            if(!in_array($event_delete->getSpecialID(), $array_events_google)){
                                                $event_delete->trash();

                                                $event_delete->setSpecialID("");
                                                $event_delete->setExtCalId(0);
                                                $event_delete->save();    
                                            }                                        
                                        }  
                                    }
                                }else{                
                                    $events = ProjectEvents::findByExtCalId($calendar->getId());
                                    if($calendar->delete()){
                                        if($events){
                                            foreach($events as $event){                            
                                                $event->trash();

                                                $event->setSpecialID("");
                                                $event->setExtCalId(0);
                                                $event->save();
                                            }  
                                        }
                                    }
                                }
                            }//foreach calendars
                    }
                    catch(Exception $e)
                    {
                    		Logger::log($e->getMessage());
                            flash_error(lang('could not connect to calendar'));
                            ajx_current("empty");
                    }
                }
	}
 function add()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $notAllowedMember = '';
     if (!ProjectEvent::canAdd(logged_user(), active_context(), $notAllowedMember)) {
         if (str_starts_with($notAllowedMember, '-- req dim --')) {
             flash_error(lang('must choose at least one member of', str_replace_first('-- req dim --', '', $notAllowedMember, $in)));
         } else {
             trim($notAllowedMember) == "" ? flash_error(lang('you must select where to keep', lang('the event'))) : flash_error(lang('no context permissions to add', lang("events"), $notAllowedMember));
         }
         ajx_current("empty");
         return;
     }
     $this->setTemplate('event');
     $event = new ProjectEvent();
     $event_data = array_var($_POST, 'event');
     $event_name = array_var($_GET, 'name');
     //if sent from pupup
     //var_dump($event_data) ;
     $month = isset($_GET['month']) ? $_GET['month'] : date('n', DateTimeValueLib::now()->getTimestamp() + logged_user()->getTimezone() * 3600);
     $day = isset($_GET['day']) ? $_GET['day'] : date('j', DateTimeValueLib::now()->getTimestamp() + logged_user()->getTimezone() * 3600);
     $year = isset($_GET['year']) ? $_GET['year'] : date('Y', DateTimeValueLib::now()->getTimestamp() + logged_user()->getTimezone() * 3600);
     $user_filter = isset($_GET['user_filter']) ? $_GET['user_filter'] : logged_user()->getId();
     if (!is_array($event_data)) {
         // set layout for modal form
         if (array_var($_REQUEST, 'modal')) {
             $this->setLayout("json");
             tpl_assign('modal', true);
         }
         // if data sent from quickadd popup (via get) we se it, else default
         if (isset($_GET['start_time'])) {
             $this->parseTime($_GET['start_time'], $hour, $minute);
         } else {
             $hour = isset($_GET['hour']) ? $_GET['hour'] : date('G', DateTimeValueLib::now()->getTimestamp() + logged_user()->getTimezone() * 3600);
             $minute = isset($_GET['minute']) ? $_GET['minute'] : round(date('i') / 15, 0) * 15;
             //0,15,30 and 45 min
         }
         if (!user_config_option('time_format_use_24')) {
             if ($hour >= 12) {
                 $pm = 1;
                 $hour = $hour - 12;
             } else {
                 $pm = 0;
             }
         }
         $event_data = array('month' => isset($_GET['month']) ? $_GET['month'] : date('n', DateTimeValueLib::now()->getTimestamp() + logged_user()->getTimezone() * 3600), 'year' => isset($_GET['year']) ? $_GET['year'] : date('Y', DateTimeValueLib::now()->getTimestamp() + logged_user()->getTimezone() * 3600), 'day' => isset($_GET['day']) ? $_GET['day'] : date('j', DateTimeValueLib::now()->getTimestamp() + logged_user()->getTimezone() * 3600), 'hour' => $hour, 'minute' => $minute, 'pm' => isset($pm) ? $pm : "", 'typeofevent' => isset($_GET['type_id']) ? $_GET['type_id'] : 1, 'name' => $event_name, 'durationhour' => isset($_GET['durationhour']) ? $_GET['durationhour'] : 1, 'durationmin' => isset($_GET['durationmin']) ? $_GET['durationmin'] : 0);
         // array
     }
     // if
     tpl_assign('event', $event);
     tpl_assign('event_data', $event_data);
     tpl_assign('event_related', false);
     if (is_array(array_var($_POST, 'event'))) {
         try {
             $data = $this->getData($event_data);
             $event->setFromAttributes($data);
             DB::beginWork();
             $event->save();
             $this->registerInvitations($data, $event);
             if (isset($data['confirmAttendance'])) {
                 $this->change_invitation_state($data['confirmAttendance'], $event->getId(), $user_filter);
             }
             if (array_var($_POST, 'members')) {
                 $member_ids = json_decode(array_var($_POST, 'members'));
             } else {
                 $member_ids = array();
                 $context = active_context();
                 foreach ($context as $selection) {
                     if ($selection instanceof Member) {
                         $member_ids[] = $selection->getId();
                     }
                 }
             }
             $object_controller = new ObjectController();
             $object_controller->add_to_members($event, $member_ids);
             $object_controller->add_subscribers($event);
             $object_controller->link_to_new_object($event);
             $object_controller->add_custom_properties($event);
             $object_controller->add_reminders($event);
             if (array_var($_POST, 'popup', false)) {
                 // create default reminder
                 $def = explode(",", user_config_option("reminders_events"));
                 $minutes = array_var($def, 2) * array_var($def, 1);
                 $reminder = new ObjectReminder();
                 $reminder->setMinutesBefore($minutes);
                 $reminder->setType(array_var($def, 0, 'reminder_email'));
                 $reminder->setContext("start");
                 $reminder->setObject($event);
                 $reminder->setUserId(0);
                 $date = $event->getStart();
                 if ($date instanceof DateTimeValue) {
                     $rdate = new DateTimeValue($date->getTimestamp() - $minutes * 60);
                     $reminder->setDate($rdate);
                 }
                 $reminder->save();
                 // subscribe or not the invited users
                 if (user_config_option('event_subscribe_invited')) {
                     $data['subscribe_invited'] = "checked";
                 }
                 // send or not the inivitations
                 if (user_config_option('event_send_invitations')) {
                     $data['send_notification'] = "checked";
                 }
             }
             $opt_rep_day = array();
             if (array_var($event_data, 'repeat_saturdays')) {
                 $opt_rep_day['saturday'] = true;
             } else {
                 $opt_rep_day['saturday'] = false;
             }
             if (array_var($event_data, 'repeat_sundays')) {
                 $opt_rep_day['sunday'] = true;
             } else {
                 $opt_rep_day['sunday'] = false;
             }
             if (array_var($_POST, 'popup', false)) {
                 $event->subscribeUser(logged_user());
                 ajx_current("reload");
             } else {
                 ajx_current("back");
             }
             DB::commit();
             //external calendar sync
             $ext_user = ExternalCalendarUsers::findByContactId();
             if ($ext_user instanceof ExternalCalendarUser && $ext_user->getSync() == 1) {
                 $calendar_feng = ExternalCalendars::findFengCalendarByExtCalUserIdValue($ext_user->getId());
                 $externalCalendarController = new ExternalCalendarController();
                 $externalCalendarController->sync_event_on_extern_calendar($event, $ext_user, $calendar_feng);
             }
             $is_silent = false;
             if (isset($data['send_notification']) && $data['send_notification']) {
                 $users_to_inv = array();
                 foreach ($data['users_to_invite'] as $us => $v) {
                     if ($us != logged_user()->getId()) {
                         $users_to_inv[] = Contacts::findById(array('id' => $us));
                     }
                 }
                 Notifier::notifEvent($event, $users_to_inv, 'new', logged_user());
                 $is_silent = true;
             }
             ApplicationLogs::createLog($event, ApplicationLogs::ACTION_ADD, false, $is_silent);
             flash_success(lang('success add event', clean($event->getObjectName())));
             ajx_add("overview-panel", "reload");
             if (array_var($_REQUEST, 'modal')) {
                 evt_add("reload current panel");
             }
         } catch (Exception $e) {
             DB::rollback();
             flash_error($e->getMessage());
             ajx_current("empty");
         }
         // try
     }
 }
 function export_google_calendar_for_user($user)
 {
     $service = $this->connect_with_google_calendar($user);
     if ($user->getSync() == 1) {
         $calendar_feng = ExternalCalendars::findFengCalendarByExtCalUserIdValue($user->getId());
         //get events starting from past 2 weeks
         $previous_week = strtotime("-2 week");
         $time_min = date(DATE_MYSQL, $previous_week);
         $events = ProjectEvents::findNoSync($user->getContactId(), $time_min, 100);
         $events_inv = ProjectEvents::findNoSyncInvitations($user->getContactId(), $time_min, 100);
         try {
             if ($calendar_feng instanceof ExternalCalendar) {
                 $events_and_inv = array_merge($events, $events_inv);
                 foreach ($events_and_inv as $event) {
                     $this->update_event_on_google_calendar($event, $calendar_feng, $user, $service);
                 }
                 //we ask for events in this calendar in order to prevent checking the uploaded events on the import
                 try {
                     $now = strtotime("now");
                     $time_min = date(DATE_RFC3339, $now);
                     $optParams['timeMin'] = $time_min;
                     $events = $service->events->listEvents($calendar_feng->getOriginalCalendarId(), $optParams);
                 } catch (Exception $e) {
                     Logger::log("Fail to get events from feng external calendar: " . $calendar->getId());
                     Logger::log($e->getMessage());
                 }
                 //update the calendar token
                 $nextSyncToken = $events->getNextSyncToken();
                 if ($nextSyncToken) {
                     $calendar_feng->setExternalCalendarPropertyValue("syncToken", $nextSyncToken);
                 }
             } else {
                 //create feng calendar on google if not exists and save it on feng
                 $instalation = explode("/", ROOT_URL);
                 $instalation_name = end($instalation);
                 $calendar_name = lang('feng calendar', $instalation_name);
                 $calendar_exists = false;
                 //check if calendar exists
                 try {
                     $calendarList = $service->calendarList->listCalendarList();
                     while (true) {
                         foreach ($calendarList->getItems() as $calendarListEntry) {
                             if ($calendarListEntry->getSummary() == $calendar_name) {
                                 $calendar_exists = true;
                                 $external_calendar = array('original_calendar_id' => $calendarListEntry->getId(), 'title' => $calendarListEntry->getSummary(), 'calendar_status' => 1);
                                 break;
                             }
                         }
                         $pageToken = $calendarList->getNextPageToken();
                         if ($pageToken) {
                             $optParams = array('pageToken' => $pageToken);
                             $calendarList = $service->calendarList->listCalendarList($optParams);
                         } else {
                             break;
                         }
                     }
                 } catch (Exception $e) {
                     Logger::log("Fail to get calendars list from google: " . $user->getContactId());
                     throw $e;
                 }
                 if (!$calendar_exists) {
                     $new_calendar = new Google_Service_Calendar_Calendar();
                     $new_calendar->setSummary($calendar_name);
                     //$calendar->setTimeZone('America/Los_Angeles');
                     $createdCalendar = $service->calendars->insert($new_calendar);
                     $external_calendar = array('original_calendar_id' => $createdCalendar->getId(), 'title' => $createdCalendar->getSummary(), 'calendar_status' => 1);
                 }
                 $calendar = new ExternalCalendar();
                 $calendar->setOriginalCalendarId($external_calendar['original_calendar_id']);
                 //$calendar->setCalendarVisibility($calendar_visibility);
                 $calendar->setCalendarName($external_calendar['title']);
                 $calendar->setExtCalUserId($user->getId());
                 $calendar->setCalendarFeng(1);
                 $calendar->setSync(1);
                 $calendar->save();
             }
             flash_success(lang('success add sync'));
             ajx_current("reload");
         } catch (Exception $e) {
             Logger::log($e->getMessage());
         }
     }
 }
 /**
 * Return manager instance
 *
 * @access protected
 * @param void
 * @return ExternalCalendars 
 */
 function manager() {
   if(!($this->manager instanceof ExternalCalendars)) $this->manager = ExternalCalendars::instance();
   return $this->manager;
 } // manager