Browse Source

Use FormValidator instead of <form>, replace fckeditor with ckeditor.

See #8968
Julio Montoya 10 years ago
parent
commit
87561658e5

+ 365 - 932
main/announcements/announcements.php

@@ -9,8 +9,6 @@
  *			 Announcements tool and also add the resource linker here. The database also needed refactoring
  *			 as there was no title field (the title was merged into the content field)
  * @package chamilo.announcements
- * @todo make AWACS out of the configuration settings
- * @todo this file is 1300+ lines without any functions -> needs to be split into
  * multiple functions
  */
 
@@ -24,22 +22,23 @@ $use_anonymous = true;
 
 // setting the global file that gets the general configuration, the databases, the languages, ...
 require_once '../inc/global.inc.php';
+
+/*	Sessions */
+
+$ctok = $_SESSION['sec_token'];
+$stok = Security::get_token();
+
 $current_course_tool  = TOOL_ANNOUNCEMENT;
-$this_section=SECTION_COURSES;
+$this_section = SECTION_COURSES;
 $nameTools = get_lang('ToolAnnouncement');
 
-//session
-if(isset($_GET['id_session'])) {
-    $_SESSION['id_session'] = intval($_GET['id_session']);
-}
-
 /* ACCESS RIGHTS */
 api_protect_course_script(true);
 
 // Configuration settings
-$display_announcement_list	 = true;
-$display_form				 = false;
-$display_title_list 		 = true;
+$display_announcement_list = true;
+$display_form = false;
+$display_title_list = true;
 
 // Maximum title messages to display
 $maximum 	= '12';
@@ -48,10 +47,10 @@ $maximum 	= '12';
 $length 	= '36';
 
 // Database Table Definitions
-$tbl_courses			= Database::get_main_table(TABLE_MAIN_COURSE);
-$tbl_sessions			= Database::get_main_table(TABLE_MAIN_SESSION);
-$tbl_announcement		= Database::get_course_table(TABLE_ANNOUNCEMENT);
-$tbl_item_property  	= Database::get_course_table(TABLE_ITEM_PROPERTY);
+$tbl_courses = Database::get_main_table(TABLE_MAIN_COURSE);
+$tbl_sessions = Database::get_main_table(TABLE_MAIN_SESSION);
+$tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
+$tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
 
 $course_id = api_get_course_int_id();
 $_course = api_get_course_info();
@@ -59,148 +58,83 @@ $_course = api_get_course_info();
 /*	Tracking	*/
 Event::event_access_tool(TOOL_ANNOUNCEMENT);
 
-/*	POST TO	*/
-$safe_emailTitle = isset($_POST['emailTitle']) ? $_POST['emailTitle'] : null;
-$safe_newContent = isset($_POST['newContent']) ? $_POST['newContent'] : null;
-
-$content_to_modify = $title_to_modify 	= '';
-
-if (!empty($_POST['To'])) {
-    if (api_get_session_id()!=0 &&
-        api_is_allowed_to_session_edit(false, true) == false
-    ) {
-        api_not_allowed(true);
-    }
-    $display_form = true;
-
-    $form_elements = array(
-        'emailTitle' => $safe_emailTitle,
-        'newContent' => $safe_newContent,
-        'id' => $_POST['id'],
-        'emailoption' => $_POST['email_ann']
-    );
-    $_SESSION['formelements'] = $form_elements;
-
-    $form_elements            	= $_SESSION['formelements'];
-    $title_to_modify            = $form_elements["emailTitle"];
-    $content_to_modify          = $form_elements["newContent"];
-    $announcement_to_modify     = $form_elements["id"];
-}
-
-/*
-	Show/hide user/group form
-*/
-
-$setting_select_groupusers = true;
-if (empty($_POST['To']) and !isset($_SESSION['select_groupusers'])) {
-    $_SESSION['select_groupusers'] = "hide";
-}
-$select_groupusers_status = isset($_SESSION['select_groupusers']) ? $_SESSION['select_groupusers']:null;
-if (!empty($_POST['To']) and ($select_groupusers_status=="hide")) {
-    $_SESSION['select_groupusers'] = "show";
-}
-if (!empty($_POST['To']) and ($select_groupusers_status=="show")) {
-    $_SESSION['select_groupusers'] = "hide";
-}
-
+$announcement_id = isset($_GET['id']) ? intval($_GET['id']) : null;
 $origin = isset($_GET['origin']) ? Security::remove_XSS($_GET['origin']) : null;
+$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : 'list';
 
-/* 	Action handling */
-
-// display the form
-if (((!empty($_GET['action']) && $_GET['action'] == 'add') && $_GET['origin'] == "") ||
-    (!empty($_GET['action']) && $_GET['action'] == 'edit') || !empty($_POST['To'])
-) {
-    if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false,true) == false) {
-        api_not_allowed(true);
-    }
-    $display_form = true;
-}
+$announcement_number = AnnouncementManager::getNumberAnnouncements();
 
-// clear all resources
-if ((empty($originalresource) || ($originalresource!=='no')) and (!empty($action) && $action=='add')) {
-    $_SESSION['formelements']=null;
-}
-
-$htmlHeadXtra[] = AnnouncementManager::to_javascript();
-
-/*	Filter user/group */
-
-if(!empty($_GET['toolgroup'])){
-    if($_GET['toolgroup'] == strval(intval($_GET['toolgroup']))){
-        //check is integer
-        $toolgroup = intval($_GET['toolgroup']);
-        $_SESSION['select_groupusers'] = 'hide';
-    } else {
-        $toolgroup = 0;
-    }
-    Session::write("toolgroup", $toolgroup);
-}
+$homeUrl = api_get_self().'?action=list&'.api_get_cidreq();
+$content = null;
 
