/**
  *
  * @param <type> $account
  * @param <type> $settings
  * @return <type>
  */
 public function performSync()
 {
     $user_id = $this->_account->IdUser;
     $fnUserId = $this->_account->Email;
     $this->log("-----sync calendars for user_id={$user_id} fnUserId={$fnUserId}");
     $wmCalendarManager = new CalendarManager($user_id);
     $fnCalendarManager = new FunambolCalendarManager($user_id);
     if (!$wmCalendarManager->InitManager() || !$fnCalendarManager->InitManager()) {
         return false;
     }
     $wmCalendarManager->InitAccount($this->_account);
     // in minutes. with dayLightSavingTime adjustment
     // WARNING
     // this is different from contacts
     $accountOffset = $this->_settings->AllowUsersChangeTimeZone ? $this->_account->GetDefaultTimeOffset() : $this->_account->GetDefaultTimeOffset($this->_settings->DefaultTimeZone);
     // - (int)date('I')*60;
     // get full list of calendars from account
     $wmCalendars = $wmCalendarManager->GetCalendarsList(true, true);
     $funambolEventIds = array();
     $minCalendarId = NULL;
     foreach ($wmCalendars as $wmCalendar) {
         $wmEvents = $wmCalendar->GetValue('calendarEvents');
         //echo "<pre>";
         //var_dump( $wmEvents );
         //echo "</pre>";
         //continue;
         if ($minCalendarId == NULL) {
             $minCalendarId = $wmCalendar->GetValue('calendarId', 'int');
         }
         if ($wmCalendar->GetValue('calendarId', 'int') < $minCalendarId) {
             $minCalendarId = $wmCalendar->GetValue('calendarId', 'int');
         }
         foreach ($wmEvents as $wmEvent) {
             /*
             				if($wmEvent->IsEventRepeat() )
             				{
             					$internalRepeatForm = $wmEvent->GetInternalRepeatForm();
             					if(!is_null($internalRepeatForm)) {
             						echo "<br/>&nbsp;&nbsp;RepeatContainer";
             						echo "<br/>&nbsp;&nbsp;eventTimeFrom=".$internalRepeatForm->GetValue('eventTimeFrom');
             						echo "<br/>&nbsp;&nbsp;repeatPeriod=".$internalRepeatForm->GetValue('repeatPeriod');
             						echo "<br/>&nbsp;&nbsp;repeatOrder=".$internalRepeatForm->GetValue('repeatOrder');
             						echo "<br/>&nbsp;&nbsp;repeatNum=".$internalRepeatForm->GetValue('repeatNum');
             						echo "<br/>&nbsp;&nbsp;repeatUntil=".$internalRepeatForm->GetValue('repeatUntil');
             						echo "<br/>&nbsp;&nbsp;repeatWeekNumber=".$internalRepeatForm->GetValue('repeatWeekNumber');
             						echo "<br/>&nbsp;&nbsp;repeatEnd=".$internalRepeatForm->GetValue('repeatEnd');
             						echo "<br/>&nbsp;&nbsp;repeatSun=".$internalRepeatForm->GetValue('repeatSun');
             						echo "<br/>&nbsp;&nbsp;repeatMon=".$internalRepeatForm->GetValue('repeatMon');
             						echo "<br/>&nbsp;&nbsp;repeatTue=".$internalRepeatForm->GetValue('repeatTue');
             						echo "<br/>&nbsp;&nbsp;repeatWed=".$internalRepeatForm->GetValue('repeatWed');
             						echo "<br/>&nbsp;&nbsp;repeatThu=".$internalRepeatForm->GetValue('repeatThu');
             						echo "<br/>&nbsp;&nbsp;repeatFri=".$internalRepeatForm->GetValue('repeatFri');
             						echo "<br/>&nbsp;&nbsp;repeatSat=".$internalRepeatForm->GetValue('repeatSat');
             						echo "<br/>&nbsp;&nbsp;excluded=".$internalRepeatForm->GetValue('excluded');
             					}
             				}
             */
             if ($wmEvent->GetValue('FunambolEventId', 'int') == NULL) {
                 // new event in WM, push event to FN
                 // FIXME, calendar name
                 $fnEventContainer = $this->ConvertWMToFunambolEventContainer($fnUserId, "", $wmEvent, TRUE, $accountOffset);
                 $funambolEventId = $fnCalendarManager->ReplaceEvent($fnEventContainer);
                 $wmCalendarManager->SetEventFunambolId($wmEvent, $funambolEventId);
                 array_push($funambolEventIds, $funambolEventId);
                 $this->log("new event in WM. wmEventId=" . $wmEvent->GetValue('eventId') . " fnEventId={$funambolEventId}");
             } else {
                 // this event was already synchronized with FN
                 $fnEvent = $fnCalendarManager->GetEvent($wmEvent->GetValue('FunambolEventId', 'int'));
                 // if wmEvent is updated lately - overwrite it in FN
                 $this->log("known event in WM. wmEventId=" . $wmEvent->GetValue('eventId') . " fnEventId=" . $fnEvent->GetValue('id'));
                 // GMT modification date as 2000-12-31 23:59:59
                 $wmDateModified = $wmEvent->GetValue('eventLastModified');
                 // seconds from Epoch for this date
                 $wmTimestampModified = strtotime($wmDateModified);
                 // local server's timestamp - offset to get GMT as seconds from Epoch
                 $fnTimestampModified = $this->ConvertFNtoWMTimestamp($fnEvent->GetValue('last_update'), TRUE);
                 if ($wmTimestampModified == $fnTimestampModified) {
                     $this->log("known event -- unmodified");
                     array_push($funambolEventIds, $wmEvent->GetValue('FunambolEventId', 'int'));
                 } else {
                     if ($wmTimestampModified > $fnTimestampModified) {
                         // push event to FN
                         // FIXME, calendar name
                         $this->log("known event -- push from WM to FN");
                         $fnEventContainer = $this->ConvertWMToFunambolEventContainer($fnUserId, "", $wmEvent, TRUE, $accountOffset);
                         $fnCalendarManager->ReplaceEvent($fnEventContainer);
                         array_push($funambolEventIds, $wmEvent->GetValue('FunambolEventId', 'int'));
                     } else {
                         // TODO
                         $this->log("known event -- pull from FN to WM");
                         // the simplest way - delete event and create new one;
                         $wmCalendarManager->DeleteEvent($wmEvent, TRUE, TRUE);
                     }
                 }
             }
             // if(new or old event)
         }
         // foreach ($wmEvents)
     }
     // foreach( $wmCalendars )
     // $funambolEventIds contains all events that are in WM
     // pull data from FN which are not in WM already
     $fnCalendarManager->SetUserAccount($fnUserId);
     $this->log("Pulling events from FN to WM. funambolEventIds=" . join(',', $funambolEventIds));
     $fnEvents = $fnCalendarManager->GetEventsListExcluded($funambolEventIds);
     foreach ($fnEvents as $fnEvent) {
         $this->log("adding new event from FN to WM subj=" . $fnEvent->GetValue('subject') . " id=" . $fnEvent->GetValue('id'));
         $this->log("status of FN event:" . $fnEvent->GetValue('status'));
         $this->log("adding to calendar:" . $minCalendarId);
         $wmEvent = $this->ConvertFunambolToWMEventContainer($fnEvent, TRUE, $accountOffset);
         // FIXME, calendar id
         $wmEvent->SetValue('calendarId', $minCalendarId);
         $wmEvent->ConvertToRRule();
         //			echo "<pre>";
         //			var_dump($wmEvent);
         //			echo "</pre>";
         if ($fnEvent->GetValue('status') != FUNAMBOL_STATUS_DELETED) {
             $wmCalendarManager->CreateEvent($wmEvent);
         }
     }
     // foreach($fnEvents)
     return true;
 }