/**
  * Edit specific contact
  *
  * @access public
  * @param void
  * @return null
  */
 function edit()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $this->setTemplate('edit_contact');
     if (active_project() instanceof Project) {
         tpl_assign('isAddProject', true);
     }
     $contact = Contacts::findById(get_id());
     if (!$contact instanceof Contact) {
         flash_error(lang('contact dnx'));
         ajx_current("empty");
         return;
     }
     // if
     if (!$contact->canEdit(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     $im_types = ImTypes::findAll(array('order' => '`id`'));
     $active_project = active_project();
     $role = "";
     if ($active_project) {
         $pc = $contact->getRole(active_project());
         if ($pc instanceof ProjectContact) {
             $role = $pc->getRole();
         }
     }
     $contact_data = array_var($_POST, 'contact');
     if (!is_array($contact_data)) {
         $tag_names = $contact->getTagNames();
         $contact_data = array('firstname' => $contact->getFirstName(), 'lastname' => $contact->getLastName(), 'middlename' => $contact->getMiddleName(), 'department' => $contact->getDepartment(), 'job_title' => $contact->getJobTitle(), 'email' => $contact->getEmail(), 'email2' => $contact->getEmail2(), 'email3' => $contact->getEmail3(), 'w_web_page' => $contact->getWWebPage(), 'w_address' => $contact->getWAddress(), 'w_city' => $contact->getWCity(), 'w_state' => $contact->getWState(), 'w_zipcode' => $contact->getWZipcode(), 'w_country' => $contact->getWCountry(), 'w_phone_number' => $contact->getWPhoneNumber(), 'w_phone_number2' => $contact->getWPhoneNumber2(), 'w_fax_number' => $contact->getWFaxNumber(), 'w_assistant_number' => $contact->getWAssistantNumber(), 'w_callback_number' => $contact->getWCallbackNumber(), 'h_web_page' => $contact->getHWebPage(), 'h_address' => $contact->getHAddress(), 'h_city' => $contact->getHCity(), 'h_state' => $contact->getHState(), 'h_zipcode' => $contact->getHZipcode(), 'h_country' => $contact->getHCountry(), 'h_phone_number' => $contact->getHPhoneNumber(), 'h_phone_number2' => $contact->getHPhoneNumber2(), 'h_fax_number' => $contact->getHFaxNumber(), 'h_mobile_number' => $contact->getHMobileNumber(), 'h_pager_number' => $contact->getHPagerNumber(), 'o_web_page' => $contact->getOWebPage(), 'o_address' => $contact->getOAddress(), 'o_city' => $contact->getOCity(), 'o_state' => $contact->getOState(), 'o_zipcode' => $contact->getOZipcode(), 'o_country' => $contact->getOCountry(), 'o_phone_number' => $contact->getOPhoneNumber(), 'o_phone_number2' => $contact->getOPhoneNumber2(), 'o_fax_number' => $contact->getOFaxNumber(), 'o_birthday' => $contact->getOBirthday(), 'picture_file' => $contact->getPictureFile(), 'timezone' => $contact->getTimezone(), 'notes' => $contact->getNotes(), 'is_private' => $contact->getIsPrivate(), 'company_id' => $contact->getCompanyId(), 'role' => $role, 'tags' => is_array($tag_names) ? implode(', ', $tag_names) : '');
         // array
         if (is_array($im_types)) {
             foreach ($im_types as $im_type) {
                 $contact_data['im_' . $im_type->getId()] = $contact->getImValue($im_type);
             }
             // forech
         }
         // if
         $default_im = $contact->getDefaultImType();
         $contact_data['default_im'] = $default_im instanceof ImType ? $default_im->getId() : '';
     }
     // if
     tpl_assign('contact', $contact);
     tpl_assign('contact_data', $contact_data);
     tpl_assign('im_types', $im_types);
     if (is_array(array_var($_POST, 'contact'))) {
         //	MANAGE CONCURRENCE WHILE EDITING
         $upd = array_var($_POST, 'updatedon');
         if ($upd && $contact->getUpdatedOn()->getTimestamp() > $upd && !array_var($_POST, 'merge-changes') == 'true') {
             ajx_current('empty');
             evt_add("handle edit concurrence", array("updatedon" => $contact->getUpdatedOn()->getTimestamp(), "genid" => array_var($_POST, 'genid')));
             return;
         }
         if (array_var($_POST, 'merge-changes') == 'true') {
             $this->setTemplate('card');
             $new_contact = Contacts::findById($contact->getId());
             ajx_set_panel(lang('tab name', array('name' => $new_contact->getDisplayName())));
             ajx_extra_data(array("title" => $new_contact->getDisplayName(), 'icon' => 'ico-contact'));
             ajx_set_no_toolbar(true);
             //ajx_set_panel(lang ('tab name',array('name'=>$new_contact->getDisplayName())));
             return;
         }
         try {
             DB::beginWork();
             $newCompany = false;
             if (array_var($contact_data, 'isNewCompany') == 'true' && is_array(array_var($_POST, 'company'))) {
                 $company_data = array_var($_POST, 'company');
                 $company = new Company();
                 $company->setFromAttributes($company_data);
                 $company->setClientOfId(1);
                 $company->save();
                 ApplicationLogs::createLog($company, null, ApplicationLogs::ACTION_ADD);
                 $newCompany = true;
                 if (active_project() instanceof Project && $company->canAdd(logged_user(), active_project())) {
                     $company->addToWorkspace(active_project());
                 } else {
                     $company->addToWorkspace(logged_user()->getPersonalProject());
                 }
             }
             $contact_data['o_birthday'] = getDateValue(array_var($contact_data, "o_birthday_value", ''));
             $contact->setFromAttributes($contact_data);
             /*if (!is_null($contact->getOBirthday()) && $contact_data["o_birthday_year"] == 0){
             			$contact->setOBirthday(null);
             		} else if ($contact_data["o_birthday_year"] != 0) {
             			$bday = new DateTimeValue(0);
             			$bday->setYear($contact_data["o_birthday_year"]);
             			$bday->setMonth($contact_data["o_birthday_month"]);
             			$bday->setDay($contact_data["o_birthday_day"]);
             			$contact->setOBirthday($bday);
             		}*/
             if ($newCompany) {
                 $contact->setCompanyId($company->getId());
             }
             $contact->save();
             $contact->setTagsFromCSV(array_var($contact_data, 'tags'));
             $contact->clearImValues();
             foreach ($im_types as $im_type) {
                 $value = trim(array_var($contact_data, 'im_' . $im_type->getId()));
                 if ($value != '') {
                     $contact_im_value = new ContactImValue();
                     $contact_im_value->setContactId($contact->getId());
                     $contact_im_value->setImTypeId($im_type->getId());
                     $contact_im_value->setValue($value);
                     $contact_im_value->setIsDefault(array_var($contact_data, 'default_im') == $im_type->getId());
                     $contact_im_value->save();
                 }
                 // if
             }
             // foreach
             $object_controller = new ObjectController();
             $object_controller->add_to_workspaces($contact, !can_manage_contacts(logged_user()));
             $object_controller->link_to_new_object($contact);
             $object_controller->add_subscribers($contact);
             $object_controller->add_custom_properties($contact);
             ApplicationLogs::createLog($contact, null, ApplicationLogs::ACTION_EDIT);
             DB::commit();
             if (trim(array_var($contact_data, 'role', '')) != '' && active_project() instanceof Project) {
                 if (!ProjectContact::canAdd(logged_user(), active_project())) {
                     flash_error(lang('error contact added but not assigned', $contact->getDisplayName(), active_project()->getName()));
                     ajx_current("back");
                     return;
                 }
                 // if
                 $pc = $contact->getRole(active_project());
                 if (!$pc instanceof ProjectContact) {
                     $pc = new ProjectContact();
                     $pc->setContactId($contact->getId());
                     $pc->setProjectId(active_project()->getId());
                 }
                 $pc->setRole(array_var($contact_data, 'role'));
                 $pc->save();
                 //ApplicationLogs::createLog($contact, $contact->getWorkspaces(), ApplicationLogs::ACTION_ADD);
             }
             flash_success(lang('success edit contact', $contact->getDisplayName()));
             ajx_current("back");
         } catch (Exception $e) {
             DB::rollback();
             flash_error($e->getMessage());
             ajx_current("empty");
         }
         // try
     }
     // if
 }