/**
  * Delete specific message
  *
  * @access public
  * @param void
  * @return null
  */
 function delete()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current('empty');
         return;
     }
     ajx_current("empty");
     $message = ProjectMessages::findById(get_id());
     if (!$message instanceof ProjectMessage) {
         flash_error(lang('message dnx'));
         ajx_current("empty");
         return;
     }
     // if
     if (!$message->canDelete(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     try {
         DB::beginWork();
         $message->trash();
         DB::commit();
         ApplicationLogs::createLog($message, ApplicationLogs::ACTION_TRASH);
         flash_success(lang('success deleted message', $message->getObjectName()));
         if (array_var($_POST, 'popup', false)) {
             ajx_current("reload");
         } else {
             ajx_current("back");
         }
         ajx_add("overview-panel", "reload");
     } catch (Exception $e) {
         DB::rollback();
         flash_error(lang('error delete message'));
         ajx_current("empty");
     }
     // try
 }
 /**
  * Edit logged user profile. 
  * Called with different POST format from "administration/users/edit user profile " and from "profile/edit my profile" 
  *
  * @access public
  * @param void
  * @return null
  */
 function edit_profile()
 {
     ajx_set_panel("");
     $user = Contacts::findById(get_id());
     if (!($user instanceof Contact && $user->isUser()) || $user->getDisabled()) {
         flash_error(lang('user dnx'));
         ajx_current("empty");
         return;
     }
     // if
     $company = $user->getCompany();
     /*if(!($company instanceof Contact)) {
     			flash_error(lang('company dnx'));
     			ajx_current("empty");
     			return;
     		} // if
     		*/
     if (!$user->canUpdateProfile(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     $redirect_to = array_var($_GET, 'redirect_to');
     if (trim($redirect_to) == '' || !is_valid_url($redirect_to)) {
         $redirect_to = $user->getCardUserUrl();
     }
     // if
     tpl_assign('redirect_to', null);
     $user_data = array_var($_POST, 'user');
     if (!is_array($user_data)) {
         $user_data = array('username' => $user->getUsername(), 'email' => $user->getEmailAddress(), 'display_name' => $user->getObjectName(), 'timezone' => $user->getTimezone(), 'company_id' => $user->getCompanyId(), 'is_admin' => $user->isAdministrator(), 'type' => $user->getUserType());
         // array
     }
     // if
     tpl_assign('user', $user);
     tpl_assign('company', $company);
     tpl_assign('user_data', $user_data);
     tpl_assign('billing_categories', BillingCategories::findAll());
     // Permission Groups
     $groups = PermissionGroups::getNonPersonalSameLevelPermissionsGroups('`parent_id`,`id` ASC');
     tpl_assign('groups', $groups);
     $roles = SystemPermissions::getAllRolesPermissions();
     tpl_assign('roles', $roles);
     $tabs = TabPanelPermissions::getAllRolesModules();
     tpl_assign('tabs_allowed', $tabs);
     // Submit user
     if (is_array(array_var($_POST, 'user'))) {
         $company_id = array_var($user_data, 'company_id');
         if ($company_id && !Contacts::findById($company_id) instanceof Contact) {
             ajx_current("empty");
             flash_error(lang("company dnx"));
             return;
         }
         try {
             DB::beginWork();
             $user->setUserType(array_var($user_data, 'type'));
             $user->setTimezone(array_var($user_data, 'timezone'));
             $user->setDefaultBillingId(array_var($user_data, 'default_billing_id'));
             $user->setUpdatedOn(DateTimeValueLib::now());
             if (logged_user()->isAdministrator()) {
                 //if ($user->getId() != 2) { // System admin cannot change it's company (from Feng 2.0 onwards administrador has id = 2)
                 //	$user->setCompanyId(array_var($user_data,'company_id'));
                 //}
                 $user->setUsername(array_var($user_data, 'username'));
             } else {
                 $user->setCompanyId(array_var($user_data, 'company_id'));
             }
             if (!isset($_POST['sys_perm'])) {
                 $rol_permissions = SystemPermissions::getRolePermissions(array_var($user_data, 'type'));
                 $_POST['sys_perm'] = array();
                 $not_rol_permissions = SystemPermissions::getNotRolePermissions(array_var($user_data, 'type'));
                 foreach ($not_rol_permissions as $npr) {
                     $_POST['sys_perm'][$npr] = 0;
                 }
                 foreach ($rol_permissions as $pr) {
                     $_POST['sys_perm'][$pr] = 1;
                 }
             }
             if (!isset($_POST['mod_perm'])) {
                 $tabs_permissions = TabPanelPermissions::getRoleModules(array_var($user_data, 'type'));
                 $_POST['mod_perm'] = array();
                 foreach ($tabs_permissions as $pr) {
                     $_POST['mod_perm'][$pr] = 1;
                 }
             }
             $user->save();
             $autotimezone = array_var($user_data, 'autodetect_time_zone', null);
             if ($autotimezone !== null) {
                 set_user_config_option('autodetect_time_zone', $autotimezone, $user->getId());
             }
             $object_controller = new ObjectController();
             $object_controller->add_custom_properties($user);
             $ret = null;
             Hook::fire('after_edit_profile', $user, $ret);
             $pg_id = $user->getPermissionGroupId();
             save_permissions($pg_id, $user->isGuest());
             DB::commit();
             flash_success(lang('success update profile'));
             ajx_current("back");
             ajx_add("overview-panel", "reload");
         } catch (Exception $e) {
             DB::rollback();
             ajx_current("empty");
             flash_error($e->getMessage());
         }
         // try
     }
     // if
 }
 function set_getting_started_step()
 {
     ajx_current("empty");
     if (!logged_user()->isAdminGroup()) {
         ajx_current("empty");
         return;
     }
     $step = array_var($_REQUEST, 'step');
     $current_step = config_option('getting_started_step');
     if ($current_step < $step) {
         set_config_option('getting_started_step', $step);
         // change tab title and icon
         if ($step >= 99) {
             DB::execute("UPDATE " . TABLE_PREFIX . "tab_panels SET title='settings', icon_cls='ico-administration' WHERE id='more-panel';");
         }
     }
     if (array_var($_REQUEST, 'reload_panel')) {
         ajx_add('more-panel', 'reload');
     }
 }
 /**
  * Resolve action to perform
  *
  * @param string $action
  * @param array $attributes
  * @return string $message
  */
 private function resolveAction($action, $attributes)
 {
     $resultMessage = "";
     $resultCode = 0;
     switch ($action) {
         case "delete":
             $err = 0;
             $succ = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email) && $email->canDelete(logged_user())) {
                             if ($email->getState() == 2) {
                                 // we are deleting a draft email
                                 $emails_in_conversation = array($email);
                             } else {
                                 if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                     $emails_in_conversation = MailContents::getMailsFromConversation($email);
                                 } else {
                                     $emails_in_conversation = array($email);
                                 }
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canDelete(logged_user())) {
                                     try {
                                         $email->trash();
                                         ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_TRASH);
                                         $succ++;
                                     } catch (Exception $e) {
                                         $err++;
                                     }
                                 } else {
                                     $err++;
                                 }
                             }
                         } else {
                             $err++;
                         }
                         break;
                     default:
                         $err++;
                         break;
                 }
                 // switch
             }
             // for
             if ($err > 0) {
                 $resultCode = 2;
                 $resultMessage = lang("error delete objects", $err) . "<br />" . ($succ > 0 ? lang("success delete objects", $succ) : "");
             } else {
                 $resultMessage = lang("success delete objects", $succ);
             }
             ajx_add("overview-panel", "reload");
             break;
         case "tag":
             $tag = $attributes["tag"];
             if (!trim($tag)) {
                 break;
             }
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email)) {
                             if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                 $emails_in_conversation = MailContents::getMailsFromConversation($email);
                             } else {
                                 $emails_in_conversation = array($email);
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canEdit(logged_user())) {
                                     Tags::addObjectTag($tag, $email);
                                     ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_TAG, false, null, true, $tag);
                                 }
                             }
                             $resultMessage = lang("success tag objects", '');
                         }
                         break;
                     default:
                         $resultMessage = lang("Unimplemented type: '" . $type . "'");
                         // if
                         $resultCode = 2;
                         break;
                 }
                 // switch
             }
             // for
             break;
         case "untag":
             $tag = $attributes["tag"];
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email)) {
                             if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                 $emails_in_conversation = MailContents::getMailsFromConversation($email);
                             } else {
                                 $emails_in_conversation = array($email);
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canEdit(logged_user())) {
                                     if ($tag != '') {
                                         $email->deleteTag($tag);
                                     } else {
                                         $email->clearTags();
                                     }
                                 }
                             }
                             //ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_TAG,false,null,true,$tag);
                             $resultMessage = lang("success untag objects", '');
                         }
                         break;
                     default:
                         $resultMessage = lang("Unimplemented type: '" . $type . "'");
                         // if
                         $resultCode = 2;
                         break;
                 }
                 // switch
             }
             // for
             break;
         case "unclassify":
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email) && !$email->isDeleted() && $email->canEdit(logged_user())) {
                             $this->do_unclassify($email);
                             ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_TAG, false, null, true, $tag);
                             $resultMessage = lang("success unclassify emails", count($attributes["ids"]));
                         }
                         break;
                     default:
                         $resultMessage = lang("Unimplemented type: '" . $type . "'");
                         // if
                         $resultCode = 2;
                         break;
                 }
                 // switch
             }
             // for
             break;
         case "move":
             $wsid = $attributes["moveTo"];
             $destination = Projects::findById($wsid);
             if (!$destination instanceof Project) {
                 $resultMessage = lang('project dnx');
                 $resultCode = 1;
             } else {
                 if (!can_add(logged_user(), $destination, 'MailContents')) {
                     $resultMessage = lang('no access permissions');
                     $resultCode = 1;
                 } else {
                     $count = 0;
                     for ($i = 0; $i < count($attributes["ids"]); $i++) {
                         $id = $attributes["ids"][$i];
                         $type = $attributes["types"][$i];
                         switch ($type) {
                             case "email":
                                 $email = MailContents::findById($id);
                                 if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                     $conversation = MailContents::getMailsFromConversation($email);
                                 } else {
                                     $conversation = array($email);
                                 }
                                 foreach ($conversation as $conv_email) {
                                     $this->addEmailToWorkspace($conv_email->getId(), $destination, array_var($attributes, "mantainWs", true));
                                     if (array_var($attributes, 'classify_atts') && $conv_email->getHasAttachments()) {
                                         MailUtilities::parseMail($conv_email->getContent(), $decoded, $parsedEmail, $warnings);
                                         $classification_data = array();
                                         for ($j = 0; $j < count(array_var($parsedEmail, "Attachments", array())); $j++) {
                                             $classification_data["att_" . $j] = true;
                                         }
                                         $tags = implode(",", $conv_email->getTagNames());
                                         $this->classifyFile($classification_data, $conv_email, $parsedEmail, array($destination), array_var($attributes, "mantainWs", true), $tags);
                                     }
                                 }
                                 $count++;
                                 break;
                             default:
                                 $resultMessage = lang("Unimplemented type: '" . $type . "'");
                                 // if
                                 $resultCode = 2;
                                 break;
                         }
                         // switch
                     }
                     // for
                     $resultMessage = lang("success move objects", $count);
                     $resultCode = 0;
                 }
             }
             break;
         case "checkmail":
             $resultCheck = MailController::checkmail();
             $resultMessage = $resultCheck[1];
             // if
             $resultCode = $resultCheck[0];
             ajx_add("overview-panel", "reload");
             break;
         case "markAsRead":
         case "markAsUnRead":
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email)) {
                             if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                 $emails_in_conversation = MailContents::getMailsFromConversation($email);
                             } else {
                                 $emails_in_conversation = array($email);
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canEdit(logged_user())) {
                                     $email->setIsRead(logged_user()->getId(), $action == 'markAsRead');
                                 }
                             }
                         }
                         break;
                     default:
                         $resultMessage = lang("Unimplemented type: '" . $type . "'");
                         // if
                         $resultCode = 2;
                         break;
                 }
                 // switch
             }
             // for
             ajx_add("overview-panel", "reload");
             break;
         case "archive":
             $err = 0;
             $succ = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email)) {
                             if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                 $emails_in_conversation = MailContents::getMailsFromConversation($email);
                             } else {
                                 $emails_in_conversation = array($email);
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canEdit(logged_user())) {
                                     try {
                                         $email->archive(null);
                                         ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_ARCHIVE);
                                         $succ++;
                                     } catch (Exception $e) {
                                         $err++;
                                     }
                                 }
                             }
                         } else {
                             $err++;
                         }
                         break;
                     default:
                         $err++;
                         break;
                 }
                 // switch
             }
             // for
             if ($err > 0) {
                 $resultCode = 2;
                 $resultMessage = lang("error archive objects", $err) . "<br />" . ($succ > 0 ? lang("success archive objects", $succ) : "");
             } else {
                 $resultMessage = lang("success archive objects", $succ);
             }
             ajx_add("overview-panel", "reload");
             break;
         default:
             if ($action) {
                 $resultMessage = lang("Unimplemented action: '" . $action . "'");
                 // if
                 $resultCode = 2;
             }
             break;
     }
     // switch
     return array("errorMessage" => $resultMessage, "errorCode" => $resultCode);
 }
	function edit() {
		if (logged_user()->isGuest()) {
			flash_error(lang('no access permissions'));
			ajx_current("empty");
			return;
		}
		$this->setTemplate('event');
		$event = ProjectEvents::findById(get_id());
		
		$user_filter = isset($_GET['user_id']) ? $_GET['user_id'] : logged_user()->getId();
		
		$inv = EventInvitations::findById(array('event_id' => $event->getId(), 'contact_id' => $user_filter));
		if ($inv != null) {
			$event->addInvitation($inv);
		}
		
		if(!$event->canEdit(logged_user())){	    	
			flash_error(lang('no access permissions'));
			ajx_current("empty");
			return ;
                }
	    
		$event_data = array_var($_POST, 'event');
		if(!is_array($event_data)) {
			
			$setlastweek = false;
			$rsel1 = false;$rsel2=false; $rsel3=false;
			$forever = $event->getRepeatForever();
			$occ = 1;
			if($event->getRepeatD() > 0){ $occ = 2; $rjump = $event->getRepeatD();}
			if($event->getRepeatD() > 0 AND $event->getRepeatD()%7==0){ $occ = 3; $rjump = $event->getRepeatD()/7;}
			if($event->getRepeatM() > 0){ $occ = 4; $rjump = $event->getRepeatM();}
			if($event->getRepeatY() > 0){ $occ = 5; $rjump = $event->getRepeatY();}
			if($event->getRepeatH() > 0){ $occ = 6;}
			if($event->getRepeatH() == 2){ $setlastweek = true;}
			if($event->getRepeatEnd()) { $rend = $event->getRepeatEnd();}
			if($event->getRepeatNum() > 0) $rnum = $event->getRepeatNum();
			if(!isset($rjump) || !is_numeric($rjump)) $rjump = 1;
			// decide which repeat type it is
			if($forever) $rsel1 = true; //forever
			else if(isset($rnum) AND $rnum>0) $rsel2 = true; //repeat n-times
			else if(isset($rend) AND $rend instanceof DateTimeValue) $rsel3 = true; //repeat until
			
			//if(isset($rend) AND $rend=="9999-00-00") $rend = "";
			// organize the time and date data for the html select drop downs.
			$thetime = $event->getStart()->getTimestamp() + logged_user()->getTimezone()*3600;
			$durtime = $event->getDuration()->getTimestamp() + logged_user()->getTimezone()*3600 - $thetime;
			$hour = date('G', $thetime);
			// format time to 24-hour or 12-hour clock.
			if(!user_config_option('time_format_use_24')){
				if($hour >= 12){
					$pm = 1;
					$hour = $hour - 12;
				}else $pm = 0;
			}
				
			$event_data = array(
                          'description' => $event->getDescription(),
                          'name' => $event->getObjectName(),
                          'username' => $event->getCreatedByDisplayName(),
                          'typeofevent' => $event->getTypeId(),
                          'forever' => $event->getRepeatForever(),
                          'usetimeandduration' => ($event->getTypeId())==3?0:1,
                          'occ' => $occ,
                          'rjump' => $rjump,
                          'setlastweek' => $setlastweek,
                          'rend' => isset($rend)?$rend:NULL,
                          'rnum' => isset($rnum)?$rnum:NULL,
                          'rsel1' => $rsel1,
                          'rsel2' => $rsel2,
                          'rsel3' => $rsel3,
                          'thetime' => $event->getStart()->getTimestamp(),
			  'hour' => $hour,
			  'minute' => date('i', $thetime),
			  'month' => date('n', $thetime),
			  'year' => date('Y', $thetime),
			  'day' => date('j', $thetime),
			  'durtime' => ($event->getDuration()->getTimestamp() - $thetime),
			  'durationmin' => ($durtime / 60) % 60,
			  'durationhour' => ($durtime / 3600) % 24,
			  'durday' => floor($durtime / 86400),
			  'pm' => isset($pm) ? $pm : 0,
			  'repeat_dow' => $event->getRepeatDow(),
			  'repeat_wnum' => $event->getRepeatWnum(),
			  'repeat_mjump' => $event->getRepeatMjump(),
			); // array
		} // if
                
                //I find all those related to the task to find out if the original
                $event_related = ProjectEvents::findByRelated($event->getObjectId());
                if(!$event_related){
                    //is not the original as the original look plus other related
                    if($event->getOriginalEventId() != "0"){
                        $event_related = ProjectEvents::findByEventAndRelated($event->getObjectId(),$event->getOriginalEventId());
                    }
                }
                if($event_related){
                    tpl_assign('event_related', true);
                }else{
                    tpl_assign('event_related', false);
                }    
                
		tpl_assign('event_data', $event_data);
		tpl_assign('event', $event);

		if(is_array(array_var($_POST, 'event'))) {
			
			//	MANAGE CONCURRENCE WHILE EDITING
			/* FIXME or REMOVEME
			$upd = array_var($_POST, 'updatedon');
			if ($upd && $event->getUpdatedOn()->getTimestamp() > $upd && !array_var($_POST,'merge-changes') == 'true')
			{
				ajx_current('empty');
				evt_add("handle edit concurrence", array(
					"updatedon" => $event->getUpdatedOn()->getTimestamp(),
					"genid" => array_var($_POST,'genid')
				));
				return;
			}
			if (array_var($_POST,'merge-changes') == 'true')
			{					
				$this->setTemplate('view_event');
				$editedEvent = ProjectEvents::findById($event->getId());
				$this->view();
				ajx_set_panel(lang ('tab name',array('name'=>$editedEvent->getTitle())));
				ajx_extra_data(array("title" => $editedEvent->getTitle(), 'icon'=>'ico-event'));
				ajx_set_no_toolbar(true);
				ajx_set_panel(lang ('tab name',array('name'=>$editedEvent->getTitle())));
				return;
			}
			*/
			
			try {
				$data = $this->getData($event_data);
				// run the query to set the event data
                                $event->setFromAttributes($data);

                                $this->registerInvitations($data, $event, false);
				if (isset($data['confirmAttendance'])) {
                                    $this->change_invitation_state($data['confirmAttendance'], $event->getId(), $user_filter);
                                }
				    
                                DB::beginWork();
                                $event->save();  

                                if($event->getSpecialID() != ""){
                                    $this->sync_calendar_extern($event);
                                }

                                $member_ids = json_decode(array_var($_POST, 'members'));

                                $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);
                                									
								$old_reminders = ObjectReminders::getByObject($event);
								if($old_reminders != null){								
									$object_controller->add_reminders($event); //adding the new reminders, if any								
									$object_controller->update_reminders($event, $old_reminders); //updating the old ones
								}else if(user_config_option("add_event_autoreminder")){
									$reminder = new ObjectReminder();
									$def = explode(",",user_config_option("reminders_events"));
									$minutes = $def[2] * $def[1];
				          			$reminder->setMinutesBefore($minutes);
				                    $reminder->setType($def[0]);
				                    $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();
								}

                                $event->resetIsRead();
                                DB::commit();
                                
                                $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, 'modified', logged_user());
                                    $is_silent = true;
                                }

                                ApplicationLogs::createLog($event, ApplicationLogs::ACTION_EDIT, false, $is_silent);
                                
                                $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;
                                }
                                
                                //$this->repetitive_event($event, $opt_rep_day);
                                
                                if($_POST['type_related'] == "all" || $_POST['type_related'] == "news"){
                                    $data['members'] = json_decode(array_var($_POST, 'members'));
                                    $this->repetitive_event_related($event,"edit",$_POST['type_related'],$data);
                                }
                                
                                flash_success(lang('success edit event', clean($event->getObjectName())));

                                if (array_var($_POST, 'popup', false)) {
                                                ajx_current("reload");
                                } else {
                                        ajx_current("back");
                                }
                                ajx_add("overview-panel", "reload");          	
                    } catch(Exception $e) {
                            DB::rollback();
                                    flash_error($e->getMessage());
                                    ajx_current("empty");
                    } // try
		} // if
	} // edit
 function edit_timeslot()
 {
     if (!can_add(logged_user(), active_context(), Timeslots::instance()->getObjectTypeId())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     ajx_current("empty");
     $timeslot_data = array_var($_POST, 'timeslot');
     $timeslot = Timeslots::findById(array_var($timeslot_data, 'id', 0));
     if (!$timeslot instanceof Timeslot) {
         flash_error(lang('timeslot dnx'));
         return;
     }
     try {
         $hoursToAdd = array_var($timeslot_data, 'hours', 0);
         $minutes = array_var($timeslot_data, 'minutes', 0);
         if (strpos($hoursToAdd, ',') && !strpos($hoursToAdd, '.')) {
             $hoursToAdd = str_replace(',', '.', $hoursToAdd);
         }
         if (strpos($hoursToAdd, ':') && !strpos($hoursToAdd, '.')) {
             $pos = strpos($hoursToAdd, ':') + 1;
             $len = strlen($hoursToAdd) - $pos;
             $minutesToAdd = substr($hoursToAdd, $pos, $len);
             if (!strlen($minutesToAdd) <= 2 || !strlen($minutesToAdd) > 0) {
                 $minutesToAdd = substr($minutesToAdd, 0, 2);
             }
             $mins = $minutesToAdd / 60;
             $hours = substr($hoursToAdd, 0, $pos - 1);
             $hoursToAdd = $hours + $mins;
         }
         if ($minutes) {
             $min = str_replace('.', '', $minutes / 6);
             $hoursToAdd = $hoursToAdd + ("0." . $min);
         }
         if ($hoursToAdd <= 0) {
             flash_error(lang('time has to be greater than 0'));
             return;
         }
         $startTime = getDateValue(array_var($timeslot_data, 'date'));
         $startTime = $startTime->add('h', 8 - logged_user()->getTimezone());
         $endTime = getDateValue(array_var($timeslot_data, 'date'));
         $endTime = $endTime->add('h', 8 - logged_user()->getTimezone() + $hoursToAdd);
         $timeslot_data['start_time'] = $startTime;
         $timeslot_data['end_time'] = $endTime;
         $timeslot_data['name'] = $timeslot_data['description'];
         //Only admins can change timeslot user
         if (array_var($timeslot_data, 'contact_id', false) && !logged_user()->isAdministrator()) {
             $timeslot_data['contact_id'] = $timeslot->getContactId();
         }
         $timeslot->setFromAttributes($timeslot_data);
         $user = Contacts::findById($timeslot_data['contact_id']);
         $billing_category_id = $user->getDefaultBillingId();
         $bc = BillingCategories::findById($billing_category_id);
         if ($bc instanceof BillingCategory) {
             $timeslot->setBillingId($billing_category_id);
             $hourly_billing = $bc->getDefaultValue();
             $timeslot->setHourlyBilling($hourly_billing);
             $timeslot->setFixedBilling($hourly_billing * $hoursToAdd);
             $timeslot->setIsFixedBilling(false);
         }
         DB::beginWork();
         $timeslot->save();
         $member_ids = json_decode(array_var($_POST, 'members', ''));
         if ($member_ids && count($member_ids)) {
             ajx_add("time-panel", "reload");
         } else {
             foreach (active_context() as $dimension) {
                 $names[] = $dimension->getName();
             }
             flash_error(lang('select member to add timeslots', implode(", ", $names)));
             //flash_error(lang('must choose at least one member'));
             DB::rollback();
             return;
         }
         $object_controller = new ObjectController();
         $object_controller->add_to_members($timeslot, $member_ids);
         DB::commit();
         ajx_extra_data(array("timeslot" => $timeslot->getArrayInfo()));
     } catch (Exception $e) {
         DB::rollback();
         flash_error($e->getMessage());
     }
     // try
 }
 function edit()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $this->setTemplate('event');
     $event = ProjectEvents::findById(get_id());
     $user_filter = isset($_GET['user_id']) ? $_GET['user_id'] : logged_user()->getId();
     $inv = EventInvitations::findById(array('event_id' => $event->getId(), 'user_id' => $user_filter));
     if ($inv != null) {
         $event->addInvitation($inv);
     }
     if (!$event->canEdit(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     tpl_assign('active_projects', logged_user()->getActiveProjects());
     $event_data = array_var($_POST, 'event');
     if (!is_array($event_data)) {
         $tag_names = $event->getTagNames();
         $setlastweek = false;
         $rsel1 = false;
         $rsel2 = false;
         $rsel3 = false;
         $forever = $event->getRepeatForever();
         $occ = 1;
         if ($event->getRepeatD() > 0) {
             $occ = 2;
             $rjump = $event->getRepeatD();
         }
         if ($event->getRepeatD() > 0 and $event->getRepeatD() % 7 == 0) {
             $occ = 3;
             $rjump = $event->getRepeatD() / 7;
         }
         if ($event->getRepeatM() > 0) {
             $occ = 4;
             $rjump = $event->getRepeatM();
         }
         if ($event->getRepeatY() > 0) {
             $occ = 5;
             $rjump = $event->getRepeatY();
         }
         if ($event->getRepeatH() > 0) {
             $occ = 6;
         }
         if ($event->getRepeatH() == 2) {
             $setlastweek = true;
         }
         if ($event->getRepeatEnd()) {
             $rend = $event->getRepeatEnd();
         }
         if ($event->getRepeatNum() > 0) {
             $rnum = $event->getRepeatNum();
         }
         if (!isset($rjump) || !is_numeric($rjump)) {
             $rjump = 1;
         }
         // decide which repeat type it is
         if ($forever) {
             $rsel1 = true;
         } else {
             if (isset($rnum) and $rnum > 0) {
                 $rsel2 = true;
             } else {
                 if (isset($rend) and $rend instanceof DateTimeValue) {
                     $rsel3 = true;
                 }
             }
         }
         //repeat until
         //if(isset($rend) AND $rend=="9999-00-00") $rend = "";
         // organize the time and date data for the html select drop downs.
         $thetime = $event->getStart()->getTimestamp() + logged_user()->getTimezone() * 3600;
         $durtime = $event->getDuration()->getTimestamp() + logged_user()->getTimezone() * 3600 - $thetime;
         $hour = date('G', $thetime);
         // format time to 24-hour or 12-hour clock.
         if (!user_config_option('time_format_use_24')) {
             if ($hour >= 12) {
                 $pm = 1;
                 $hour = $hour - 12;
             } else {
                 $pm = 0;
             }
         }
         $event_data = array('subject' => $event->getSubject(), 'description' => $event->getDescription(), 'name' => $event->getCreatedById(), 'username' => $event->getCreatedById(), 'typeofevent' => $event->getTypeId(), 'forever' => $event->getRepeatForever(), 'usetimeandduration' => $event->getTypeId() == 3 ? 0 : 1, 'occ' => $occ, 'rjump' => $rjump, 'setlastweek' => $setlastweek, 'rend' => isset($rend) ? $rend : NULL, 'rnum' => isset($rnum) ? $rnum : NULL, 'rsel1' => $rsel1, 'rsel2' => $rsel2, 'rsel3' => $rsel3, 'thetime' => $event->getStart()->getTimestamp(), 'hour' => $hour, 'minute' => date('i', $thetime), 'month' => date('n', $thetime), 'year' => date('Y', $thetime), 'day' => date('j', $thetime), 'durtime' => $event->getDuration()->getTimestamp() - $thetime, 'durationmin' => $durtime / 60 % 60, 'durationhour' => $durtime / 3600 % 24, 'durday' => floor($durtime / 86400), 'pm' => isset($pm) ? $pm : 0, 'tags' => is_array($tag_names) ? implode(', ', $tag_names) : '', 'repeat_dow' => $event->getRepeatDow(), 'repeat_wnum' => $event->getRepeatWnum(), 'repeat_mjump' => $event->getRepeatMjump());
         // array
     }
     // if
     tpl_assign('event_data', $event_data);
     tpl_assign('event', $event);
     if (is_array(array_var($_POST, 'event'))) {
         //	MANAGE CONCURRENCE WHILE EDITING
         $upd = array_var($_POST, 'updatedon');
         if ($upd && $event->getUpdatedOn()->getTimestamp() > $upd && !array_var($_POST, 'merge-changes') == 'true') {
             ajx_current('empty');
             evt_add("handle edit concurrence", array("updatedon" => $event->getUpdatedOn()->getTimestamp(), "genid" => array_var($_POST, 'genid')));
             return;
         }
         if (array_var($_POST, 'merge-changes') == 'true') {
             $this->setTemplate('view_event');
             $editedEvent = ProjectEvents::findById($event->getId());
             $this->viewevent();
             ajx_set_panel(lang('tab name', array('name' => $editedEvent->getTitle())));
             ajx_extra_data(array("title" => $editedEvent->getTitle(), 'icon' => 'ico-event'));
             ajx_set_no_toolbar(true);
             ajx_set_panel(lang('tab name', array('name' => $editedEvent->getTitle())));
             return;
         }
         try {
             $data = $this->getData($event_data);
             // run the query to set the event data
             $event->setFromAttributes($data);
             $this->registerInvitations($data, $event, false);
             if (isset($data['confirmAttendance'])) {
                 $this->change_invitation_state($data['confirmAttendance'], $event->getId(), $user_filter);
             }
             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[] = Users::findById(array('id' => $us));
                     }
                 }
                 Notifier::notifEvent($event, $users_to_inv, 'modified', logged_user());
             }
             foreach ($data['users_to_invite'] as $user_id => $v) {
                 $user = Users::findById(array('id' => $user_id));
                 if ($user instanceof User) {
                     $phone_num = Users::getPhoneNumberCustomProperty($user_id);
                     $sms_obj = new SmsController();
                     $sms_obj->prepareEventInvitee($user->getDisplayName(), $event->getTitle(), get_class($event));
                     $sms_obj->sendSms($phone_num);
                 }
             }
             if (!logged_user()->isMemberOfOwnerCompany()) {
                 $event->setIsPrivate(false);
             }
             DB::beginWork();
             $event->save();
             $event->setTagsFromCSV(array_var($event_data, 'tags'));
             $object_controller = new ObjectController();
             $object_controller->add_to_workspaces($event);
             $object_controller->link_to_new_object($event);
             $object_controller->add_subscribers($event);
             $object_controller->add_custom_properties($event);
             $object_controller->add_reminders($event);
             $event->resetIsRead();
             ApplicationLogs::createLog($event, $event->getWorkspaces(), ApplicationLogs::ACTION_EDIT);
             DB::commit();
             flash_success(lang('success edit event', clean($event->getObjectName())));
             if (array_var($_POST, 'popup', false)) {
                 ajx_current("reload");
             } else {
                 ajx_current("back");
             }
             ajx_add("overview-panel", "reload");
         } catch (Exception $e) {
             DB::rollback();
             flash_error($e->getMessage());
             ajx_current("empty");
             //tpl_assign('error', $e);
         }
         // try
     }
     // if
 }
 /**
  * Resolve action to perform
  *
  * @param string $action
  * @param array $attributes
  * @return string $message
  */
 private function resolveAction($action, $attributes)
 {
     $resultMessage = "";
     $resultCode = 0;
     switch ($action) {
         case "delete":
             $err = 0;
             $succ = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if ($email instanceof MailContent && $email->canDelete(logged_user())) {
                             if ($email->getState() == 2) {
                                 // we are deleting a draft email
                                 $emails_in_conversation = array($email);
                             } else {
                                 if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                     $emails_in_conversation = MailContents::getMailsFromConversation($email);
                                 } else {
                                     $emails_in_conversation = array($email);
                                 }
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canDelete(logged_user())) {
                                     try {
                                         $email->trash();
                                         ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_TRASH);
                                         $succ++;
                                     } catch (Exception $e) {
                                         $err++;
                                     }
                                 } else {
                                     $err++;
                                 }
                             }
                         } else {
                             $err++;
                         }
                         break;
                     default:
                         $err++;
                         break;
                 }
                 // switch
             }
             // for
             if ($err > 0) {
                 $resultCode = 2;
                 $resultMessage = lang("error delete objects", $err) . "<br />" . ($succ > 0 ? lang("success delete objects", $succ) : "");
             } else {
                 $resultMessage = lang("success delete objects", $succ);
             }
             ajx_add("overview-panel", "reload");
             break;
         case "unclassify":
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email) && !$email->isDeleted() && $email->canEdit(logged_user())) {
                             $this->do_unclassify($email);
                             ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_TAG, false, null, true, $tag);
                             $resultMessage = lang("success unclassify emails", count($attributes["ids"]));
                         }
                         break;
                     default:
                         $resultMessage = "Unimplemented type: '" . $type . "'";
                         $resultCode = 2;
                         break;
                 }
                 // switch
             }
             // for
             break;
         case "checkmail":
             $resultCheck = MailController::checkmail();
             $resultMessage = $resultCheck[1];
             // if
             $resultCode = $resultCheck[0];
             ajx_add("overview-panel", "reload");
             break;
         case "markAsRead":
         case "markAsUnRead":
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email)) {
                             if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                 $emails_in_conversation = MailContents::getMailsFromConversation($email);
                             } else {
                                 $emails_in_conversation = array($email);
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canEdit(logged_user())) {
                                     $email->setIsRead(logged_user()->getId(), $action == 'markAsRead');
                                 }
                             }
                         }
                         break;
                     default:
                         $resultMessage = "Unimplemented type: '" . $type . "'";
                         $resultCode = 2;
                         break;
                 }
                 // switch
             }
             // for
             ajx_add("overview-panel", "reload");
             break;
         case "archive":
             $err = 0;
             $succ = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "email":
                         $email = MailContents::findById($id);
                         if (isset($email)) {
                             if (user_config_option('show_emails_as_conversations', true, logged_user()->getId())) {
                                 $emails_in_conversation = MailContents::getMailsFromConversation($email);
                             } else {
                                 $emails_in_conversation = array($email);
                             }
                             foreach ($emails_in_conversation as $email) {
                                 if ($email->canEdit(logged_user())) {
                                     try {
                                         $email->archive(null);
                                         ApplicationLogs::createLog($email, $email->getWorkspaces(), ApplicationLogs::ACTION_ARCHIVE);
                                         $succ++;
                                     } catch (Exception $e) {
                                         $err++;
                                     }
                                 }
                             }
                         } else {
                             $err++;
                         }
                         break;
                     default:
                         $err++;
                         break;
                 }
                 // switch
             }
             // for
             if ($err > 0) {
                 $resultCode = 2;
                 $resultMessage = lang("error archive objects", $err) . "<br />" . ($succ > 0 ? lang("success archive objects", $succ) : "");
             } else {
                 $resultMessage = lang("success archive objects", $succ);
             }
             ajx_add("overview-panel", "reload");
             break;
         default:
             if ($action) {
                 $resultMessage = "Unimplemented action: '" . $action . "'";
                 $resultCode = 2;
             }
             break;
     }
     // switch
     return array("errorMessage" => $resultMessage, "errorCode" => $resultCode);
 }
 /**
  * Edit logged user profile. 
  * Called with different POST format from "administration/users/edit user profile " and from "profile/edit my profile" 
  *
  * @access public
  * @param void
  * @return null
  */
 function edit_profile()
 {
     $user = Users::findById(get_id());
     if (!$user instanceof User) {
         flash_error(lang('user dnx'));
         ajx_current("empty");
         return;
     }
     // if
     $company = $user->getCompany();
     if (!$company instanceof Company) {
         flash_error(lang('company dnx'));
         ajx_current("empty");
         return;
     }
     // if
     if (!$user->canUpdateProfile(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     $redirect_to = array_var($_GET, 'redirect_to');
     if (trim($redirect_to) == '' || !is_valid_url($redirect_to)) {
         $redirect_to = $user->getCardUrl();
     }
     // if
     tpl_assign('redirect_to', null);
     $user_data = array_var($_POST, 'user');
     if (!is_array($user_data)) {
         $user_data = array('username' => $user->getUsername(), 'email' => $user->getEmail(), 'display_name' => $user->getDisplayName(), 'title' => $user->getTitle(), 'timezone' => $user->getTimezone(), 'auto_assign' => $user->getAutoAssign(), 'company_id' => $user->getCompanyId(), 'is_admin' => $user->isAdministrator(), 'type' => $user->getType());
         // array
     }
     // if
     tpl_assign('user', $user);
     tpl_assign('company', $company);
     tpl_assign('user_data', $user_data);
     tpl_assign('billing_categories', BillingCategories::findAll());
     if (is_array(array_var($_POST, 'user'))) {
         if (array_var($user_data, 'company_id') && !Companies::findById(array_var($user_data, 'company_id')) instanceof Company) {
             ajx_current("empty");
             flash_error(lang("company dnx"));
             return;
         }
         try {
             DB::beginWork();
             $user->setDisplayName(array_var($user_data, 'display_name'));
             $user->setEmail(array_var($user_data, 'email'));
             $user->setType(array_var($user_data, 'type'));
             $user->setTimezone(array_var($user_data, 'timezone'));
             $user->setTitle(array_var($user_data, 'title'));
             $user->setUpdatedOn(DateTimeValueLib::now());
             if (logged_user()->isAdministrator()) {
                 if ($user->getId() != 1) {
                     // System admin cannot change it's company
                     $user->setCompanyId(array_var($user_data, 'company_id'));
                 }
                 $user->setDefaultBillingId(array_var($user_data, 'default_billing_id'));
                 $user->setUsername(array_var($user_data, 'username'));
                 $project = Projects::findById(array_var($user_data, 'personal_project_id'));
                 if ($project instanceof Project && $user->getPersonalProjectId() != $project->getId()) {
                     $user->setPersonalProjectId($project->getId());
                     $project_user = ProjectUsers::findById(array('project_id' => $project->getId(), 'user_id' => $user->getId()));
                     if (!$project_user) {
                         $project_user = new ProjectUser();
                         $project_user->setUserId($user->getId());
                         $project_user->setProjectId($project->getId());
                     }
                     $project_user->setAllPermissions(true);
                     $project_user->save();
                 }
             }
             $user->save();
             $autotimezone = array_var($user_data, 'autodetect_time_zone', null);
             if ($autotimezone !== null) {
                 set_user_config_option('autodetect_time_zone', $autotimezone, $user->getId());
             }
             $object_controller = new ObjectController();
             $object_controller->add_custom_properties($user);
             if ($user->getId() != 1) {
                 //System admin cannot change its own admin status
                 if ($user->getType() == 'admin') {
                     if ($user->getCompanyId() != owner_company()->getId()) {
                         // external users can't be admins => set as Normal
                         $user->setType('normal');
                         $user->setAsAdministrator(false);
                     } else {
                         $user->setAsAdministrator(true);
                     }
                 } else {
                     $user->setAsAdministrator(false);
                 }
             }
             DB::commit();
             flash_success(lang('success update profile'));
             ajx_current("back");
             ajx_add("overview-panel", "reload");
         } catch (Exception $e) {
             DB::rollback();
             ajx_current("empty");
             flash_error($e->getMessage());
         }
         // try
     }
     // if
 }