function do_tag_file($tag, $ids)
 {
     $err = $succ = 0;
     foreach ($ids as $id) {
         if (trim($id) != '') {
             try {
                 $file = ProjectFiles::findById($id);
                 if (!$file->canEdit(logged_user())) {
                     $err++;
                 } else {
                     Tags::addObjectTag($tag, $file);
                     ApplicationLogs::createLog($file, $file->getWorkspaces(), ApplicationLogs::ACTION_TAG, false, null, true, $tag);
                     $succ++;
                 }
             } catch (Exception $e) {
                 $err++;
             }
         }
     }
     return array($succ, $err);
 }
 /**
  * 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);
 }
 /**
  * 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":
             $succ = 0;
             $err = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "message":
                         $message = ProjectMessages::findById($id);
                         if (isset($message) && $message->canDelete(logged_user())) {
                             try {
                                 DB::beginWork();
                                 $message->trash();
                                 ApplicationLogs::createLog($message, $message->getWorkspaces(), ApplicationLogs::ACTION_TRASH);
                                 DB::commit();
                                 $succ++;
                             } catch (Exception $e) {
                                 DB::rollback();
                                 $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);
             }
             break;
         case "markasread":
             $succ = 0;
             $err = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "message":
                         $message = ProjectMessages::findById($id);
                         try {
                             $message->setIsRead(logged_user()->getId(), true);
                             $succ++;
                         } catch (Exception $e) {
                             $err++;
                         }
                         // try
                         break;
                     default:
                         $err++;
                         break;
                 }
                 // switch
             }
             // for
             if ($err > 0) {
                 $resultCode = 2;
                 $resultMessage = lang("error markasread objects", $err) . "<br />" . ($succ > 0 ? lang("success markasread objects", $succ) : "");
             }
             break;
         case "markasunread":
             $succ = 0;
             $err = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "message":
                         $message = ProjectMessages::findById($id);
                         try {
                             $message->setIsRead(logged_user()->getId(), false);
                             $succ++;
                         } catch (Exception $e) {
                             $err++;
                         }
                         // try
                         break;
                     default:
                         $err++;
                         break;
                 }
                 // switch
             }
             // for
             if ($err > 0) {
                 $resultCode = 2;
                 $resultMessage = lang("error markasunread objects", $err) . "<br />" . ($succ > 0 ? lang("success markasunread objects", $succ) : "");
             }
             break;
         case "tag":
             $tag = $attributes["tag"];
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "message":
                         $message = ProjectMessages::findById($id);
                         if (isset($message) && $message->canEdit(logged_user())) {
                             Tags::addObjectTag($tag, $message);
                             ApplicationLogs::createLog($message, $message->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 "message":
                         $message = ProjectMessages::findById($id);
                         if (isset($message) && $message->canEdit(logged_user())) {
                             if ($tag != '') {
                                 $message->deleteTag($tag);
                             } else {
                                 $message->clearTags();
                             }
                             $resultMessage = lang("success untag objects", '');
                         }
                         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, 'ProjectMessages')) {
                     $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 "message":
                                 $message = ProjectMessages::findById($id);
                                 if ($message instanceof ProjectMessage && $message->canEdit(logged_user())) {
                                     if (!$attributes["mantainWs"]) {
                                         $removed = "";
                                         $ws = $message->getWorkspaces();
                                         foreach ($ws as $w) {
                                             if (can_add(logged_user(), $w, 'ProjectMessages')) {
                                                 $message->removeFromWorkspace($w);
                                                 $removed .= $w->getId() . ",";
                                             }
                                         }
                                         $removed = substr($removed, 0, -1);
                                         $log_action = ApplicationLogs::ACTION_MOVE;
                                         $log_data = ($removed == "" ? "" : "from:{$removed};") . "to:{$wsid}";
                                     } else {
                                         $log_action = ApplicationLogs::ACTION_COPY;
                                         $log_data = "to:{$wsid}";
                                     }
                                     $message->addToWorkspace($destination);
                                     ApplicationLogs::createLog($message, $message->getWorkspaces(), $log_action, false, null, true, $log_data);
                                     $count++;
                                 }
                                 break;
                             default:
                                 $resultMessage = lang("Unimplemented type: '" . $type . "'");
                                 // if
                                 $resultCode = 2;
                                 break;
                         }
                         // switch
                     }
                     // for
                     $resultMessage = lang("success move objects", $count);
                     $resultCode = 0;
                 }
             }
             break;
         case "archive":
             $succ = 0;
             $err = 0;
             for ($i = 0; $i < count($attributes["ids"]); $i++) {
                 $id = $attributes["ids"][$i];
                 $type = $attributes["types"][$i];
                 switch ($type) {
                     case "message":
                         $message = ProjectMessages::findById($id);
                         if (isset($message) && $message->canEdit(logged_user())) {
                             try {
                                 DB::beginWork();
                                 $message->archive();
                                 ApplicationLogs::createLog($message, $ws, ApplicationLogs::ACTION_ARCHIVE);
                                 DB::commit();
                                 $succ++;
                             } catch (Exception $e) {
                                 DB::rollback();
                                 $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);
             }
             break;
         default:
             $resultMessage = lang("Unimplemented action: '" . $action . "'");
             // if
             $resultCode = 2;
             break;
     }
     // switch
     return array("errorMessage" => $resultMessage, "errorCode" => $resultCode);
 }
 function multi_task_action()
 {
     ajx_current("empty");
     $ids = explode(',', array_var($_POST, 'ids'));
     $action = array_var($_POST, 'action');
     $options = array_var($_POST, 'options');
     if (!is_array($ids) || trim(array_var($_POST, 'ids')) == '' || count($ids) <= 0) {
         flash_error(lang('no items selected'));
         return;
     }
     $tasks = ProjectTasks::findAll(array('conditions' => 'id in (' . implode(',', $ids) . ')'));
     $tasksToReturn = array();
     $showSuccessMessage = true;
     try {
         DB::beginWork();
         foreach ($tasks as $k => $task) {
             switch ($action) {
                 case 'tag':
                     if ($task->canEdit(logged_user())) {
                         $tag = $options;
                         Tags::addObjectTag($tag, $task);
                         ApplicationLogs::createLog($task, $task->getWorkspaces(), ApplicationLogs::ACTION_TAG, false, null, true, $tag);
                         $tasksToReturn[] = $task->getArrayInfo();
                     }
                     break;
                 case 'untag':
                     if ($task->canEdit(logged_user())) {
                         $tag = $options;
                         if ($tag != '') {
                             $task->deleteTag($tag);
                         } else {
                             $task->clearTags();
                         }
                         //ApplicationLogs::createLog($task, $task->getWorkspaces(), ApplicationLogs::ACTION_TAG,false,null,true,$tag);
                         $tasksToReturn[] = $task->getArrayInfo();
                     }
                     break;
                 case 'complete':
                     if ($task->canEdit(logged_user())) {
                         $task->completeTask();
                         $tasksToReturn[] = $task->getArrayInfo();
                     }
                     break;
                 case 'delete':
                     if ($task->canDelete(logged_user())) {
                         $tasksToReturn[] = array('id' => $task->getId());
                         $subtasks = $task->getAllSubtasks();
                         $task->trash();
                         ApplicationLogs::createLog($task, $task->getWorkspaces(), ApplicationLogs::ACTION_TRASH);
                         foreach ($subtasks as $st) {
                             ApplicationLogs::createLog($st, $st->getWorkspaces(), ApplicationLogs::ACTION_TRASH);
                         }
                     }
                     break;
                 case 'archive':
                     if ($task->canEdit(logged_user())) {
                         $tasksToReturn[] = $task->getArrayInfo();
                         $subtasks = $task->getAllSubtasks();
                         $task->archive();
                         ApplicationLogs::createLog($task, $task->getWorkspaces(), ApplicationLogs::ACTION_ARCHIVE);
                         foreach ($subtasks as $st) {
                             ApplicationLogs::createLog($st, $st->getWorkspaces(), ApplicationLogs::ACTION_ARCHIVE);
                         }
                     }
                     break;
                 case 'start_work':
                     if ($task->canEdit(logged_user())) {
                         $task->addTimeslot(logged_user());
                         ApplicationLogs::createLog($task, $task->getWorkspaces(), ApplicationLogs::ACTION_EDIT);
                         $tasksToReturn[] = $task->getArrayInfo();
                         $showSuccessMessage = false;
                     }
                     break;
                 case 'close_work':
                     if ($task->canEdit(logged_user())) {
                         $task->closeTimeslots(logged_user(), array_var($_POST, 'options'));
                         ApplicationLogs::createLog($task, $task->getWorkspaces(), ApplicationLogs::ACTION_EDIT);
                         $tasksToReturn[] = $task->getArrayInfo();
                         $showSuccessMessage = false;
                     }
                     break;
                 case 'pause_work':
                     if ($task->canEdit(logged_user())) {
                         $task->pauseTimeslots(logged_user());
                         $tasksToReturn[] = $task->getArrayInfo();
                         $showSuccessMessage = false;
                     }
                     break;
                 case 'resume_work':
                     if ($task->canEdit(logged_user())) {
                         $task->resumeTimeslots(logged_user());
                         $tasksToReturn[] = $task->getArrayInfo();
                         $showSuccessMessage = false;
                     }
                     break;
                 case 'markasread':
                     $task->setIsRead(logged_user()->getId(), true);
                     $tasksToReturn[] = $task->getArrayInfo();
                     $showSuccessMessage = false;
                     break;
                 case 'markasunread':
                     $task->setIsRead(logged_user()->getId(), false);
                     $tasksToReturn[] = $task->getArrayInfo();
                     $showSuccessMessage = false;
                     break;
                 default:
                     DB::rollback();
                     flash_error(lang('invalid action'));
                     return;
             }
             // end switch
         }
         // end foreach
         DB::commit();
         if (count($tasksToReturn) < count($tasks)) {
             flash_error(lang('tasks updated') . '. ' . lang('some tasks could not be updated due to permission restrictions'));
         } else {
             if ($showSuccessMessage) {
                 flash_success(lang('tasks updated'));
             }
         }
         ajx_extra_data(array('tasks' => $tasksToReturn));
     } catch (Exception $e) {
         DB::rollback();
         flash_error($e->getMessage());
     }
 }
 function do_tag_object($tag, $ids, $manager = null)
 {
     $err = $succ = 0;
     foreach ($ids as $id) {
         if (trim($id) != '') {
             try {
                 if ($manager) {
                     $obj = get_object_by_manager_and_id($id, $manager);
                     Tags::addObjectTag($tag, $obj, $obj->getProject());
                 } else {
                     //call from dashboard, format is manager:id
                     $split = explode(":", $id);
                     $obj = get_object_by_manager_and_id($split[1], $split[0]);
                     Tags::addObjectTag($tag, $obj, $obj->getProject());
                 }
                 if ($obj instanceof ProjectDataObject) {
                     if ($obj->isSearchable()) {
                         $obj->addTagsToSearchableObject();
                     }
                     ApplicationLogs::createLog($obj, $obj->getWorkspaces(), ApplicationLogs::ACTION_TAG, false, null, true, $tag);
                 }
                 $succ++;
             } catch (Exception $e) {
                 $err++;
             }
         }
     }
     return array($succ, $err);
 }