-/*	Sessions */
-
-$ctok = $_SESSION['sec_token'];
-$stok = Security::get_token();
-$to = null;
-$email_ann = null;
-
-if (!empty($_SESSION['formelements']) and
-    !empty($_GET['originalresource']) and
-    $_GET['originalresource'] == 'no'
-) {
-    $form_elements			= $_SESSION['formelements'];
-    $title_to_modify		= $form_elements['emailTitle'];
-    $content_to_modify		= $form_elements['newContent'];
-    $announcement_to_modify	= $form_elements['id'];
-    $to						= $form_elements['to'];
-    $email_ann				= $form_elements['emailoption'];
-}
-
-if (!empty($_GET['remind_inactive'])) {
-    $to[] = 'USER:'.intval($_GET['remind_inactive']);
-}
+switch ($action) {
+    case 'move':
+        /* Move announcement up/down */
+        if (isset($_GET['sec_token']) && $ctok == $_GET['sec_token']) {
+            if (!empty($_GET['down'])) {
+                $thisAnnouncementId = intval($_GET['down']);
+                $sortDirection = "DESC";
+            }
 
-$group_id = api_get_group_id();
+            if (!empty($_GET['up'])) {
+                $thisAnnouncementId = intval($_GET['up']);
+                $sortDirection = "ASC";
+            }
+        }
 
-if (!empty($group_id)) {
-    $group_properties  = GroupManager :: get_group_properties($group_id);
-    $interbreadcrumb[] = array("url" => "../group/group.php", "name" => get_lang('Groups'));
-    $interbreadcrumb[] = array("url"=>"../group/group_space.php?gidReq=".$group_id, "name"=> get_lang('GroupSpace').' '.$group_properties['name']);
-}
+        if (!empty($sortDirection)) {
+            if (!in_array(trim(strtoupper($sortDirection)), array('ASC', 'DESC'))) {
+                $sortDirection='ASC';
+            }
 
-$announcement_id = isset($_GET['id']) ? intval($_GET['id']) : null;
-$message = null;
+            $announcementInfo = AnnouncementManager::get_by_id($course_id, $thisAnnouncementId);
 
-if (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath') {
-    //we are not in the learning path
-    Display::display_header($nameTools,get_lang('Announcements'));
-}
-
-if (api_is_allowed_to_edit(false,true) OR
-    (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
-) {
-    /*
-        Change visibility of announcement
-    */
-    // $_GET['isStudentView']<>"false" is added to prevent that the visibility
-    // is changed after you do the following:
-    // change visibility -> studentview -> course manager view
-    if (!isset($_GET['isStudentView']) || $_GET['isStudentView']!='false') {
-        if (isset($_GET['id']) AND $_GET['id'] AND isset($_GET['action']) AND $_GET['action']=="showhide") {
-            if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false,true)==false) {
-                api_not_allowed();
-            }
-            if (!api_is_course_coach() || api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $_GET['id'])) {
-                if ($ctok == $_GET['sec_token']) {
-                    AnnouncementManager::change_visibility_announcement($_course, $_GET['id']);
-                    $message = get_lang('VisibilityChanged');
+            $sql = "SELECT DISTINCT announcement.id, announcement.display_order
+                FROM $tbl_announcement announcement,
+				$tbl_item_property itemproperty
+				WHERE
+				    announcement.c_id =  $course_id AND
+				    itemproperty.c_id =  $course_id AND
+					itemproperty.ref = announcement.id AND
+                    itemproperty.tool = '".TOOL_ANNOUNCEMENT."'  AND
+                    itemproperty.visibility <> 2
+                ORDER BY display_order $sortDirection";
+            $result = Database::query($sql);
+            $thisAnnouncementOrderFound = false;
+            $thisAnnouncementOrder = null;
+
+            while (list($announcementId, $announcementOrder) = Database::fetch_row($result)) {
+                if ($thisAnnouncementOrderFound) {
+                    $nextAnnouncementId = $announcementId;
+                    $nextAnnouncementOrder = $announcementOrder;
+                    $sql = "UPDATE $tbl_announcement SET display_order = '$nextAnnouncementOrder'
+                            WHERE c_id = $course_id AND id = $thisAnnouncementId";
+                    Database::query($sql);
+                    $sql = "UPDATE $tbl_announcement  SET display_order = '$thisAnnouncementOrder'
+                            WHERE c_id = $course_id AND id =  $nextAnnouncementId";
+
+                    Database::query($sql);
+                    break;
+                }
+                // STEP 1 : FIND THE ORDER OF THE ANNOUNCEMENT
+                if ($announcementId == $thisAnnouncementId) {
+                    $thisAnnouncementOrder = $announcementOrder;
+                    $thisAnnouncementOrderFound = true;
                 }
             }
+            Display::addFlash(Display::return_message(get_lang('AnnouncementMoved')));
+            header('Location: '.$homeUrl);
+            exit;
         }
-    }
-
-    /* Delete announcement */
-    if (!empty($_GET['action']) && $_GET['action']=='delete' && isset($_GET['id'])) {
+        break;
+    case 'view':
+        $content = AnnouncementManager::display_announcement($announcement_id);
+        break;
+    case 'list':
+        $content = AnnouncementManager::getAnnouncements($stok, $announcement_number);
+        break;
+    case 'delete':
+        /* Delete announcement */
         $id = intval($_GET['id']);
         if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false, true) == false) {
             api_not_allowed();
@@ -210,361 +144,353 @@ if (api_is_allowed_to_edit(false,true) OR
             // tooledit : visibility = 2 : only visible for platform administrator
             if ($ctok == $_GET['sec_token']) {
                 AnnouncementManager::delete_announcement($_course, $id);
-
-                $id = null;
-                $emailTitle = null;
-                $newContent = null;
-                $message = get_lang('AnnouncementDeleted');
+                Display::addFlash(Display::return_message(get_lang('AnnouncementDeleted')));
             }
         }
-    }
-
-    //delete attachment file
-    if (isset($_GET['action']) && $_GET['action'] == 'delete_attachment') {
+        header('Location: '.$homeUrl);
+        exit;
+        break;
+    case 'delete_all':
+        if (api_is_allowed_to_edit()) {
+            AnnouncementManager::delete_all_announcements($_course);
+            Display::addFlash(Display::return_message(get_lang('AnnouncementDeletedAll')));
+            header('Location: '.$homeUrl);
+            exit;
+        }
+        break;
+    case 'delete_attachment':
         $id = $_GET['id_attach'];
         if ($ctok == $_GET['sec_token']) {
             if (api_is_allowed_to_edit()) {
                 AnnouncementManager::delete_announcement_attachment_file($id);
             }
         }
-    }
+        header('Location: '.$homeUrl);
+        exit;
+        break;
+    case 'showhide':
+        if (!isset($_GET['isStudentView']) || $_GET['isStudentView'] != 'false') {
+            if (isset($_GET['id']) AND $_GET['id']) {
+                if (api_get_session_id() != 0 &&
+                    api_is_allowed_to_session_edit(false, true) == false) {
+                    api_not_allowed();
+                }
 
-    /* Delete all announcements */
-    if (!empty($_GET['action']) and $_GET['action']=='delete_all') {
-        if (api_is_allowed_to_edit()) {
-            AnnouncementManager::delete_all_announcements($_course);
-            $id = null;
-            $emailTitle = null;
-            $newContent = null;
-            $message = get_lang('AnnouncementDeletedAll');
+                if (!api_is_course_coach() ||
+                    api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $_GET['id'])
+                ) {
+                    if ($ctok == $_GET['sec_token']) {
+                        AnnouncementManager::change_visibility_announcement(
+                            $_course,
+                            $_GET['id']
+                        );
+                        Display::addFlash(Display::return_message(get_lang('VisibilityChanged')));
+                        header('Location: '.$homeUrl);
+                        exit;
+                    }
+                }
+            }
         }
-    }
-
-    /* Modify announcement */
-    if (!empty($_GET['action']) and $_GET['action']=='modify' AND isset($_GET['id'])) {
-        if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false,true)==false) {
-            api_not_allowed();
+        break;
+    case 'add':
+    case 'modify':
+        if (api_get_session_id() != 0 &&
+            api_is_allowed_to_session_edit(false, true) == false
+        ) {
+            api_not_allowed(true);
         }
 
-        $display_form = true;
+        // DISPLAY ADD ANNOUNCEMENT COMMAND
+        $id = isset($_GET['id']) ? intval($_GET['id']) : 0;
+        $url = api_get_self().'?action='.$action.'&id=' . $id . '&' . api_get_cidreq();
 
-        // RETRIEVE THE CONTENT OF THE ANNOUNCEMENT TO MODIFY
-        $id = intval($_GET['id']);
+        $form = new FormValidator(
+            'f1',
+            'post',
+            $url,
+            null,
+            array('enctype' => 'multipart/form-data')
+        );
 
-        if (!api_is_course_coach() || api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $id)) {
-            $sql = "SELECT * FROM  $tbl_announcement WHERE c_id = $course_id AND id = '$id'";
-            $rs 	= Database::query($sql);
-            $myrow  = Database::fetch_array($rs);
-            $last_id = $id;
-            $userUpload = isset($_FILES['user_upload']) ? $_FILES['user_upload'] : null;
-            $edit_attachment = AnnouncementManager::edit_announcement_attachment_file(
-                $last_id,
-                $userUpload,
-                $file_comment
-            );
-
-            if ($myrow) {
-                $announcement_to_modify 	= $myrow['id'];
-                $content_to_modify 			= $myrow['content'];
-                $title_to_modify 			= $myrow['title'];
-
-                if ($originalresource!=="no")  {
-                    $to = AnnouncementManager::load_edit_users("announcement", $announcement_to_modify);
+        if (empty($id)) {
+            $form_name = get_lang('AddAnnouncement');
+        } else {
+            $form_name = get_lang('ModifyAnnouncement');
+        }
+        $form->addElement('header', $form_name);
+
+        if (empty($group_id)) {
+            if (isset($_GET['remind_inactive'])) {
+                $email_ann = '1';
+                $content_to_modify = sprintf(
+                    get_lang('RemindInactiveLearnersMailContent'),
+                    api_get_setting('siteName'),
+                    7
+                );
+                $title_to_modify = sprintf(
+                    get_lang('RemindInactiveLearnersMailSubject'),
+                    api_get_setting('siteName')
+                );
+            } elseif (isset($_GET['remindallinactives']) && $_GET['remindallinactives'] == 'true') {
+                // we want to remind inactive users. The $_GET['since'] parameter
+                // determines which users have to be warned (i.e the users who have been inactive for x days or more
+                $since = isset($_GET['since']) ? intval($_GET['since']) : 6;
+                // getting the users who have to be reminded
+                $to = Tracking:: get_inactives_students_in_course(
+                    api_get_course_int_id(),
+                    $since,
+                    api_get_session_id()
+                );
+                // setting the variables for the form elements: the users who need to receive the message
+                foreach ($to as &$user) {
+                    $user = 'USER:' . $user;
+                }
+                // setting the variables for the form elements: the message has to be sent by email
+                $email_ann = '1';
+                // setting the variables for the form elements: the title of the email
+                $title_to_modify = sprintf(
+                    get_lang('RemindInactiveLearnersMailSubject'),
+                    api_get_setting('siteName')
+                );
+                // setting the variables for the form elements: the message of the email
+                $content_to_modify = sprintf(
+                    get_lang('RemindInactiveLearnersMailContent'),
+                    api_get_setting('siteName'),
+                    $since
+                );
+                // when we want to remind the users who have never been active
+                // then we have a different subject and content for the announcement
+                if ($_GET['since'] == 'never') {
+                    $title_to_modify = sprintf(
+                        get_lang('RemindInactiveLearnersMailSubject'),
+                        api_get_setting('siteName')
+                    );
+                    $content_to_modify = get_lang(
+                        'YourAccountIsActiveYouCanLoginAndCheckYourCourses'
+                    );
                 }
-                $display_announcement_list = false;
             }
 
-            if ($to=="everyone" OR !empty($group_id)) {
-                $_SESSION['select_groupusers']="hide";
-            } else {
-                $_SESSION['select_groupusers']="show";
+            CourseManager::addUserGroupMultiSelect($form, array());
+            if (!isset($announcement_to_modify)) {
+                $announcement_to_modify = '';
+            }
+            $form->addElement(
+                'checkbox',
+                'email_ann',
+                null,
+                get_lang('EmailOption')
+            );
+        } else {
+            if (!isset($announcement_to_modify)) {
+                $announcement_to_modify = "";
             }
+            CourseManager::addGroupMultiSelect($form, $group_id, array());
+            $form->addElement(
+                'checkbox',
+                'email_ann',
+                null,
+                get_lang('EmailOption')
+            );
         }
-    }
 
-    /* Move announcement up/down */
-    if (isset($_GET['sec_token']) && $ctok == $_GET['sec_token']) {
-        if (!empty($_GET['down'])) {
-            $thisAnnouncementId = intval($_GET['down']);
-            $sortDirection = "DESC";
-        }
+        $announcementInfo = AnnouncementManager::get_by_id($course_id, $id);
 
-        if (!empty($_GET['up'])) {
-            $thisAnnouncementId = intval($_GET['up']);
-            $sortDirection = "ASC";
-        }
-    }
+        if (isset($announcementInfo) && !empty($announcementInfo)) {
+            $to = AnnouncementManager::load_edit_users("announcement", $id);
 
-    if (!empty($sortDirection)) {
-        if (!in_array(trim(strtoupper($sortDirection)), array('ASC', 'DESC'))) {
-            $sortDirection='ASC';
+            $defaults = array(
+                'title' => $announcementInfo['title'],
+                'content' => $announcementInfo['content'],
+                'id' => $announcementInfo['id'],
+                'users' => $to
+            );
+        } else {
+            $defaults = array();
         }
 
-        $sql = "SELECT announcement.id, announcement.display_order
-                FROM $tbl_announcement announcement,
-				$tbl_item_property itemproperty
-				WHERE
-				    announcement.c_id =  $course_id AND
-				    itemproperty.c_id =  $course_id AND
-					itemproperty.ref=announcement.id AND
-                    itemproperty.tool='".TOOL_ANNOUNCEMENT."'  AND
-                    itemproperty.visibility<>2
-                ORDER BY display_order $sortDirection";
-        $result = Database::query($sql);
-
-        while (list ($announcementId, $announcementOrder) = Database::fetch_row($result)) {
-            // STEP 2 : FOUND THE NEXT ANNOUNCEMENT ID AND ORDER.
-            //          COMMIT ORDER SWAP ON THE DB
-            if ($thisAnnouncementOrderFound) {
-                $nextAnnouncementId = $announcementId;
-                $nextAnnouncementOrder = $announcementOrder;
-                Database::query("UPDATE $tbl_announcement SET display_order = '$nextAnnouncementOrder'  WHERE c_id = $course_id AND id =  '$thisAnnouncementId'");
-                Database::query("UPDATE $tbl_announcement  SET display_order = '$thisAnnouncementOrder' WHERE c_id = $course_id AND id =  '$nextAnnouncementId.'");
-                break;
-            }
-            // STEP 1 : FIND THE ORDER OF THE ANNOUNCEMENT
-            if ($announcementId == $thisAnnouncementId) {
-                $thisAnnouncementOrder = $announcementOrder;
-                $thisAnnouncementOrderFound = true;
-            }
+        $form->addElement('text', 'title', get_lang('EmailTitle'));
+        $form->addElement('hidden', 'id');
+        $form->add_html_editor(
+            'content',
+            get_lang('Description'),
+            false,
+            false,
+            array('ToolbarSet' => 'Announcements')
+        );
+
+        $form->addElement('file', 'user_upload', get_lang('AddAnAttachment'));
+        $form->addElement('textarea', 'file_comment', get_lang('FileComment'));
+        $form->addElement('hidden', 'sec_token', $stok);
+
+        if (api_get_session_id() == 0) {
+            $form->addCheckBox('send_to_users_in_session', null, get_lang('SendToUsersInSessions'));
         }
-        // show message
-        $message = get_lang('AnnouncementMoved');
-    }
 
-    /* Submit announcement */
+        $form->addButton('save', get_lang('ButtonPublishAnnouncement'));
+        $form->setDefaults($defaults);
 
-    $emailTitle = (!empty($_POST['emailTitle'])?$safe_emailTitle:'');
-    $newContent = (!empty($_POST['newContent'])?$safe_newContent:'');
-    $submitAnnouncement = isset($_POST['submitAnnouncement'])?$_POST['submitAnnouncement']:0;
+        $content = $form->return_form();
 
-    $id = 0;
-    if (!empty($_POST['id'])) {
-        $id=intval($_POST['id']);
-    }
+        if ($form->validate()) {
+            $data = $form->getSubmitValues();
 
-    if ($submitAnnouncement && empty($emailTitle)) {
-        $error_message = get_lang('TitleIsRequired');
-        $content_to_modify = $newContent;
-    } else if ($submitAnnouncement) {
-        $sendToUsersInSession = isset($_POST['send_to_users_in_session']) ? true : false;
-
-        if (isset($id) && $id) {
-            // there is an Id => the announcement already exists => update mode
-            if ($ctok == $_POST['sec_token']) {
-                $file_comment = $_POST['file_comment'];
-                $file = $_FILES['user_upload'];
-                AnnouncementManager::edit_announcement(
-                    $id,
-                    $emailTitle,
-                    $newContent,
-                    $_POST['selectedform'],
-                    $file,
-                    $file_comment,
-                    $sendToUsersInSession
-                );
+            $sendToUsersInSession = isset($data['send_to_users_in_session']) ? true : false;
 
-                /*		MAIL FUNCTION	*/
-                if ($_POST['email_ann'] && empty($_POST['onlyThoseMails'])) {
-                    AnnouncementManager::send_email($id, $sendToUsersInSession);
-                }
-                $message = get_lang('AnnouncementModified');
-            }
-        } else {
-            //insert mode
-            if ($ctok == $_POST['sec_token']) {
-                $file = $_FILES['user_upload'];
-                $file_comment = $_POST['file_comment'];
-                if (!empty($group_id)) {
-                    $insert_id = AnnouncementManager::add_group_announcement(
-                        $safe_emailTitle,
-                        $safe_newContent,
-                        array('GROUP:' . $group_id),
-                        $_POST['selectedform'],
-                        $file,
-                        $file_comment,
-                        $sendToUsersInSession
-                    );
-                } else {
-                    $insert_id = AnnouncementManager::add_announcement(
-                        $safe_emailTitle,
-                        $safe_newContent,
+            if (isset($id) && $id) {
+                // there is an Id => the announcement already exists => update mode
+                if ($ctok == $_POST['sec_token']) {
+                    $file_comment = $_POST['file_comment'];
+                    $file = $_FILES['user_upload'];
+
+                    AnnouncementManager::edit_announcement(
+                        $id,
+                        $data['title'],
+                        $data['content'],
                         $_POST['selectedform'],
                         $file,
                         $file_comment,
                         $sendToUsersInSession
                     );
-                }
-                //store_resources($_SESSION['source_type'],$insert_id);
-                $_SESSION['select_groupusers']="hide";
-                $message = get_lang('AnnouncementAdded');
 
-                /* MAIL FUNCTION */
-                if ($_POST['email_ann'] && empty($_POST['onlyThoseMails'])) {
-                    AnnouncementManager::send_email($insert_id, $sendToUsersInSession);
+                    /*		MAIL FUNCTION	*/
+                    if ($_POST['email_ann'] && empty($_POST['onlyThoseMails'])) {
+                        AnnouncementManager::send_email($id, $sendToUsersInSession);
+                    }
+                    Display::addFlash(Display::return_message(get_lang('AnnouncementModified'), 'success'));
+                    header('Location: '.$homeUrl);
+                    exit;
                 }
+            } else {
+                // Insert mode
+                if ($ctok == $_POST['sec_token']) {
+                    $file = $_FILES['user_upload'];
+                    $file_comment = $data['file_comment'];
+
+                    if (empty($group_id)) {
+                        $insert_id = AnnouncementManager::add_announcement(
+                            $data['title'],
+                            $data['content'],
+                            $data['users'],
+                            $file,
+                            $file_comment,
+                            $sendToUsersInSession
+                        );
+                    } else {
+                        $insert_id = AnnouncementManager::add_group_announcement(
+                            $data['title'],
+                            $data['content'],
+                            array('GROUP:' . $group_id),
+                            $data['users'],
+                            $file,
+                            $file_comment,
+                            $sendToUsersInSession
+                        );
+                    }
+                    Display::addFlash(
+                        Display::return_message(
+                            get_lang('AnnouncementAdded'),
+                            'success'
+                        )
+                    );
 
-            } // end condition token
-        }	// isset
-
-        // UNSET VARIABLES
-        unset($form_elements);
-        $_SESSION['formelements']=null;
-
-        $newContent = null;
-        $emailTitle = null;
-
-        unset($emailTitle);
-        unset($newContent);
-        unset($content_to_modify);
-        unset($title_to_modify);
+                    /* MAIL FUNCTION */
+                    if (isset($data['email_ann']) && $data['email_ann']) {
+                        AnnouncementManager::send_email($insert_id, $sendToUsersInSession);
+                    }
+                    header('Location: '.$homeUrl);
+                    exit;
 
-    }	// if $submit Announcement
+                } // end condition token
+            }
+        }
+        break;
 }
 
-/*  	Tool introduction  */
-
-if (empty($_GET['origin']) || $_GET['origin'] !== 'learnpath') {
-    Display::display_introduction_section(TOOL_ANNOUNCEMENT);
+if (!empty($_GET['remind_inactive'])) {
+    $to[] = 'USER:'.intval($_GET['remind_inactive']);
 }
+/*
+if (api_is_allowed_to_edit(false,true) OR
+    (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
+) {
 
-/* DISPLAY LEFT COLUMN */
-
-//condition for the session
-$session_id = api_get_session_id();
-$condition_session = api_get_session_condition($session_id, true, true);
-
-if (api_is_allowed_to_edit(false,true))  {
-    // check teacher status
-    if (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath') {
-
-        if (api_get_group_id() == 0) {
-            $group_condition = "";
-        } else {
-            $group_condition = " AND (ip.to_group_id='".api_get_group_id()."' OR ip.to_group_id = 0)";
+    //
+    if (!empty($_GET['action']) and $_GET['action']=='modify' AND isset($_GET['id'])) {
+        if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false,true)==false) {
+            api_not_allowed();
         }
-        $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
-				FROM $tbl_announcement announcement, $tbl_item_property ip
-				WHERE   announcement.c_id   = $course_id AND
-                        ip.c_id             = $course_id AND
-                        announcement.id     = ip.ref AND
-                        ip.tool             = 'announcement' AND
-                        ip.visibility       <> '2'
-                        $group_condition
-                        $condition_session
-				GROUP BY ip.ref
-				ORDER BY display_order DESC
-				LIMIT 0,$maximum";
-    }
-} else {
-    // students only get to see the visible announcements
-    if (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath') {
-        $group_memberships = GroupManager::get_group_ids($_course['real_id'], $_user['user_id']);
 
-        if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
+        // RETRIEVE THE CONTENT OF THE ANNOUNCEMENT TO MODIFY
+        $id = intval($_GET['id']);
 
-            if (api_get_group_id() == 0) {
-                $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR ( ip.to_user_id='".$_user['user_id']."'" .
-                    "OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))) ";
-            } else {
-                $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."'
-                OR ip.to_group_id IN (0, ".api_get_group_id()."))";
-            }
-        } else {
-            if (api_get_group_id() == 0) {
-                $cond_user_id = " AND ( ip.to_user_id='".$_user['user_id']."'" .
-                    "OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ";
-            } else {
-                $cond_user_id = " AND ( ip.to_user_id='".$_user['user_id']."'" .
-                    "OR ip.to_group_id IN (0, ".api_get_group_id().")) ";
-            }
-        }
+        if (!api_is_course_coach() || api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $id)) {
+            $sql = "SELECT * FROM  $tbl_announcement WHERE c_id = $course_id AND id = '$id'";
+            $rs 	= Database::query($sql);
+            $myrow  = Database::fetch_array($rs);
+            $last_id = $id;
+            $userUpload = isset($_FILES['user_upload']) ? $_FILES['user_upload'] : null;
+            $edit_attachment = AnnouncementManager::edit_announcement_attachment_file(
+                $last_id,
+                $userUpload,
+                $file_comment
+            );
 
-        // the user is member of several groups => display personal announcements AND his group announcements AND the general announcements
-        if (is_array($group_memberships) && count($group_memberships)>0) {
-            $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
-                    FROM $tbl_announcement announcement, $tbl_item_property ip
-                    WHERE
-                        announcement.c_id = $course_id AND
-                        ip.c_id = $course_id AND
-                        announcement.id = ip.ref AND
-                        ip.tool='announcement'
-                        AND ip.visibility='1'
-                        $cond_user_id
-                        $condition_session
-                    GROUP BY ip.ref
-                    ORDER BY display_order DESC
-                    LIMIT 0, $maximum";
-        } else {
-            // the user is not member of any group
-            // this is an identified user => show the general announcements AND his personal announcements
-            if ($_user['user_id']) {
-
-                if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-                    $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR ( ip.to_user_id='".$_user['user_id']."' OR ip.to_group_id='0')) ";
-                } else {
-                    $cond_user_id = " AND ( ip.to_user_id='".$_user['user_id']."' OR ip.to_group_id='0') ";
-                }
-                $sql="SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
-                    FROM $tbl_announcement announcement, $tbl_item_property ip
-                    WHERE
-                        announcement.c_id = $course_id AND
-                        ip.c_id = $course_id AND
-                        announcement.id = ip.ref
-                        AND ip.tool='announcement'
-                        AND ip.visibility='1'
-                        $cond_user_id
-                        $condition_session
-                    GROUP BY ip.ref
-                    ORDER BY display_order DESC
-                    LIMIT 0, $maximum";
-            } else {
+            if ($myrow) {
+                $announcement_to_modify 	= $myrow['id'];
+                $content_to_modify 			= $myrow['content'];
+                $title_to_modify 			= $myrow['title'];
 
-                if (api_get_course_setting('allow_user_edit_announcement')) {
-                    $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR ip.to_group_id='0') ";
-                } else {
-                    $cond_user_id = " AND ip.to_group_id='0' ";
+                if ($originalresource!=="no")  {
+                    $to = AnnouncementManager::load_edit_users("announcement", $announcement_to_modify);
                 }
-
-                // the user is not identiefied => show only the general announcements
-                $sql="SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
-                    FROM $tbl_announcement announcement, $tbl_item_property ip
-                    WHERE
-                        announcement.c_id = $course_id AND
-                        ip.c_id = $course_id AND
-                        announcement.id = ip.ref
-                        AND ip.tool='announcement'
-                        AND ip.visibility='1'
-                        AND ip.to_group_id='0'
-                        $condition_session
-                    GROUP BY ip.ref
-                    ORDER BY display_order DESC
-                    LIMIT 0,$maximum";
+                $display_announcement_list = false;
             }
         }
     }
+}*/
+
+$htmlHeadXtra[] = AnnouncementManager::to_javascript();
+
+$group_id = api_get_group_id();
+
+if (!empty($group_id)) {
+    $group_properties  = GroupManager :: get_group_properties($group_id);
+    $interbreadcrumb[] = array("url" => "../group/group.php?".api_get_cidreq(), "name" => get_lang('Groups'));
+    $interbreadcrumb[] = array("url"=>"../group/group_space.php?".api_get_cidreq(), "name"=> get_lang('GroupSpace').' '.$group_properties['name']);
 }
 
-$result = Database::query($sql);
-$announcement_number = Database::num_rows($result);
 
-/*
-	ADD ANNOUNCEMENT / DELETE ALL
-*/
+if (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath') {
+    //we are not in the learning path
+    Display::display_header($nameTools,get_lang('Announcements'));
+}
 
+// Tool introduction
+if (empty($_GET['origin']) || $_GET['origin'] !== 'learnpath') {
+    Display::display_introduction_section(TOOL_ANNOUNCEMENT);
+}
+
+// Actions
 $show_actions = false;
-if ((api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) and (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath')) {
+if ((api_is_allowed_to_edit(false,true) OR
+    (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) and
+    (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath')
+) {
     echo '<div class="actions">';
     if (isset($_GET['action']) && in_array($_GET['action'], array('add', 'modify','view'))) {
-        echo "<a href='".api_get_self()."?".api_get_cidreq()."&origin=".$origin."'>".Display::return_icon('back.png',get_lang('Back'),'',ICON_SIZE_MEDIUM)."</a>";
+        echo "<a href='".api_get_self()."?".api_get_cidreq()."&origin=".$origin."'>".
+            Display::return_icon('back.png',get_lang('Back'),'',ICON_SIZE_MEDIUM)."</a>";
     } else {
-        echo "<a href='".api_get_self()."?".api_get_cidreq()."&action=add&origin=".$origin."'>".Display::return_icon('new_announce.png',get_lang('AddAnnouncement'),'',ICON_SIZE_MEDIUM)."</a>";
+        echo "<a href='".api_get_self()."?".api_get_cidreq()."&action=add&origin=".$origin."'>".
+            Display::return_icon('new_announce.png',get_lang('AddAnnouncement'),'',ICON_SIZE_MEDIUM)."</a>";
     }
     $show_actions = true;
 } else {
     if (in_array($_GET['action'], array('view'))) {
         echo '<div class="actions">';
-        echo "<a href='".api_get_self()."?".api_get_cidreq()."&origin=".$origin."'>".Display::return_icon('back.png',get_lang('Back'),'',ICON_SIZE_MEDIUM)."</a>";
+        echo "<a href='".api_get_self()."?".api_get_cidreq()."&origin=".$origin."'>".
+            Display::return_icon('back.png',get_lang('Back'),'',ICON_SIZE_MEDIUM)."</a>";
         echo '</div>';
     }
 }
@@ -577,509 +503,16 @@ if (api_is_allowed_to_edit() && $announcement_number > 1) {
             echo "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=delete_all\" onclick=\"javascript:if(!confirm('".get_lang("ConfirmYourChoice")."')) return false;\">".
                 Display::return_icon('delete_announce.png',get_lang('AnnouncementDeleteAll'),'',ICON_SIZE_MEDIUM)."</a>";
         }
-    }	// if announcementNumber > 1
+    }
 }
 
 if ($show_actions)
     echo '</div>';
 
+Display::showFlash();
 
-//	ANNOUNCEMENTS LIST
-
-if ($message) {
-    Display::display_confirmation_message($message);
-    $display_announcement_list = true;
-    $display_form             = false;
-}
-if (!empty($error_message)) {
-    Display::display_error_message($error_message);
-    $display_announcement_list = false;
-    $display_form             = true;
-}
-
-/*
-		DISPLAY FORM
-*/
-
-if ($display_form) {
-
-    $content_to_modify 	= stripslashes($content_to_modify);
-    $title_to_modify 	= stripslashes($title_to_modify);
-
-    // DISPLAY ADD ANNOUNCEMENT COMMAND
-    $id = isset($_GET['id']) ? intval($_GET['id']) : 0;
-    echo '<form class="form-horizontal" method="post" name="f1" enctype = "multipart/form-data" action="'.api_get_self().'?id='.$id.'&'.api_get_cidreq().'" style="margin:0px;">';
-    if (empty($_GET['id'])) {
-        $form_name = get_lang('AddAnnouncement');
-    } else {
-        $form_name = get_lang('ModifyAnnouncement');
-    }
-    echo '<legend>'.$form_name.'</legend>';
-
-    //this variable defines if the course administrator can send a message to a specific user / group or not
-    //@todo use formvalidator
-
-    if (empty($group_id)) {
-        echo '	<div class="control-group">
-					<label class="control-label">'.
-            Display::return_icon('group.png', get_lang('ModifyRecipientList'), array ('align' => 'absmiddle'),ICON_SIZE_SMALL).' '.get_lang('SentTo').'
-					</label>
-					<div class="controls">';
-
-        if (isset($_GET['remind_inactive'])) {
-            $email_ann = '1';
-            $_SESSION['select_groupusers']="show";
-            $content_to_modify = sprintf(get_lang('RemindInactiveLearnersMailContent'), api_get_setting('siteName'), 7);
-            $title_to_modify = sprintf(get_lang('RemindInactiveLearnersMailSubject'), api_get_setting('siteName'));
-        } elseif (isset($_GET['remindallinactives']) && $_GET['remindallinactives']=='true') {
-            // we want to remind inactive users. The $_GET['since'] parameter determines which users have to be warned (i.e the users who have been inactive for x days or more
-            $since = isset($_GET['since']) ? intval($_GET['since']) : 6;
-            // getting the users who have to be reminded
-            $to = Tracking :: get_inactives_students_in_course($_course['id'],$since, api_get_session_id());
-            // setting the variables for the form elements: the users who need to receive the message
-            foreach($to as &$user) {
-                $user = 'USER:'.$user;
-            }
-            // setting the variables for the form elements: the 'visible to' form element has to be expanded
-            $_SESSION['select_groupusers']="show";
-            // setting the variables for the form elements: the message has to be sent by email
-            $email_ann = '1';
-            // setting the variables for the form elements: the title of the email
-            //$title_to_modify = sprintf(get_lang('RemindInactiveLearnersMailSubject'), api_get_setting('siteName'),' > ',$_course['name']);
-            $title_to_modify = sprintf(get_lang('RemindInactiveLearnersMailSubject'), api_get_setting('siteName'));
-            // setting the variables for the form elements: the message of the email
-            //$content_to_modify = sprintf(get_lang('RemindInactiveLearnersMailContent'),api_get_setting('siteName'),' > ',$_course['name'],$since);
-            $content_to_modify = sprintf(get_lang('RemindInactiveLearnersMailContent'),api_get_setting('siteName'),$since);
-            // when we want to remind the users who have never been active then we have a different subject and content for the announcement
-            if ($_GET['since'] == 'never') {
-                $title_to_modify = sprintf(get_lang('RemindInactiveLearnersMailSubject'), api_get_setting('siteName'));
-                $content_to_modify = get_lang('YourAccountIsActiveYouCanLoginAndCheckYourCourses');
-            }
-        }
-        AnnouncementManager::show_to_form($to);
-        echo '		</div>
-					</div>';
-
-        if (api_get_session_id() == 0) {
-            echo '<div class="control-group"><div class="controls">';
-            echo '<label class="checkbox" ><input name="send_to_users_in_session" type="checkbox" />'.get_lang('SendToUsersInSessions').'</label>';
-            echo '</div></div>';
-        }
-
-        if (!isset($announcement_to_modify) ) $announcement_to_modify ='';
-
-        ($email_ann=='1')?$checked='checked':$checked='';
-        echo '	<div class="control-group">
-                    <div class="controls">
-                        <label class="checkbox" for="email_ann">
-                            <input id="email_ann" class="checkbox" type="checkbox" value="1" name="email_ann" checked> '.get_lang('EmailOption').'</label>
-                    </div>
-                </div>';
-
-
-    } else {
-        if (!isset($announcement_to_modify) ) {
-            $announcement_to_modify ="";
-        }
-
-        ($email_ann=='1' || !empty($surveyid))?$checked='checked':$checked='';
-        echo '<div class="control-group">
-              <div class="controls">
-              <input class="checkbox" type="checkbox" value="1" name="email_ann" '.$checked.'>
-              '.get_lang('EmailOption').': <span id="recipient_overview">'.get_lang('MyGroup').'</span>
-              <a href="#" onclick="toggle_sendto();">'.get_lang('ModifyRecipientList').'</a>';
-        AnnouncementManager::show_to_form_group($group_id);
-        echo '</div></div>';
-    }
-
-    // the announcement title
-    echo '	<div class="control-group">
-				<div id="msg_error" style="display:none;color:red;margin-left:20%"></div>
-				<label class="control-label">
-					<span class="form_required">*</span> '.get_lang('EmailTitle').'
-				</label>
-				<div class="controls">
-					<input type="text" id="emailTitle" name="emailTitle" value="'.Security::remove_XSS($title_to_modify).'" class="span4">
-				</div>
-			</div>';
-
-    unset($title_to_modify);
-    $title_to_modify = null;
-
-    if (!isset($announcement_to_modify) ) $announcement_to_modify ="";
-    if (!isset($content_to_modify) ) 		$content_to_modify ="";
-    if (!isset($title_to_modify)) 		$title_to_modify = "";
-
-    echo '<input type="hidden" name="id" value="'.$announcement_to_modify.'" />';
-    // @todo use formvalidator
-    $oFCKeditor = new Editor();
-	$oFCKeditor->Width		= '100%';
-	$oFCKeditor->Height		= '300';
-
-    if(!api_is_allowed_to_edit()) {
-        $oFCKeditor->ToolbarSet = "AnnouncementsStudent";
-    } else {
-        $oFCKeditor->ToolbarSet = "Announcements";
-    }
-
-    $oFCKeditor->Value		= $content_to_modify;
-
-    echo '<div class="row"><div class="formw">';
-
-    echo Display::display_normal_message(get_lang('Tags').' <br /><br />'.implode('<br />', AnnouncementManager::get_tags()), false);
-
-
-	//echo $oFCKeditor->CreateHtml();
-    echo $oFCKeditor->editor('newContent', $oFCKeditor->Value);
-	echo '</div></div>';
-
-
-    //File attachment
-    echo '	<div class="control-group">
-				<div class="controls">
-				    <a href="javascript://" onclick="return plus_attachment();"><span id="plus"><img style="vertical-align:middle;" src="../img/div_show.gif" alt="" />&nbsp;'.get_lang('AddAnAttachment').'</span></a>
-				    <br />
-					<table id="options" style="display: none;">
-					<tr>
-						<td colspan="2">
-					        <label for="file_name">'.get_lang('FileName').'&nbsp;</label>
-					        <input type="file" name="user_upload"/>
-					    </td>
-					 </tr>
-					 <tr>
-					    <td colspan="2">
-					    	<label for="comment">'.get_lang('FileComment').'</label><br />
-					    	<textarea name="file_comment" rows ="4" cols = "34" ></textarea>
-					    </td>
-				    </tr>
-			    </table>
-			 </div>
-			</div>';
-
-    echo'<br />';
-    echo '<div class="row"><div class="formw">';
-
-    if (empty($group_id)) {
-        echo '<input type="hidden" name="submitAnnouncement" value="OK">';
-        echo '<input type="hidden" name="sec_token" value="'.$stok.'" />';
-        echo '<button class="btn save" type="button"  value="'.'  '.get_lang('Send').'  '.'" onclick="selectAll(this.form.elements[4],true)" >'.get_lang('ButtonPublishAnnouncement').'</button><br /><br />';
-    } else {
-        echo '<input type="hidden" name="submitAnnouncement" value="OK">';
-        echo '<input type="hidden" name="sec_token" value="'.$stok.'" />';
-        echo '<button class="btn save" type="button"  value="'.'  '.get_lang('Send').'  '.'" onclick="selectAll(this.form.elements[4],true)" >'.get_lang('ButtonPublishAnnouncement').'</button><br /><br />';
-    }
-    echo '</div></div>';
-    echo '</form><br />';
-
-    if ((isset($_GET['action']) && isset($_GET['id']) && is_array($to))||isset($_GET['remindallinactives'])||isset($_GET['remind_inactive'])) {
-        echo '<script>toggle_sendto();</script>';
-    }
-
-} // end of displayform for announcement creation/edition
-
-/**
- * Announcements list display
- */
-$course_id = api_get_course_int_id();
-
-//if ($display_announcement_list && !$surveyid) {
-if ($display_announcement_list) {
-    // by default we use the id of the current user. The course administrator can see the announcement of other users by using the user / group filter
-    //$user_id=$_user['user_id'];
-    if (isset($_SESSION['user'])) {
-        //$user_id=$_SESSION['user'];
-    }
-    $user_id = api_get_user_id();
-
-    if (isset($_SESSION['group'])) {
-        //$group_id=$_SESSION['group'];
-    }
-    $group_id = api_get_group_id();
-
-    $group_memberships = GroupManager::get_group_ids($course_id, api_get_user_id());
-
-    //$is_group_member = GroupManager :: is_tutor(api_get_user_id());
-
-    if (api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-        // A.1. you are a course admin with a USER filter
-        // => see only the messages of this specific user + the messages of the group (s)he is member of.
-        if (!empty($_SESSION['user'])) {
-
-            if (is_array($group_memberships) && count($group_memberships) > 0 ) {
-                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-					FROM $tbl_announcement announcement, $tbl_item_property ip
-					WHERE 	announcement.c_id = $course_id AND
-							ip.c_id = $course_id AND
-							announcement.id = ip.ref AND
-							ip.tool			= 'announcement' AND
-							(ip.to_user_id=$user_id OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).") )
-							$condition_session
-
-					ORDER BY display_order DESC";
-
-            } else {
-                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-					FROM $tbl_announcement announcement, $tbl_item_property ip
-					WHERE	announcement.c_id 	= $course_id AND
-							ip.c_id 			= $course_id AND
-							announcement.id 	= ip.ref AND
-							ip.tool				='announcement' AND
-							(ip.to_user_id		= $user_id OR ip.to_group_id='0') AND
-							ip.visibility='1'
-					$condition_session
-					ORDER BY display_order DESC";
-
-            }
-        } elseif (api_get_group_id() != 0 ) {
-            // A.2. you are a course admin with a GROUP filter
-            // => see only the messages of this specific group
-            $sql="SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-				FROM $tbl_announcement announcement, $tbl_item_property ip
-				WHERE	announcement.c_id = $course_id AND
-						ip.c_id = $course_id AND
-						announcement.id = ip.ref
-						AND ip.tool='announcement'
-						AND ip.visibility<>'2'
-						AND (ip.to_group_id=$group_id OR ip.to_group_id='0')
-						$condition_session
-				GROUP BY ip.ref
-				ORDER BY display_order DESC";
-        } else {
-
-            // A.3 you are a course admin without any group or user filter
-            // A.3.a you are a course admin without user or group filter but WITH studentview
-            // => see all the messages of all the users and groups without editing possibilities
-
-            if (isset($isStudentView) and $isStudentView=="true") {
-                $sql="SELECT
-					announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-					FROM $tbl_announcement announcement, $tbl_item_property ip
-					WHERE	announcement.c_id = $course_id AND
-							ip.c_id = $course_id AND
-							announcement.id = ip.ref
-							AND ip.tool='announcement'
-							AND ip.visibility='1'
-							$condition_session
-					GROUP BY ip.ref
-					ORDER BY display_order DESC";
-            } else {
-                // A.3.a you are a course admin without user or group filter and WTIHOUT studentview (= the normal course admin view)
-                // => see all the messages of all the users and groups with editing possibilities
-                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-					FROM $tbl_announcement announcement, $tbl_item_property ip
-					WHERE 	announcement.c_id = $course_id AND
-							ip.c_id = $course_id AND
-							announcement.id = ip.ref
-							AND ip.tool='announcement'
-							AND (ip.visibility='0' or ip.visibility='1')
-							$condition_session
-					GROUP BY ip.ref
-					ORDER BY display_order DESC";
-            }
-        }
-    } else {
-        //STUDENT
-
-        if (is_array($group_memberships) && count($group_memberships)>0) {
-            if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-                if (api_get_group_id() == 0) {
-                    //No group
-                    $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR ( ip.to_user_id='".$_user['user_id']."'" .
-                        " OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))) ";
-                } else {
-                    $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."'
-					OR ip.to_group_id IN (0, ".api_get_group_id()."))";
-                }
-                //$cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR (ip.to_user_id=$user_id OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).") )) ";
-
-            } else {
-                if (api_get_group_id() == 0) {
-                    $cond_user_id = " AND (ip.to_user_id=$user_id OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ";
-                } else {
-                    $cond_user_id = " AND (ip.to_user_id=$user_id OR ip.to_group_id IN (0, ".api_get_group_id()."))";
-                }
-            }
+echo $content;
 
-            $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-    				FROM $tbl_announcement announcement, $tbl_item_property ip
-    				WHERE	announcement.c_id = $course_id AND
-							ip.c_id = $course_id AND
-	        				announcement.id = ip.ref
-	        				AND ip.tool='announcement'
-	        				$cond_user_id
-	        				$condition_session
-	        				AND ip.visibility='1'
-    				ORDER BY display_order DESC";
-        } else {
-            if ($_user['user_id']) {
-                if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-                    $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR (ip.to_user_id='".$_user['user_id']."' OR ip.to_group_id='0')) ";
-                } else {
-                    $cond_user_id = " AND (ip.to_user_id='".$_user['user_id']."' OR ip.to_group_id='0') ";
-                }
-
-                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-						FROM $tbl_announcement announcement, $tbl_item_property ip
-						WHERE
-    						announcement.c_id = $course_id AND
-							ip.c_id = $course_id AND
-    						announcement.id = ip.ref AND
-    						ip.tool='announcement'
-    						$cond_user_id
-    						$condition_session
-    						AND ip.visibility='1'
-    						AND announcement.session_id IN(0,".api_get_session_id().")
-						ORDER BY display_order DESC";
-            } else {
-
-                if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-                    $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR ip.to_group_id='0' ) ";
-                } else {
-                    $cond_user_id = " AND ip.to_group_id='0' ";
-                }
-
-                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
-						FROM $tbl_announcement announcement, $tbl_item_property ip
-						WHERE
-						announcement.c_id = $course_id AND
-						ip.c_id = $course_id AND
-						announcement.id = ip.ref
-						AND ip.tool='announcement'
-						$cond_user_id
-						$condition_session
-						AND ip.visibility='1'
-						AND announcement.session_id IN(0,".api_get_session_id().")";
-            }
-        }
-    }
-
-    $result		= Database::query($sql);
-    $num_rows 	= Database::num_rows($result);
-
-    // DISPLAY: NO ITEMS
-
-    if (!isset($_GET['action']) || !in_array($_GET['action'], array('add', 'modify','view')))
-        if ($num_rows == 0) {
-            if ((api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) and (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath')) {
-                echo '<div id="no-data-view">';
-                echo '<h2>'.get_lang('Announcements').'</h2>';
-                echo Display::return_icon('valves.png', '', array(), 64);
-                echo '<div class="controls">';
-                echo Display::url(get_lang('AddAnnouncement'), api_get_self()."?".api_get_cidreq()."&action=add&origin=".$origin, array('class' => 'btn'));
-                echo '</div>';
-                echo '</div>';
-            } else {
-                //echo "<a href='".api_get_self()."?".api_get_cidreq()."&action=add&origin=".(empty($_GET['origin'])?'':$_GET['origin'])."'>".Display::return_icon('new_announce.png',get_lang('AddAnnouncement'),'',ICON_SIZE_MEDIUM)."</a>";
-                Display::display_warning_message(get_lang('NoAnnouncements'));
-            }
-
-        } else {
-            $iterator = 1;
-            $bottomAnnouncement = $announcement_number;
-
-            echo '<table width="100%" class="data_table announcements-list">';
-            $ths = Display::tag('th', get_lang('Title'));
-            $ths .= Display::tag('th', get_lang('By') );
-            $ths .= Display::tag('th', get_lang('LastUpdateDate') );
-            if (api_is_allowed_to_edit(false,true) OR (api_is_course_coach() && api_is_element_in_the_session(TOOL_ANNOUNCEMENT,$myrow['id']))
-                OR (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-                $ths .= Display::tag('th', get_lang('Modify'));
-            }
-
-            echo Display::tag('tr', $ths);
-            $displayed = array();
-
-            while ($myrow = Database::fetch_array($result, 'ASSOC')) {
-                if (!in_array($myrow['id'], $displayed)) {
-                    $sent_to_icon = '';
-                    // the email icon
-                    if ($myrow['email_sent'] == '1') {
-                        $sent_to_icon = ' '.Display::return_icon('email.gif', get_lang('AnnounceSentByEmail'));
-                    }
-
-                    $title		 = $myrow['title'].$sent_to_icon;
-
-                    /* DATE */
-                    $last_post_datetime = $myrow['end_date'];
-
-                    $item_visibility = api_get_item_visibility($_course, TOOL_ANNOUNCEMENT, $myrow['id'], $session_id);
-                    $myrow['visibility'] = $item_visibility;
-
-                    // the styles
-                    if ($myrow['visibility'] == '0') {
-                        $style='invisible';
-                    } else {
-                        $style = '';
-                    }
-
-                    echo '<tr class="announcements-list-line">';
-
-                    // show attachment list
-                    $attachment_list = array();
-                    $attachment_list = AnnouncementManager::get_attachment($myrow['id']);
-
-                    $attachment_icon = '';
-                    if (count($attachment_list)>0) {
-                        $attachment_icon = ' '.Display::return_icon('attachment.gif',get_lang('Attachment'));
-                    }
-
-                    /* TITLE */
-                    $title = Display::url($title.$attachment_icon, api_get_self().'?'.api_get_cidreq().'&action=view&id='.$myrow['id']);
-                    echo Display::tag('td', Security::remove_XSS($title), array('class' => 'announcements-list-line-title '.$style));
-
-                    $user_info		= api_get_user_info($myrow['insert_user_id']);
-                    $username       = sprintf(get_lang("LoginX"), $user_info['username']);
-                    $username_span  = Display::tag('span', api_get_person_name($user_info['firstName'], $user_info['lastName']), array('title'=>$username));
-                    echo Display::tag('td', $username_span, array('class' => 'announcements-list-line-by-user'));
-                    echo Display::tag('td', api_convert_and_format_date($myrow['insert_date'], DATE_TIME_FORMAT_LONG), array('class' => 'announcements-list-line-datetime'));
-
-                    // we can edit if : we are the teacher OR the element belongs to the session we are coaching OR the option to allow users to edit is on
-                    $modify_icons = '';
-                    if (api_is_allowed_to_edit(false,true) OR (api_is_course_coach() && api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $myrow['id']))
-                        OR (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-
-                        $modify_icons = "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=modify&id=".$myrow['id']."\">".Display::return_icon('edit.png', get_lang('Edit'),'',ICON_SIZE_SMALL)."</a>";
-                        if ($myrow['visibility']==1) {
-                            $image_visibility="visible";
-                            $alt_visibility=get_lang('Hide');
-                        } else {
-                            $image_visibility="invisible";
-                            $alt_visibility=get_lang('Visible');
-                        }
-                        $modify_icons .=  "<a href=\"".api_get_self()."?".api_get_cidreq()."&origin=".$origin."&action=showhide&id=".$myrow['id']."&sec_token=".$stok."\">".
-                            Display::return_icon($image_visibility.'.png', $alt_visibility,'',ICON_SIZE_SMALL)."</a>";
-
-                        // DISPLAY MOVE UP COMMAND only if it is not the top announcement
-                        if ($iterator != 1) {
-                            $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&up=".$myrow["id"]."&sec_token=".$stok."\">".Display::return_icon('up.gif', get_lang('Up'))."</a>";
-                        } else {
-                            $modify_icons .= Display::return_icon('up_na.gif', get_lang('Up'));
-                        }
-                        if ($iterator < $bottomAnnouncement) {
-                            $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&down=".$myrow["id"]."&sec_token=".$stok."\">".Display::return_icon('down.gif', get_lang('Down'))."</a>";
-                        } else {
-                            $modify_icons .= Display::return_icon('down_na.gif', get_lang('Down'));
-                        }
-                        if (api_is_allowed_to_edit(false,true)) {
-                            $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=delete&id=".$myrow['id']."&sec_token=".$stok."\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'),ENT_QUOTES,$charset))."')) return false;\">".
-                                Display::return_icon('delete.png', get_lang('Delete'),'',ICON_SIZE_SMALL).
-                                "</a>";
-                        }
-                        $iterator ++;
-                        echo Display::tag('td', $modify_icons, array('class' => 'announcements-list-line-actions'));
-                    }
-                    echo "</tr>";
-                }
-                $displayed[]=$myrow['id'];
-            }	// end while
-            echo "</table>";
-        }
-}	// end: if ($displayAnnoucementList)
-
-
-if (isset($_GET['action']) && $_GET['action'] == 'view') {
-    AnnouncementManager::display_announcement($announcement_id);
-}
 
 /*		FOOTER		*/
 if (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath') {

+ 0 - 2
main/announcements/resources/js/main.js

@@ -34,8 +34,6 @@ $(function() {
                 }
             }
         });
-
-
     });
 });
 

