/**
  * Add email account
  *
  * @access public
  * @param void
  * @return null
  */
 function add_account()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $this->setTemplate('add_account');
     if (!MailAccount::canAdd(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     $mailAccount = new MailAccount();
     tpl_assign('mailAccount', $mailAccount);
     $mailAccount_data = array_var($_POST, 'mailAccount');
     tpl_assign('mailAccount_data', $mailAccount_data);
     // get mail account users
     $mau = array(logged_user()->getId() => array('name' => logged_user()->getDisplayName(), 'can_edit' => true));
     tpl_assign('mailAccountUsers', $mau);
     $is_admin = logged_user()->isAdministrator();
     tpl_assign('is_admin', $is_admin);
     if (is_array(array_var($_POST, 'mailAccount'))) {
         $email_address = array_var(array_var($_POST, 'mailAccount'), 'email_addr');
         /*if (MailAccounts::findOne(array('conditions' => "`email` = '$email_address'")) != null) {
         			flash_error(lang('email address already exists'));
         			ajx_current("empty");
         			return;
         		}*/
         try {
             $selected_user = array_var($_POST, 'users_select_box');
             if (!$is_admin) {
                 $mail_account_user = logged_user();
             } else {
                 $mail_account_user = Users::findById($selected_user);
             }
             $mailAccount_data['user_id'] = $mail_account_user->getId();
             if (!array_var($mailAccount_data, 'del_mails_from_server', false)) {
                 $mailAccount_data['del_from_server'] = 0;
             }
             $mailAccount->setFromAttributes($mailAccount_data);
             $mailAccount->setPassword(MailUtilities::ENCRYPT_DECRYPT($mailAccount->getPassword()));
             $mailAccount->setSmtpPassword(MailUtilities::ENCRYPT_DECRYPT($mailAccount->getSmtpPassword()));
             $outbox_folder = array_var($_POST, 'outbox_select_box');
             if (config_option("sent_mails_sync") && isset($outbox_folder)) {
                 $mailAccount->setSyncPass(MailUtilities::ENCRYPT_DECRYPT($mailAccount_data['sync_pass']));
                 $mailAccount->setSyncFolder($outbox_folder);
             }
             DB::beginWork();
             $mailAccount->save();
             // process users
             $account_users = $mail_account_user->getCompany()->getUsers();
             $user_access = array_var($_POST, 'user_access');
             foreach ($account_users as $account_user) {
                 $user_id = $account_user->getId();
                 $access = $user_access[$user_id];
                 if ($access != 'none' || $user_id == $mail_account_user->getId()) {
                     $account_user = new MailAccountUser();
                     $account_user->setAccountId($mailAccount->getId());
                     $account_user->setUserId($user_id);
                     $account_user->setCanEdit($access == 'write');
                     $account_user->save();
                 }
             }
             if ($mailAccount->getIsImap() && is_array(array_var($_POST, 'check'))) {
                 $real_folders = MailUtilities::getImapFolders($mailAccount);
                 foreach ($real_folders as $folder_name) {
                     if (!MailAccountImapFolders::findById(array('account_id' => $mailAccount->getId(), 'folder_name' => $folder_name))) {
                         $acc_folder = new MailAccountImapFolder();
                         $acc_folder->setAccountId($mailAccount->getId());
                         $acc_folder->setFolderName($folder_name);
                         $acc_folder->setCheckFolder($folder_name == 'INBOX');
                         // By default only INBOX is checked
                         $acc_folder->save();
                     }
                 }
                 $imap_folders = MailAccountImapFolders::getMailAccountImapFolders($mailAccount->getId());
                 $checks = array_var($_POST, 'check');
                 if (is_array($imap_folders) && count($imap_folders)) {
                     foreach ($imap_folders as $folder) {
                         $folder->setCheckFolder(false);
                         foreach ($checks as $name => $cf) {
                             $name = str_replace(array('¡', '!'), array('[', ']'), $name);
                             //to avoid a mistaken array if name contains [
                             if (strcasecmp($name, $folder->getFolderName()) == 0) {
                                 $folder->setCheckFolder($cf == 'checked');
                                 break;
                             }
                         }
                         $folder->save();
                     }
                 }
             }
             // personal settings
             if (array_var($_POST, 'is_default')) {
                 $user_accounts = MailAccountUsers::getByUser(logged_user());
                 foreach ($user_accounts as $acc) {
                     if ($acc->getAccountId() != $mailAccount->getId()) {
                         $acc->setIsDefault(false);
                         $acc->save();
                     } else {
                         $acc->setIsDefault(true);
                         $acc->save();
                     }
                 }
             }
             $logged_user_settings = MailAccountUsers::getByAccountAndUser($mailAccount, logged_user());
             $logged_user_settings->setSignature(array_var($_POST, 'signature'));
             $logged_user_settings->setSenderName(array_var($_POST, 'sender_name'));
             $logged_user_settings->save();
             if ($mailAccount->canView(logged_user())) {
                 evt_add("mail account added", array("id" => $mailAccount->getId(), "name" => $mailAccount->getName(), "email" => $mailAccount->getEmail()));
             }
             // Restore old emails, if account was deleted and its emails weren't
             $old_emails = MailContents::findAll(array('conditions' => '`created_by_id` = ' . $mail_account_user->getId() . " AND `account_email` = '" . $mailAccount->getEmail() . "' AND `account_id` NOT IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_accounts`)"));
             if (isset($old_emails) && is_array($old_emails) && count($old_emails)) {
                 foreach ($old_emails as $email) {
                     $email->setAccountId($mailAccount->getId());
                     $email->save();
                 }
             }
             DB::commit();
             flash_success(lang('success add mail account', $mailAccount->getName()));
             ajx_current("back");
             // Error...
         } catch (Exception $e) {
             DB::rollback();
             ajx_current("empty");
             flash_error($e->getMessage());
         }
         // try
     }
     // if
 }
 /**
  * Add email account
  *
  * @access public
  * @param void
  * @return null
  */
 function add_account()
 {
     if (logged_user()->isGuest()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     if (!MailAccount::canAdd(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     // if
     $mailAccount = new MailAccount();
     tpl_assign('mailAccount', $mailAccount);
     $mailAccount_data = array_var($_POST, 'mailAccount');
     tpl_assign('mailAccount_data', $mailAccount_data);
     // get mail account users
     $mau = array(logged_user()->getId() => array('name' => logged_user()->getObjectName(), 'can_edit' => true));
     tpl_assign('mailAccountUsers', $mau);
     $is_admin = logged_user()->isAdministrator();
     tpl_assign('is_admin', $is_admin);
     if (is_array(array_var($_POST, 'mailAccount'))) {
         $email_address = array_var(array_var($_POST, 'mailAccount'), 'email_addr');
         /*if (MailAccounts::findOne(array('conditions' => "`email` = '$email_address'")) != null) {
         			flash_error(lang('email address already exists'));
         			ajx_current("empty");
         			return;
         		}*/
         try {
             $selected_user = array_var($_POST, 'users_select_box');
             if (!$is_admin) {
                 $mail_account_user = logged_user();
             } else {
                 $mail_account_user = Contacts::findById($selected_user);
             }
             $mailAccount_data['sync_ssl'] = array_var($mailAccount_data, 'sync_ssl') == "checked";
             $mailAccount_data['contact_id'] = $mail_account_user->getId();
             if (!array_var($mailAccount_data, 'del_mails_from_server', false)) {
                 $mailAccount_data['del_from_server'] = 0;
             }
             if (!array_var($mailAccount_data, 'mark_read_on_server', false)) {
                 $mailAccount_data['mark_read_on_server'] = 0;
             }
             $mailAccount->setFromAttributes($mailAccount_data);
             $mailAccount->setServer(trim($mailAccount->getServer()));
             $mailAccount->setPassword(MailUtilities::ENCRYPT_DECRYPT($mailAccount->getPassword()));
             $mailAccount->setSmtpPassword(MailUtilities::ENCRYPT_DECRYPT($mailAccount->getSmtpPassword()));
             $outbox_folder = array_var($_POST, 'outbox_select_box');
             if (config_option("sent_mails_sync") && isset($outbox_folder)) {
                 $mailAccount->setSyncPass(MailUtilities::ENCRYPT_DECRYPT($mailAccount_data['sync_pass']));
                 $mailAccount->setSyncFolder($outbox_folder);
             }
             $member_ids = json_decode(array_var($_POST, 'members'));
             $member_ids_str = "";
             foreach ($member_ids as $mid) {
                 if (is_numeric($mid)) {
                     $member_ids_str .= ($member_ids_str == "" ? "" : ",") . $mid;
                 }
             }
             $mailAccount->setMemberId($member_ids_str);
             DB::beginWork();
             $mailAccount->save();
             // process users
             $account_users = Contacts::getAllUsers();
             $user_access = array_var($_POST, 'user_access');
             foreach ($account_users as $account_user) {
                 $user_id = $account_user->getId();
                 $access = array_var($user_access, $user_id);
                 if (!is_null($access) && $access != 'none' || $user_id == $mail_account_user->getId()) {
                     $account_user = new MailAccountContact();
                     $account_user->setAccountId($mailAccount->getId());
                     $account_user->setContactId($user_id);
                     $account_user->setCanEdit($access == 'write');
                     $account_user->save();
                 }
             }
             if ($mailAccount->getIsImap() && is_array(array_var($_POST, 'check'))) {
                 $real_folders = MailUtilities::getImapFolders($mailAccount);
                 foreach ($real_folders as $folder_name) {
                     if (!MailAccountImapFolders::findById(array('account_id' => $mailAccount->getId(), 'folder_name' => $folder_name))) {
                         $acc_folder = new MailAccountImapFolder();
                         $acc_folder->setAccountId($mailAccount->getId());
                         $acc_folder->setFolderName($folder_name);
                         $acc_folder->setCheckFolder($folder_name == 'INBOX');
                         // By default only INBOX is checked
                         $acc_folder->save();
                     }
                 }
                 $imap_folders = MailAccountImapFolders::getMailAccountImapFolders($mailAccount->getId());
                 $checks = array_var($_POST, 'check');
                 if (is_array($imap_folders) && count($imap_folders)) {
                     foreach ($imap_folders as $folder) {
                         $folder->setCheckFolder(false);
                         foreach ($checks as $name => $cf) {
                             $name = str_replace(array('¡', '!'), array('[', ']'), $name);
                             //to avoid a mistaken array if name contains [
                             if (strcasecmp($name, $folder->getFolderName()) == 0) {
                                 $folder->setCheckFolder($cf == 'checked');
                                 break;
                             }
                         }
                         $folder->save();
                     }
                 }
             }
             // personal settings
             if (array_var($_POST, 'is_default')) {
                 $user_accounts = MailAccountContacts::getByContact(logged_user());
                 foreach ($user_accounts as $acc) {
                     if ($acc->getAccountId() != $mailAccount->getId()) {
                         $acc->setIsDefault(false);
                         $acc->save();
                     } else {
                         $acc->setIsDefault(true);
                         $acc->save();
                     }
                 }
             }
             $logged_user_settings = MailAccountContacts::getByAccountAndContact($mailAccount, logged_user());
             if ($logged_user_settings instanceof MailAccountContact) {
                 $logged_user_settings->setSignature(array_var($_POST, 'signature'));
                 $logged_user_settings->setSenderName(array_var($_POST, 'sender_name'));
                 $logged_user_settings->save();
             }
             if ($mailAccount->canView(logged_user())) {
                 evt_add("mail account added", array("id" => $mailAccount->getId(), "name" => $mailAccount->getName(), "email" => $mailAccount->getEmail()));
             }
             // Restore old emails, if account was deleted and its emails weren't
             DB::executeAll("\r\n\t\t\t\t\t\tUPDATE " . TABLE_PREFIX . "mail_contents mc INNER JOIN " . TABLE_PREFIX . "objects o ON mc.object_id = o.id\r\n\t\t\t\t\t\t\tSET mc.account_id=" . $mailAccount->getId() . " \r\n\t\t\t\t\t\t\tWHERE o.`created_by_id` = " . $mail_account_user->getId() . " \r\n\t\t\t\t\t\t\t\t\tAND mc.`account_email` = '" . $mailAccount->getEmail() . "' \r\n\t\t\t\t\t\t\t\t\tAND mc.`account_id` NOT IN (SELECT `id` FROM `" . TABLE_PREFIX . "mail_accounts`)");
             DB::commit();
             flash_success(lang('success add mail account', $mailAccount->getName()));
             ajx_current("back");
             // Error...
         } catch (Exception $e) {
             DB::rollback();
             ajx_current("empty");
             flash_error($e->getMessage());
         }
     }
 }