+ 557 - 64
main/inc/lib/AnnouncementManager.php

@@ -104,10 +104,10 @@ class AnnouncementManager
     }
 
     /**
-     * This functions swithes the visibility a course resource
+     * This functions switches the visibility a course resource
      * using the visibility field in 'item_property'
-     * @param    array	the course array
-     * @param    int     ID of the element of the corresponding type
+     * @param    array	$_course
+     * @param    int     $id ID of the element of the corresponding type
      * @return   bool    False on failure, True on success
      */
     public static function change_visibility_announcement($_course, $id)
@@ -154,7 +154,7 @@ class AnnouncementManager
     public static function display_announcement($announcement_id)
     {
         if ($announcement_id != strval(intval($announcement_id))) {
-            return false;
+            return null;
         }
 
         global $charset;
@@ -166,14 +166,14 @@ class AnnouncementManager
         if (api_is_allowed_to_edit(false, true) || (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
             $sql_query = "  SELECT announcement.*, toolitemproperties.*
                             FROM $tbl_announcement announcement, $tbl_item_property toolitemproperties
-                            WHERE announcement.id = toolitemproperties.ref
-                            AND announcement.id = '$announcement_id'
-                            AND toolitemproperties.tool='announcement' AND
-                            announcement.c_id = $course_id AND
-							toolitemproperties.c_id = $course_id
+                            WHERE
+                                announcement.id = toolitemproperties.ref AND
+                                announcement.id = '$announcement_id' AND
+                                toolitemproperties.tool='announcement' AND
+                                announcement.c_id = $course_id AND
+                                toolitemproperties.c_id = $course_id
                             ORDER BY display_order DESC";
         } else {
-
             $group_list = GroupManager::get_group_ids($course_id, api_get_user_id());
             if (empty($group_list)) {
                 $group_list[] = 0;
@@ -181,38 +181,47 @@ class AnnouncementManager
             if (api_get_user_id() != 0) {
                 $sql_query = "	SELECT announcement.*, toolitemproperties.*
     							FROM $tbl_announcement announcement, $tbl_item_property toolitemproperties
-    							WHERE announcement.id = toolitemproperties.ref
-    							AND announcement.id = '$announcement_id'
-    							AND toolitemproperties.tool='announcement'
-    							AND (toolitemproperties.to_user_id='" . api_get_user_id() . "' OR toolitemproperties.to_group_id IN ('0', '" . implode("', '", $group_list) . "'))
-    							AND toolitemproperties.visibility='1' AND
-    							announcement.c_id = $course_id AND
-								toolitemproperties.c_id = $course_id
+    							WHERE
+    							    announcement.id = toolitemproperties.ref AND
+    							    announcement.id = '$announcement_id' AND
+    							    toolitemproperties.tool='announcement' AND
+    							    (
+    							        toolitemproperties.to_user_id='" . api_get_user_id() . "' OR
+    							        toolitemproperties.to_group_id IN ('0', '" . implode("', '", $group_list) . "')
+                                    ) AND
+    							    toolitemproperties.visibility='1' AND
+    							    announcement.c_id = $course_id AND
+    							    toolitemproperties.c_id = $course_id
     							ORDER BY display_order DESC";
             } else {
                 $sql_query = "	SELECT announcement.*, toolitemproperties.*
     							FROM $tbl_announcement announcement, $tbl_item_property toolitemproperties
-    							WHERE announcement.id = toolitemproperties.ref
-    							AND announcement.id = '$announcement_id'
-    							AND toolitemproperties.tool='announcement'
-    							AND toolitemproperties.to_group_id='0'
-    							AND toolitemproperties.visibility='1' AND
-    							announcement.c_id = $course_id AND
-								toolitemproperties.c_id = $course_id
+    							WHERE
+    							    announcement.id = toolitemproperties.ref AND
+    							    announcement.id = '$announcement_id' AND
+    							    toolitemproperties.tool='announcement' AND
+    							    toolitemproperties.to_group_id='0' AND
+    							    toolitemproperties.visibility='1' AND
+    							    announcement.c_id = $course_id AND
+    							    toolitemproperties.c_id = $course_id
     							";
             }
         }
 
         $sql_result = Database::query($sql_query);
+        $html = null;
         if (Database::num_rows($sql_result) > 0) {
             $result = Database::fetch_array($sql_result, 'ASSOC');
             $title = $result['title'];
             $content = $result['content'];
-            echo "<table height=\"100\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" class=\"data_table\">";
-            echo "<tr><td><h2>" . $title . "</h2></td></tr>";
-
-            if (api_is_allowed_to_edit(false, true) || (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
-                $modify_icons = "<a href=\"" . api_get_self() . "?" . api_get_cidreq() . "&action=modify&id=" . $announcement_id . "\">" . Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL) . "</a>";
+            $html .= "<table height=\"100\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" class=\"data_table\">";
+            $html .= "<tr><td><h2>" . $title . "</h2></td></tr>";
+
+            if (api_is_allowed_to_edit(false, true) ||
+                (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
+            ) {
+                $modify_icons = "<a href=\"" . api_get_self() . "?" . api_get_cidreq() . "&action=modify&id=" . $announcement_id . "\">" .
+                    Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL) . "</a>";
                 if ($result['visibility'] == 1) {
                     $image_visibility = "visible";
                     $alt_visibility = get_lang('Hide');
@@ -230,14 +239,13 @@ class AnnouncementManager
                         Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL) .
                         "</a>";
                 }
-                echo "<tr><th style='text-align:right'>$modify_icons</th></tr>";
+                $html .= "<tr><th style='text-align:right'>$modify_icons</th></tr>";
             }
 
             $content = self::parse_content($result['to_user_id'], $content, api_get_course_id(), api_get_session_id());
 
-            echo "<tr><td>$content</td></tr>";
-
-            echo "<tr><td class=\"announcements_datum\">" . get_lang('LastUpdateDate') . " : " . api_convert_and_format_date($result['insert_date'], DATE_TIME_FORMAT_LONG) . "</td></tr>";
+            $html .= "<tr><td>$content</td></tr>";
+            $html .= "<tr><td class=\"announcements_datum\">" . get_lang('LastUpdateDate') . " : " . api_convert_and_format_date($result['insert_date'], DATE_TIME_FORMAT_LONG) . "</td></tr>";
 
             // User or group icon
             $sent_to_icon = '';
@@ -246,27 +254,31 @@ class AnnouncementManager
             }
             $sent_to = self::sent_to('announcement', $announcement_id);
             $sent_to_form = self::sent_to_form($sent_to);
-            echo Display::tag('td', get_lang('SentTo') . ' : ' . $sent_to_form, array('class' => 'announcements_datum'));
+            $html .= Display::tag('td', get_lang('SentTo') . ' : ' . $sent_to_form, array('class' => 'announcements_datum'));
             $attachment_list = self::get_attachment($announcement_id);
 
             if (count($attachment_list) > 0) {
-                echo "<tr><td>";
+                $html .= "<tr><td>";
                 $realname = $attachment_list['path'];
                 $user_filename = $attachment_list['filename'];
                 $full_file_name = 'download.php?'.api_get_cidreq().'&file=' . $realname;
-                echo '<br/>';
-                echo Display::return_icon('attachment.gif', get_lang('Attachment'));
-                echo '<a href="' . $full_file_name . ' "> ' . $user_filename . ' </a>';
-                echo ' - <span class="forum_attach_comment" >' . $attachment_list['comment'] . '</span>';
+                $html .= '<br/>';
+                $html .= Display::return_icon('attachment.gif', get_lang('Attachment'));
+                $html .= '<a href="' . $full_file_name . ' "> ' . $user_filename . ' </a>';
+                $html .= ' - <span class="forum_attach_comment" >' . $attachment_list['comment'] . '</span>';
                 if (api_is_allowed_to_edit(false, true)) {
-                    echo Display::url(Display::return_icon('delete.png', get_lang('Delete'), '', 16), api_get_self() . "?" . api_get_cidreq() . "&action=delete_attachment&id_attach=" . $attachment_list['id'] . "&sec_token=" . $stok);
+                    $html .= Display::url(
+                        Display::return_icon('delete.png', get_lang('Delete'), '', 16),
+                        api_get_self() . "?" . api_get_cidreq() . "&action=delete_attachment&id_attach=" . $attachment_list['id'] . "&sec_token=" . $stok
+                    );
                 }
-                echo '</td></tr>';
+                $html .= '</td></tr>';
             }
-            echo "</table>";
-        } else {
-            return false;
+            $html .= "</table>";
+            return $html;
         }
+
+        return null;
     }
 
     /**
@@ -295,6 +307,7 @@ class AnnouncementManager
      * @param array     Array of users and groups to send the announcement to
      * @param array	    uploaded file $_FILES
      * @param string    Comment describing the attachment
+     * @param bool  $sendToUsersInSession
      * @return int      false on failure, ID of the announcement on success
      */
     public static function add_announcement(
@@ -324,43 +337,71 @@ class AnnouncementManager
         $order = self::get_last_announcement_order();
 
         // store in the table announcement
-        $sql = "INSERT INTO $tbl_announcement SET
-				c_id 			= '$course_id',
-				content 		= '$newContent',
-				title 			= '$emailTitle',
-                end_date        = '$end_date',
-				display_order 	= '$order',
-				session_id		= ".api_get_session_id();
-        $result = Database::query($sql);
+        $params = array(
+            'c_id' => $course_id,
+            'content' => $newContent,
+            'title' => $emailTitle,
+            'end_date' => $end_date,
+            'display_order' => $order,
+            'session_id' => api_get_session_id()
+        );
 
-        if ($result === false) {
+        $last_id = Database::insert($tbl_announcement, $params);
+
+        if (empty($last_id)) {
             return false;
         } else {
-            // Store the attach file.
-            $last_id = Database::insert_id();
             if (!empty($file)) {
-                self::add_announcement_attachment_file($last_id, $file_comment, $_FILES['user_upload']);
+                self::add_announcement_attachment_file(
+                    $last_id,
+                    $file_comment,
+                    $_FILES['user_upload']
+                );
             }
 
             // store in item_property (first the groups, then the users
 
-            if (empty($sentTo) || !empty($sentTo) && isset($sentTo[0]) && $sentTo[0] == 'everyone') {
+            if (empty($sentTo) || !empty($sentTo) &&
+                isset($sentTo[0]) && $sentTo[0] == 'everyone'
+            ) {
                 // The message is sent to EVERYONE, so we set the group to 0
-                api_item_property_update($_course, TOOL_ANNOUNCEMENT, $last_id, "AnnouncementAdded", api_get_user_id(), '0');
+                api_item_property_update(
+                    $_course,
+                    TOOL_ANNOUNCEMENT,
+                    $last_id,
+                    "AnnouncementAdded",
+                    api_get_user_id(),
+                    '0'
+                );
             } else {
                 $send_to = self::separate_users_groups($sentTo);
 
                 // Storing the selected groups
-                if (is_array($send_to['groups'])) {
+                if (is_array($send_to['groups']) && !empty($send_to['groups'])) {
                     foreach ($send_to['groups'] as $group) {
-                        api_item_property_update($_course, TOOL_ANNOUNCEMENT, $last_id, "AnnouncementAdded", api_get_user_id(), $group);
+                        api_item_property_update(
+                            $_course,
+                            TOOL_ANNOUNCEMENT,
+                            $last_id,
+                            "AnnouncementAdded",
+                            api_get_user_id(),
+                            $group
+                        );
                     }
                 }
 
                 // Storing the selected users
                 if (is_array($send_to['users'])) {
                     foreach ($send_to['users'] as $user) {
-                        api_item_property_update($_course, TOOL_ANNOUNCEMENT, $last_id, "AnnouncementAdded", api_get_user_id(), '', $user);
+                        api_item_property_update(
+                            $_course,
+                            TOOL_ANNOUNCEMENT,
+                            $last_id,
+                            "AnnouncementAdded",
+                            api_get_user_id(),
+                            '',
+                            $user
+                        );
                     }
                 }
             }
@@ -910,8 +951,10 @@ class AnnouncementManager
         $id = intval($id);
         $course_id = api_get_course_int_id();
 
-        $sql = "SELECT * FROM $tbl_item_property WHERE c_id = $course_id AND tool='$tool' AND ref = $id";
+        $sql = "SELECT * FROM $tbl_item_property
+                WHERE c_id = $course_id AND tool='$tool' AND ref = $id";
         $result = Database::query($sql);
+        $to = array();
         while ($row = Database::fetch_array($result)) {
             $to_group = $row['to_group_id'];
             switch ($to_group) {
@@ -922,7 +965,6 @@ class AnnouncementManager
                 // it was sent to everyone
                 case 0:
                     return "everyone";
-                    exit;
                     break;
                 default:
                     $to[] = "GROUP:" . $row['to_group_id'];
@@ -1024,7 +1066,11 @@ class AnnouncementManager
                 $user_info = api_get_user_info($sent_to_array['users'][0]);
                 $output[] = api_get_person_name($user_info['firstname'], $user_info['lastname']);
             }
-            if (isset($sent_to_array['groups']) and is_array($sent_to_array['groups']) and isset($sent_to_array['groups'][0]) and $sent_to_array['groups'][0] !== 0) {
+            if (isset($sent_to_array['groups']) and
+                is_array($sent_to_array['groups']) and
+                isset($sent_to_array['groups'][0]) and
+                $sent_to_array['groups'][0] !== 0
+            ) {
                 $group_id = $sent_to_array['groups'][0];
                 $output[] = "&nbsp;" . $group_names[$group_id]['name'];
             }
@@ -1252,4 +1298,451 @@ class AnnouncementManager
         $email = AnnouncementEmail::create(null, $id);
         $email->send($sendToUsersInSession);
     }
+
+    /**
+     * @param $stok
+     * @param $announcement_number
+     */
+    public static function getAnnouncements($stok, $announcement_number)
+    {
+        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
+        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
+
+        $user_id = api_get_user_id();
+        $group_id = api_get_group_id();
+        $session_id = api_get_session_id();
+        $condition_session = api_get_session_condition($session_id, true, true);
+        $course_id = api_get_course_int_id();
+        $_course = api_get_course_info();
+
+        $group_memberships = GroupManager::get_group_ids($course_id, api_get_user_id());
+        $allowUserEditSetting = api_get_course_setting('allow_user_edit_announcement');
+
+        if (api_is_allowed_to_edit(false, true) OR
+            ($allowUserEditSetting && !api_is_anonymous())
+        ) {
+            // A.1. you are a course admin with a USER filter
+            // => see only the messages of this specific user + the messages of the group (s)he is member of.
+            if (!empty($user_id)) {
+                if (is_array($group_memberships) && count($group_memberships) > 0 ) {
+                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+                            FROM $tbl_announcement announcement, $tbl_item_property ip
+                            WHERE
+                                announcement.c_id = $course_id AND
+                                ip.c_id = $course_id AND
+                                announcement.id = ip.ref AND
+                                ip.tool = 'announcement' AND
+                                (ip.to_user_id = $user_id OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).") )
+                                $condition_session
+
+                            ORDER BY display_order DESC";
+
+                } else {
+                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+                            FROM $tbl_announcement announcement, $tbl_item_property ip
+                            WHERE
+                                announcement.c_id = $course_id AND
+                                ip.c_id = $course_id AND
+                                announcement.id = ip.ref AND
+                                ip.tool ='announcement' AND
+                                (ip.to_user_id = $user_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL) AND
+                                ip.visibility='1'
+                            $condition_session
+                            ORDER BY display_order DESC";
+
+                }
+            } elseif (api_get_group_id() != 0 ) {
+                // A.2. you are a course admin with a GROUP filter
+                // => see only the messages of this specific group
+                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+                        FROM $tbl_announcement announcement, $tbl_item_property ip
+                        WHERE
+                            announcement.c_id = $course_id AND
+                            ip.c_id = $course_id AND
+                            announcement.id = ip.ref
+                            AND ip.tool='announcement'
+                            AND ip.visibility<>'2'
+                            AND (ip.to_group_id = $group_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL)
+                            $condition_session
+                        GROUP BY ip.ref
+                        ORDER BY display_order DESC";
+            } else {
+
+                // A.3 you are a course admin without any group or user filter
+                // A.3.a you are a course admin without user or group filter but WITH studentview
+                // => see all the messages of all the users and groups without editing possibilities
+
+                if (isset($isStudentView) and $isStudentView=="true") {
+                    $sql="SELECT
+                        announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+                        FROM $tbl_announcement announcement, $tbl_item_property ip
+                        WHERE
+                            announcement.c_id = $course_id AND
+                            ip.c_id = $course_id AND
+                            announcement.id = ip.ref
+                            AND ip.tool='announcement'
+                            AND ip.visibility='1'
+                            $condition_session
+                        GROUP BY ip.ref
+                        ORDER BY display_order DESC";
+                } else {
+                    // A.3.a you are a course admin without user or group filter and WTIHOUT studentview (= the normal course admin view)
+                    // => see all the messages of all the users and groups with editing possibilities
+                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+                            FROM $tbl_announcement announcement, $tbl_item_property ip
+                            WHERE
+                                announcement.c_id = $course_id AND
+                                ip.c_id = $course_id AND
+                                announcement.id = ip.ref
+                                AND ip.tool='announcement'
+                                AND (ip.visibility='0' or ip.visibility='1')
+                                $condition_session
+                            GROUP BY ip.ref
+                            ORDER BY display_order DESC";
+                }
+            }
+        } else {
+            //STUDENT
+            if (is_array($group_memberships) && count($group_memberships)>0) {
+                if ($allowUserEditSetting && !api_is_anonymous()) {
+                    if (api_get_group_id() == 0) {
+                        // No group
+                        $cond_user_id = " AND (
+                            ip.lastedit_user_id = '".$user_id."' OR (
+                            ip.to_user_id='".$user_id."' OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))
+                        ) ";
+                    } else {
+                        $cond_user_id = " AND (
+                            ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".$group_id.")
+                        )";
+                    }
+                } else {
+                    if (api_get_group_id() == 0) {
+                        $cond_user_id = " AND (
+                            ip.to_user_id=$user_id OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).")
+                        ) ";
+                    } else {
+                        $cond_user_id = " AND (
+                            ip.to_user_id=$user_id OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".api_get_group_id().")
+                        )";
+                    }
+                }
+
+                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+    				FROM $tbl_announcement announcement, $tbl_item_property ip
+    				WHERE
+    				    announcement.c_id = $course_id AND
+                        ip.c_id = $course_id AND
+                        announcement.id = ip.ref
+                        AND ip.tool='announcement'
+                        $cond_user_id
+                        $condition_session AND
+                        ip.visibility='1'
+    				ORDER BY display_order DESC";
+            } else {
+                if ($user_id) {
+                    if ($allowUserEditSetting && !api_is_anonymous()) {
+                        $cond_user_id = " AND (
+                            ip.lastedit_user_id = '".api_get_user_id()."' OR (ip.to_user_id='".$user_id."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL )
+                        ) ";
+                    } else {
+                        $cond_user_id = " AND (ip.to_user_id='".$user_id."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL ) ";
+                    }
+
+                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+						FROM $tbl_announcement announcement, $tbl_item_property ip
+						WHERE
+    						announcement.c_id = $course_id AND
+							ip.c_id = $course_id AND
+    						announcement.id = ip.ref AND
+    						ip.tool='announcement'
+    						$cond_user_id
+    						$condition_session
+    						AND ip.visibility='1'
+    						AND announcement.session_id IN(0,".api_get_session_id().")
+						ORDER BY display_order DESC";
+                } else {
+                    if (($allowUserEditSetting && !api_is_anonymous())) {
+                        $cond_user_id = " AND (
+                            ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL
+                        )";
+                    } else {
+                        $cond_user_id = " AND ip.to_group_id='0' OR ip.to_group_id IS NULL ";
+                    }
+
+                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.insert_date
+						FROM $tbl_announcement announcement, $tbl_item_property ip
+						WHERE
+                            announcement.c_id = $course_id AND
+                            ip.c_id = $course_id AND
+                            announcement.id = ip.ref AND
+                            ip.tool='announcement'
+                            $cond_user_id
+                            $condition_session AND
+                            ip.visibility='1' AND
+                            announcement.session_id IN ( 0,".api_get_session_id().")";
+                }
+            }
+        }
+
+        $result = Database::query($sql);
+        $num_rows = Database::num_rows($result);
+        $html = null;
+
+        if ($num_rows == 0) {
+            if ((api_is_allowed_to_edit(false, true) OR
+                (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) and
+                (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath')
+            ) {
+                $html .= '<div id="no-data-view">';
+                $html .= '<h2>' . get_lang('Announcements') . '</h2>';
+                $html .= Display::return_icon('valves.png', '', array(), 64);
+                $html .= '<div class="controls">';
+                $html .= Display::url(
+                    get_lang('AddAnnouncement'),
+                    api_get_self() . "?" . api_get_cidreq() . "&action=add",
+                    array('class' => 'btn')
+                );
+                $html .= '</div>';
+                $html .= '</div>';
+            } else {
+                $html = Display::return_message(get_lang('NoAnnouncements'), 'warning');
+            }
+            return $html;
+        }
+
+        $iterator = 1;
+        $bottomAnnouncement = $announcement_number;
+        $origin = null;
+
+        $html .= '<table width="100%" class="data_table announcements-list">';
+        $ths = Display::tag('th', get_lang('Title'));
+        $ths .= Display::tag('th', get_lang('By') );
+        $ths .= Display::tag('th', get_lang('LastUpdateDate') );
+        if (api_is_allowed_to_edit(false,true) OR (api_is_course_coach() &&
+            api_is_element_in_the_session(TOOL_ANNOUNCEMENT,$myrow['id']))
+            OR (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
+            $ths .= Display::tag('th', get_lang('Modify'));
+        }
+
+        $html .= Display::tag('tr', $ths);
+        $displayed = array();
+        while ($myrow = Database::fetch_array($result, 'ASSOC')) {
+            if (!in_array($myrow['id'], $displayed)) {
+                $sent_to_icon = '';
+                // the email icon
+                if ($myrow['email_sent'] == '1') {
+                    $sent_to_icon = ' '.Display::return_icon('email.gif', get_lang('AnnounceSentByEmail'));
+                }
+
+                $title = $myrow['title'].$sent_to_icon;
+                $item_visibility = api_get_item_visibility($_course, TOOL_ANNOUNCEMENT, $myrow['id'], $session_id);
+                $myrow['visibility'] = $item_visibility;
+
+                // the styles
+                if ($myrow['visibility'] == '0') {
+                    $style='invisible';
+                } else {
+                    $style = '';
+                }
+
+                $html .= '<tr class="announcements-list-line">';
+
+                // show attachment list
+                $attachment_list = AnnouncementManager::get_attachment($myrow['id']);
+
+                $attachment_icon = '';
+                if (count($attachment_list)>0) {
+                    $attachment_icon = ' '.Display::return_icon('attachment.gif',get_lang('Attachment'));
+                }
+
+                /* TITLE */
+                $user_info = api_get_user_info($myrow['insert_user_id']);
+                $username = sprintf(get_lang("LoginX"), $user_info['username']);
+                $username_span = Display::tag('span', api_get_person_name($user_info['firstName'], $user_info['lastName']), array('title'=>$username));
+                $title = Display::url($title.$attachment_icon, api_get_self().'?'.api_get_cidreq().'&action=view&id='.$myrow['id']);
+
+                $html .= Display::tag('td', Security::remove_XSS($title), array('class' => 'announcements-list-line-title '.$style));
+                $html .= Display::tag('td', $username_span, array('class' => 'announcements-list-line-by-user'));
+                $html .= Display::tag('td', api_convert_and_format_date($myrow['insert_date'], DATE_TIME_FORMAT_LONG), array('class' => 'announcements-list-line-datetime'));
+
+                // we can edit if : we are the teacher OR the element belongs to
+                // the session we are coaching OR the option to allow users to edit is on
+                if (api_is_allowed_to_edit(false,true) OR
+                    (api_is_course_coach() && api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $myrow['id']))
+                    OR (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
+                ) {
+
+                    $modify_icons = "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=modify&id=".$myrow['id']."\">".
+                        Display::return_icon('edit.png', get_lang('Edit'),'',ICON_SIZE_SMALL)."</a>";
+                    if ($myrow['visibility']==1) {
+                        $image_visibility="visible";
+                        $alt_visibility=get_lang('Hide');
+                    } else {
+                        $image_visibility="invisible";
+                        $alt_visibility=get_lang('Visible');
+                    }
+                    $modify_icons .=  "<a href=\"".api_get_self()."?".api_get_cidreq()."&origin=".$origin."&action=showhide&id=".$myrow['id']."&sec_token=".$stok."\">".
+                        Display::return_icon($image_visibility.'.png', $alt_visibility,'',ICON_SIZE_SMALL)."</a>";
+
+                    // DISPLAY MOVE UP COMMAND only if it is not the top announcement
+                    if ($iterator != 1) {
+                        $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=move&up=".$myrow["id"]."&sec_token=".$stok."\">".
+                            Display::return_icon('up.gif', get_lang('Up'))."</a>";
+                    } else {
+                        $modify_icons .= Display::return_icon('up_na.gif', get_lang('Up'));
+                    }
+                    if ($iterator < $bottomAnnouncement) {
+                        $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=move&down=".$myrow["id"]."&sec_token=".$stok."\">".
+                            Display::return_icon('down.gif', get_lang('Down'))."</a>";
+                    } else {
+                        $modify_icons .= Display::return_icon('down_na.gif', get_lang('Down'));
+                    }
+                    if (api_is_allowed_to_edit(false,true)) {
+                        $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=delete&id=".$myrow['id']."&sec_token=".$stok."\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'),ENT_QUOTES,api_get_system_encoding()))."')) return false;\">".
+                            Display::return_icon('delete.png', get_lang('Delete'),'',ICON_SIZE_SMALL).
+                            "</a>";
+                    }
+                    $iterator ++;
+                    $html .= Display::tag('td', $modify_icons, array('class' => 'announcements-list-line-actions'));
+                }
+                $html .= "</tr>";
+            }
+            $displayed[] = $myrow['id'];
+        }
+        $html .= "</table>";
+
+        return $html;
+    }
+
+    /**
+     * @return int
+     */
+    public static function getNumberAnnouncements()
+    {
+        // Maximum title messages to display
+        $maximum 	= '12';
+        // Database Table Definitions
+        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
+        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
+
+        $course_id = api_get_course_int_id();
+        $_course = api_get_course_info();
+        $session_id = api_get_session_id();
+        $userId = api_get_user_id();
+        $condition_session = api_get_session_condition($session_id, true, true);
+
+        if (api_is_allowed_to_edit(false,true))  {
+            // check teacher status
+            if (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath') {
+
+                if (api_get_group_id() == 0) {
+                    $group_condition = "";
+                } else {
+                    $group_condition = " AND (ip.to_group_id='".api_get_group_id()."' OR ip.to_group_id = 0)";
+                }
+                $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
+				FROM $tbl_announcement announcement, $tbl_item_property ip
+				WHERE   announcement.c_id   = $course_id AND
+                        ip.c_id             = $course_id AND
+                        announcement.id     = ip.ref AND
+                        ip.tool             = 'announcement' AND
+                        ip.visibility       <> '2'
+                        $group_condition
+                        $condition_session
+				GROUP BY ip.ref
+				ORDER BY display_order DESC
+				LIMIT 0,$maximum";
+            }
+        } else {
+            // students only get to see the visible announcements
+            if (empty($_GET['origin']) or $_GET['origin'] !== 'learnpath') {
+                $group_memberships = GroupManager::get_group_ids($_course['real_id'], $userId);
+
+                if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
+
+                    if (api_get_group_id() == 0) {
+                        $cond_user_id = " AND (ip.lastedit_user_id = '".$userId."' OR ( ip.to_user_id='".$userId."'" .
+                            "OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))) ";
+                    } else {
+                        $cond_user_id = " AND (ip.lastedit_user_id = '".$userId."'
+                OR ip.to_group_id IN (0, ".api_get_group_id()."))";
+                    }
+                } else {
+                    if (api_get_group_id() == 0) {
+                        $cond_user_id = " AND ( ip.to_user_id='".$userId."'" .
+                            "OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ";
+                    } else {
+                        $cond_user_id = " AND ( ip.to_user_id='".$userId."'" .
+                            "OR ip.to_group_id IN (0, ".api_get_group_id().")) ";
+                    }
+                }
+
+                // the user is member of several groups => display personal announcements AND his group announcements AND the general announcements
+                if (is_array($group_memberships) && count($group_memberships)>0) {
+                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
+                    FROM $tbl_announcement announcement, $tbl_item_property ip
+                    WHERE
+                        announcement.c_id = $course_id AND
+                        ip.c_id = $course_id AND
+                        announcement.id = ip.ref AND
+                        ip.tool='announcement'
+                        AND ip.visibility='1'
+                        $cond_user_id
+                        $condition_session
+                    GROUP BY ip.ref
+                    ORDER BY display_order DESC
+                    LIMIT 0, $maximum";
+                } else {
+                    // the user is not member of any group
+                    // this is an identified user => show the general announcements AND his personal announcements
+                    if ($userId) {
+                        if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
+                            $cond_user_id = " AND (ip.lastedit_user_id = '".$userId."' OR ( ip.to_user_id='".$userId."' OR ip.to_group_id='0')) ";
+                        } else {
+                            $cond_user_id = " AND ( ip.to_user_id='".$userId."' OR ip.to_group_id='0') ";
+                        }
+                        $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
+                            FROM $tbl_announcement announcement, $tbl_item_property ip
+                            WHERE
+                                announcement.c_id = $course_id AND
+                                ip.c_id = $course_id AND
+                                announcement.id = ip.ref
+                                AND ip.tool='announcement'
+                                AND ip.visibility='1'
+                                $cond_user_id
+                                $condition_session
+                            GROUP BY ip.ref
+                            ORDER BY display_order DESC
+                            LIMIT 0, $maximum";
+                    } else {
+
+                        if (api_get_course_setting('allow_user_edit_announcement')) {
+                            $cond_user_id = " AND (ip.lastedit_user_id = '".api_get_user_id()."' OR ip.to_group_id='0') ";
+                        } else {
+                            $cond_user_id = " AND ip.to_group_id='0' ";
+                        }
+
+                        // the user is not identiefied => show only the general announcements
+                        $sql="SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
+                    FROM $tbl_announcement announcement, $tbl_item_property ip
+                    WHERE
+                        announcement.c_id = $course_id AND
+                        ip.c_id = $course_id AND
+                        announcement.id = ip.ref
+                        AND ip.tool='announcement'
+                        AND ip.visibility='1'
+                        AND ip.to_group_id='0'
+                        $condition_session
+                    GROUP BY ip.ref
+                    ORDER BY display_order DESC
+                    LIMIT 0,$maximum";
+                    }
+                }
+            }
+        }
+
+        $result = Database::query($sql);
+        return Database::num_rows($result);
+    }
 }

File diff suppressed because it is too large
+ 0 - 0
main/inc/lib/javascript/pear/qfamsHandler-min.js


+ 36 - 0
main/inc/lib/javascript/pear/qfamsHandler.js

@@ -512,3 +512,39 @@ QFAMS.init = function (elm)
     }
 };
 
+$(function() {
+
+    $('.advmultiselect_checkbox').click(function() {
+        var id = $(this).attr('id');
+        var selectName = id + '-f';
+        var selectId = selectName.replace('_select_all', '');
+        var selectDestinationId = selectId.replace('-f', '-t');
+
+        $('#'+selectDestinationId).prop("disabled", false);
+
+        var checked = !$('#'+ id).is(':checked');
+        if (!checked) {
+            $('#' +selectId +' option').each(function() {
+                var val = $(this).val();
+                var text = $(this).text();
+                if (val.substr(0 , 4) == 'USER') {
+                    $('#'+selectId).find('[value="'+val+'"]').remove();
+                    $('#' +selectDestinationId).append(new Option(text, val));
+                }
+            });
+        }
+
+        $('#' + selectDestinationId +' option').each(function() {
+            var val = $(this).val();
+            var text = $(this).text();
+
+            if (val.substr(0 , 4) == 'USER') {
+                if (checked) {
+                    // Add
+                    $('#' +selectId ).append(new Option(text, val));
+                    $('#' + selectDestinationId).find('[value="'+val+'"]').remove();
+                }
+            }
+        });
+    });
+});

+ 58 - 0
src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/Announcements.php

@@ -0,0 +1,58 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\CoreBundle\Component\Editor\CkEditor\Toolbar;
+
+/**
+ * Class Announcements
+ *
+ * @package Chamilo\CoreBundle\Component\Editor\CkEditor\Toolbar *
+ */
+class Announcements extends Basic
+{
+    public $plugins = array(
+        'toolbarswitch',
+        'audio',
+        'video',
+        'youtube',
+        'leaflet',
+        'widget',
+        'lineutils',
+        'mathjax',
+        'asciimath',
+        'glossary',
+        'asciisvg',
+        'mapping'
+    );
+
+    /**
+     * @return mixed
+     */
+    public function getConfig()
+    {
+        $config['toolbarGroups'] = array(
+            array('name' => 'document',  'groups' => array('document', 'doctools')),
+            array('name' => 'clipboard', 'groups' => array('clipboard', 'undo')),
+            array('name' => 'editing',   'groups' => array( 'find', 'selection', 'spellchecker')),
+            //array('name' => 'forms'),
+            '/',
+            array('name' => 'basicstyles', 'groups' => array('basicstyles', 'cleanup')),
+            array('name' => 'paragraph',   'groups' => array('list', 'indent', 'blocks', 'align', 'bidi')),
+            array('name' => 'links'),
+            array('name' => 'insert'),
+            '/',
+            array('name' => 'styles'),
+            array('name' => 'colors'),
+            //array('name' => 'tools'),
+            array('name' => 'others'),
+            array('name' => 'mode')
+        );
+        $config['extraPlugins'] = $this->getPluginsToString();
+        //$config['mathJaxLib'] = $this->urlGenerator->generate('javascript').'/math_jax/MathJax.js?config=default';
+        //$config['mathJaxLib'] = api_get_path(WEB_LIBRARY_JS_PATH).'/math_jax/MathJax.js?config=default';
+        $config['fullPage'] = true;
+
+        return $config;
+    }
+
+}

Some files were not shown because too many files changed in this diff