Yannick Warnier 13 years ago
parent
commit
7c9cd4ba7b

+ 25 - 0
certificates/index.php

@@ -0,0 +1,25 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+ * Show specified user certificate
+ * @package chamilo.certificate
+ */
+
+/**
+ * Initialization
+ */
+
+$language_file= 'gradebook';
+
+require_once '../main/inc/global.inc.php';
+require_once api_get_path(LIBRARY_PATH).'certificate.lib.php';
+
+/**
+ * Retrieve certificate
+ */
+$certificate = new Certificate($_GET['id']);
+
+/**
+ * Show results
+ */
+$certificate->show();

+ 0 - 1
main/cron/notification.php

@@ -10,7 +10,6 @@
 $language_file = array('userInfo');
 
 require_once '../inc/global.inc.php';
-require_once api_get_path(LIBRARY_PATH).'notification.lib.php';
 /**
  * Notification sending
  */

+ 26 - 19
main/document/create_document.php

@@ -156,16 +156,21 @@ require_once api_get_path(LIBRARY_PATH).'document.lib.php';
 require_once api_get_path(SYS_CODE_PATH).'document/document.inc.php';
 require_once api_get_path(LIBRARY_PATH).'groupmanager.lib.php';
 require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php';
-require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';
 
-if (isset($_REQUEST['certificate'])) {
+
+//I'm in the certification module?
+$is_certificate_mode = false;
+
+if (isset($_REQUEST['certificate']) && $_REQUEST['certificate'] == 'true') {
+	$is_certificate_mode = true;
+}
+
+if ($is_certificate_mode) {
 	$nameTools = get_lang('CreateCertificate');
 } else {
 	$nameTools = get_lang('CreateDocument');
 }
 
-$nameTools = get_lang('CreateDocument');
-
 /*	Constants and variables */
 
 $document_data = DocumentManager::get_document_data_by_id($_REQUEST['id'], api_get_course_id(), true);    
@@ -205,6 +210,13 @@ if ($dir[strlen($dir) - 1] != '/') {
 	$dir .= '/';
 }
 
+if ($is_certificate_mode) {
+	$document_id 	= DocumentManager::get_document_id(api_get_course_info(), '/certificates');
+	$document_data 	= DocumentManager::get_document_data_by_id($document_id, api_get_course_id(), true);
+	$folder_id = $document_data['id'];
+	$dir = '/certificates/';
+}
+
 // Configuration for the FCKEDITOR
 $doc_tree  = explode('/', $dir);
 $count_dir = count($doc_tree) -2; // "2" because at the begin and end there are 2 "/"
@@ -249,14 +261,6 @@ if (!is_dir($filepath)) {
 	$dir = '/';
 }
 
-
-//I'm in the certification module?
-$is_certificate_mode = false;
-$is_certificate_array = explode('/',$dir);
-array_shift($is_certificate_array);
-if ($is_certificate_array[0]=='certificates') {
-	$is_certificate_mode = true;
-}
 $to_group_id = 0;
 
 if (!$is_certificate_mode) {
@@ -299,10 +303,10 @@ $form = new FormValidator('create_document','post',api_get_self().'?dir='.Securi
 // form title
 $form->addElement('header', '', $nameTools);
 
-if (isset($_REQUEST['certificate'])) {//added condition for certicate in gradebook
+if ($is_certificate_mode) {//added condition for certicate in gradebook
 	$form->addElement('hidden','certificate','true',array('id'=>'certificate'));
 	if (isset($_GET['selectcat']))
-		$form->addElement('hidden','selectcat',intval($_GET['selectcat']));
+		$form->addElement('hidden','selectcat', intval($_GET['selectcat']));
 
 }
 $renderer = & $form->defaultRenderer();
@@ -533,7 +537,7 @@ if ($form->validate()) {
 
 	if (strpos($content, '/css/frames.css') === false) {
 		$content = str_replace('</head>', '<style> body{margin:10px;}</style> <link rel="stylesheet" href="./css/frames.css" type="text/css" /></head>', $content);
-	}
+	}	
 	if ($fp = @fopen($filepath.$filename.'.'.$extension, 'w')) {
 		$content = str_replace(api_get_path(WEB_COURSE_PATH), $_configuration['url_append'].'/courses/', $content);
 		
@@ -585,7 +589,11 @@ if ($form->validate()) {
 			$selectcat = '';
 			if (isset($_REQUEST['selectcat']))
 				$selectcat = "&selectcat=".Security::remove_XSS($_REQUEST['selectcat']);
-			header('Location: document.php?id='.$folder_id.$selectcat);
+			$certificate_condition = '';
+			if ($is_certificate_mode) {
+				$certificate_condition = '&certificate=true';
+			}
+			header('Location: document.php?id='.$folder_id.$selectcat.$certificate_condition);
 			exit ();
 		} else {
 			Display :: display_header($nameTools, 'Doc');
@@ -594,7 +602,6 @@ if ($form->validate()) {
 		}
 	} else {
 		Display :: display_header($nameTools, 'Doc');
-		//api_display_tool_title($nameTools);
 		Display :: display_error_message(get_lang('Impossible'));
 		Display :: display_footer();
 	}
@@ -629,8 +636,8 @@ if ($form->validate()) {
 	Display :: display_header($nameTools, "Doc");
 	//api_display_tool_title($nameTools);
 	// actions
-	if (isset($_REQUEST['certificate'])) {
-		$all_information_by_create_certificate = DocumentManager::get_all_info_to_certificate(api_get_user_id());
+	if ($is_certificate_mode) {
+		$all_information_by_create_certificate = DocumentManager::get_all_info_to_certificate(api_get_user_id(), api_get_course_id());
 		
 		$str_info = '';
 		foreach ($all_information_by_create_certificate[0] as $info_value) {

+ 7 - 5
main/document/document.inc.php

@@ -258,15 +258,17 @@ function create_document_link($document_data, $show_as_icon = false, $counter =
 			     //|| (preg_match('/wav$/', urldecode($url)) && api_get_setting('enable_nanogong') == 'true')
             ) {
             	//yox view
-				$url = 'showinframesmin.php?'.api_get_cidreq().'&id='.$document_data['id'].$req_gid;
-				$class = 'yoxview';
+				//$url = 'showinframesmin.php?'.api_get_cidreq().'&id='.$document_data['id'].$req_gid;
+				//Simpler version of showinframesmin.php with no headers 
+				$url = 'show_content.php?'.api_get_cidreq().'&id='.$document_data['id'].$req_gid.'&width=700&height=500';
+				$class = 'thickbox';
 				if ($visibility == false) {
-					$class = "yoxview invisible";
+					$class = "thickbox invisible";
 				}								
-				return '<a href="'.$url.'" class="'.$class.'" title="'.$tooltip_title_alt.'" target="yoxview" style="float:left">'.$title.'</a>'.$force_download_html.$copy_to_myfiles.$open_in_new_window_link.$pdf_icon;
+				return '<a href="'.$url.'" class="'.$class.'" title="'.$tooltip_title_alt.'" style="float:left">'.$title.'</a>'.$force_download_html.$copy_to_myfiles.$open_in_new_window_link.$pdf_icon;
 			} else {
 				$url = 'showinframes.php?'.api_get_cidreq().'&id='.$document_data['id'].$req_gid;
-			    //No yoxview			
+			    //No plugin just the old and good showinframes.php page 			
             	return '<a href="'.$url.'" title="'.$tooltip_title_alt.'" style="float:left" '.$visibility_class.' >'.$title.'</a>'.$force_download_html.$copy_to_myfiles.$open_in_new_window_link.$pdf_icon;
 			}          
         } else {

+ 45 - 36
main/document/document.php

@@ -69,6 +69,19 @@ $session_id  = api_get_session_id();
 $course_code = api_get_course_id();
 $to_group_id = api_get_group_id();
 
+$is_allowed_to_edit = api_is_allowed_to_edit(null, true);
+$group_member_with_upload_rights = false;
+
+// If the group id is set, we show them group documents
+$group_properties = array();
+$group_properties['directory'] = null;
+
+// For sessions we should check the parameters of visibility
+if (api_get_session_id() != 0) {
+	$group_member_with_upload_rights = $group_member_with_upload_rights && api_is_allowed_to_session_edit(false, true);
+}
+
+
 //Setting group variables 
 if (api_get_group_id()) {
 	// Needed for group related stuff
@@ -174,10 +187,13 @@ switch ($action) {
 
 // I'm in the certification module?
 $is_certificate_mode = DocumentManager::is_certificate_mode($_GET['curdirpath']);
+if (isset($_REQUEST['certificate']) && $_REQUEST['certificate'] == 'true') {
+	$is_certificate_mode = true;	
+}
 
 //If no actions we proceed to show the document (Hack in order to use document.php?id=X) 
 if (isset($document_id)) {
-    $document_data = DocumentManager::get_document_data_by_id($document_id, api_get_course_id(), true); 
+    $document_data = DocumentManager::get_document_data_by_id($document_id, api_get_course_id(), true);
     
     //If the document is not a folder we show the document
     if ($document_data) {
@@ -237,6 +253,9 @@ if (isset($document_id)) {
 	$parent_id     = $document_data['parent_id'];	
 }
 
+if (isset($document_data) && $document_data['path'] == '/certificates') {
+	$is_certificate_mode = true;	
+}
 
 if (!$parent_id) {
     $parent_id = 0; 
@@ -274,6 +293,7 @@ $tool_sql           = 'SELECT visibility FROM ' . $table_course_tool . ' WHERE n
 $tool_result        = Database::query($tool_sql);
 $tool_row           = Database::fetch_array($tool_result);
 $tool_visibility    = $tool_row['visibility'];
+
 if ($tool_visibility == '0' && $to_group_id == '0' && !($is_allowed_to_edit || $group_member_with_upload_rights)) {
     api_not_allowed(true);
 }
@@ -288,18 +308,6 @@ function confirmation (name) {
 }
 </script>";
 
-$is_allowed_to_edit = api_is_allowed_to_edit(null, true);
-$group_member_with_upload_rights = false;
-
-// If the group id is set, we show them group documents
-$group_properties = array();
-$group_properties['directory'] = null;
-
-// For sessions we should check the parameters of visibility
-if (api_get_session_id() != 0) {
-    $group_member_with_upload_rights = $group_member_with_upload_rights && api_is_allowed_to_session_edit(false, true);
-}
-
 // If they are looking at group documents they can't see the root
 if ($to_group_id != 0 && $curdirpath == '/') {
     $curdirpath = $group_properties['directory'];
@@ -392,23 +400,25 @@ if (empty($document_data['parents'])) {
 if (isset($_GET['createdir'])) {
     $interbreadcrumb[] = array('url' => '#', 'name' => get_lang('CreateDir'));
 }
-
-$htmlHeadXtra[] = api_get_jquery_js();
 $htmlHeadXtra[] = api_get_jquery_ui_js();
 
+$js_path 		= api_get_path(WEB_LIBRARY_PATH).'javascript/';
+/*
+$htmlHeadXtra[] = '<script type="text/javascript" src="'.$js_path.'yoxview/yox.js"></script>';
 $htmlHeadXtra[] = api_get_js('yoxview/yoxview-init.js');
-$js_path = api_get_path(WEB_LIBRARY_PATH).'javascript/';   
-$htmlHeadXtra[] = '<link rel="stylesheet" href="'.$js_path.'yoxview/yoxview.css" type="text/css">';
+*/
+
 $htmlHeadXtra[] = '<link rel="stylesheet" href="'.$js_path.'jquery-jplayer/skins/chamilo/jplayer.blue.monday.css" type="text/css">';
 $htmlHeadXtra[] = '<script type="text/javascript" src="'.$js_path.'jquery-jplayer/jquery.jplayer.min.js"></script>';
 
+
 $mediaplayer_path = api_get_path(WEB_LIBRARY_PATH).'mediaplayer/player.swf';
 
 //automatic loading the course language for yoxview
-$yoxview_code_translation_table = array('' => 'en', 'pt' => 'pt-Pt', 'sr' => 'sr_latn');
+/*$yoxview_code_translation_table = array('' => 'en', 'pt' => 'pt-Pt', 'sr' => 'sr_latn');
 $lang_yoxview  = api_get_language_isocode();
 $lang_yoxview = isset($yoxview_code_translation_table[$lang_yoxview]) ? $yoxview_code_translation_table[$lang_yoxview] : $lang_yoxview;
-
+*/
 $docs_and_folders = DocumentManager::get_all_document_data($_course, $curdirpath, $to_group_id, null, $is_allowed_to_edit || $group_member_with_upload_rights, false);
 
 $file_list = $format_list = '';
@@ -443,15 +453,14 @@ foreach ($docs_and_folders  as $file) {
 }
  
 $htmlHeadXtra[] = '<script type="text/javascript">
-$(document).ready( function() {  
-	  
-    $(".yoxview").yoxview({
+$(document).ready( function() {
+	   /*
+    $(".yoxview").yoxview({ 
         lang: "'.$lang_yoxview.'",
         flashVideoPlayerPath: "'.$mediaplayer_path.'",
         allowInternalLinks:true,
-        defaultDimensions: { iframe: { width: 800}},
-        titleAttribute : "alt"        
-    });
+        defaultDimensions: { iframe: { width: 800}},              
+    });*/
         
     //Experimental changes to preview mp3, ogg files        
      '.$jquery.'              
@@ -871,17 +880,17 @@ if ($folders === false) {
 }
 
 echo '<div class="actions">';
-//if ($is_allowed_to_edit || $group_member_with_upload_rights){
-/* BUILD SEARCH FORM */
-    echo '<span style="display:inline-block;">';
-    $form = new FormValidator('search_document', 'get', '', '', null, false);
-    $renderer = & $form->defaultRenderer();
-    $renderer->setElementTemplate('<span>{element}</span> ');
-    $form->add_textfield('keyword', '', false);
-    $form->addElement('style_submit_button', 'submit', get_lang('Search'), 'class="search"');
-    $form->display();
-    echo '</span>';
-//}
+	if (!$is_certificate_mode) {
+		/* BUILD SEARCH FORM */
+	    echo '<span style="display:inline-block;">';
+	    $form = new FormValidator('search_document', 'get', '', '', null, false);
+	    $renderer = & $form->defaultRenderer();
+	    $renderer->setElementTemplate('<span>{element}</span> ');
+	    $form->add_textfield('keyword', '', false);
+	    $form->addElement('style_submit_button', 'submit', get_lang('Search'), 'class="search"');
+	    $form->display();
+	    echo '</span>';
+	}
 
 /* GO TO PARENT DIRECTORY */
 if ($curdirpath!= '/' && $curdirpath != $group_properties['directory'] && !$is_certificate_mode) {

+ 10 - 2
main/document/download.php

@@ -71,8 +71,16 @@ if (substr($refer_script, 0, 15) == '/fillsurvey.php') {
 
 if (Security::check_abs_path($sys_course_path.$doc_url, $sys_course_path.'/')) {
     $full_file_name = $sys_course_path.$doc_url;    
-    // Check visibility of document and paths    
-    $is_visible = DocumentManager::check_visibility_tree($document_id, api_get_course_id(), api_get_session_id(), api_get_user_id());
+    // Check visibility of document and paths    doc_url
+    //var_dump($document_id, api_get_course_id(), api_get_session_id(), api_get_user_id());
+    $is_visible = false;
+    $course_info   = api_get_course_info(api_get_course_id());
+    $document_id = DocumentManager::get_document_id($course_info, $doc_url);
+    
+    if ($document_id) {
+    	$is_visible = DocumentManager::check_visibility_tree($document_id, api_get_course_id(), api_get_session_id(), api_get_user_id());
+    }
+    
     //$is_visible = DocumentManager::is_visible($doc_url, $_course, api_get_session_id());
     if (!api_is_allowed_to_edit() && !$is_visible) {
     	Display::display_error_message(get_lang('ProtectedDocument'));//api_not_allowed backbutton won't work.

+ 1 - 1
main/document/edit_document.php

@@ -493,7 +493,7 @@ if ($owner_id == api_get_user_id() || api_is_platform_admin() || $is_allowed_to_
 	$form->addElement('html', '<div id="frmModel" style="display:block; height:525px; width:240px; position:absolute; top:115px; left:1px;"></div>');
 	*/
 	if (isset($_REQUEST['curdirpath']) && $dir =='/certificates') {
-		$all_information_by_create_certificate=DocumentManager::get_all_info_to_certificate(api_get_user_id());
+		$all_information_by_create_certificate=DocumentManager::get_all_info_to_certificate(api_get_user_id(), api_get_course_id());
 		$str_info='';
 		foreach ($all_information_by_create_certificate[0] as $info_value) {
 			$str_info.=$info_value.'<br/>';

+ 104 - 0
main/document/show_content.php

@@ -0,0 +1,104 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+ *	@author jmontoya
+ *  
+ *	@package chamilo.document
+ */
+/**
+ * Code
+ */
+/*   INITIALIZATION */
+
+$language_file[] = 'document';
+require_once '../inc/global.inc.php';
+require_once api_get_path(LIBRARY_PATH).'document.lib.php';
+require_once api_get_path(LIBRARY_PATH).'glossary.lib.php';
+require_once api_get_path(LIBRARY_PATH).'groupmanager.lib.php';
+
+// Protection
+api_protect_course_script();
+
+$noPHP_SELF = true;
+$header_file = Security::remove_XSS($_GET['file']);
+$document_id = intval($_GET['id']);
+
+$course_info = api_get_course_info();
+$course_code = api_get_course_id(); 
+
+if (empty($course_info)) {
+    api_not_allowed(true);
+}
+
+//Generate path 
+if (!$document_id) {
+    $document_id = DocumentManager::get_document_id($course_info, $header_file);
+}
+$document_data = DocumentManager::get_document_data_by_id($document_id, $course_code);
+
+if (empty($document_data)) {
+    api_not_allowed(true);
+}
+
+$header_file  = $document_data['path'];
+$name_to_show = cut($header_file, 80);
+
+$path_array = explode('/', str_replace('\\', '/', $header_file));
+$path_array = array_map('urldecode', $path_array);
+$header_file = implode('/', $path_array);
+
+$file = Security::remove_XSS(urldecode($document_data['path']));
+
+$file_root = $course_info['path'].'/document'.str_replace('%2F', '/', $file);
+$file_url_sys = api_get_path(SYS_COURSE_PATH).$file_root;
+$file_url_web = api_get_path(WEB_COURSE_PATH).$file_root;
+
+if (!file_exists($file_url_sys)) {
+    api_not_allowed(true);
+}
+
+if (is_dir($file_url_sys)) {
+    api_not_allowed(true);
+}
+
+//fix the screen when you try to access a protected course through the url
+$is_allowed_in_course = $_SESSION ['is_allowed_in_course'];
+
+if ($is_allowed_in_course == false) {
+    api_not_allowed(true);
+}
+
+//Check user visibility
+//$is_visible = DocumentManager::is_visible_by_id($document_id, $course_info, api_get_session_id(), api_get_user_id());
+$is_visible = DocumentManager::check_visibility_tree($document_id, api_get_course_id(), api_get_session_id(), api_get_user_id());
+if (!api_is_allowed_to_edit() && !$is_visible) {
+    api_not_allowed(true);
+}
+
+//TODO:clean all code
+
+/*	Main section */
+header('Expires: Wed, 01 Jan 1990 00:00:00 GMT');
+//header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+header('Last-Modified: Wed, 01 Jan 2100 00:00:00 GMT');
+header('Cache-Control: no-cache, must-revalidate');
+header('Pragma: no-cache');
+$browser_display_title = 'Documents - '.Security::remove_XSS($_GET['cidReq']).' - '.$file;
+
+$file_url_web = api_get_path(WEB_COURSE_PATH).$_course['path'].'/document'.$header_file.'?'.api_get_cidreq();
+
+$pathinfo = pathinfo($header_file);
+if ($pathinfo['extension']=='wav' && api_get_setting('enable_nanogong') == 'true'){
+	echo '<div align="center">';
+		echo '<br/>';
+		echo '<applet id="applet" archive="../inc/lib/nanogong/nanogong.jar" code="gong.NanoGong" width="160" height="40" >';
+			echo '<param name="SoundFileURL" value="'.$file_url_web.'" />';
+			echo '<param name="ShowSaveButton" value="false" />';
+			echo '<param name="ShowTime" value="true" />';
+			echo '<param name="ShowRecordButton" value="false" />';
+		echo '</applet>';
+	echo '</div>';
+} else {
+	if ($pathinfo['extension']=='swf') { $width='83%'; $height='83%';} else {$width='100%'; $height='100%';}	
+	echo '<iframe border="0" frameborder="0" scrolling="no" style="width:'.$width.'; height:'.$height.';background-color:#ffffff;" id="mainFrame" name="mainFrame" src="'.$file_url_web.'?'.api_get_cidreq().'&amp;rand='.mt_rand(1, 10000).'"></iframe>';
+}

+ 1 - 0
main/document/showinframes.php

@@ -86,6 +86,7 @@ if ($is_allowed_in_course == false) {
 //$is_visible = DocumentManager::is_visible_by_id($document_id, $course_info, api_get_session_id(), api_get_user_id());
 $is_visible = DocumentManager::check_visibility_tree($document_id, api_get_course_id(), api_get_session_id(), api_get_user_id());
 
+
 if (!api_is_allowed_to_edit() && !$is_visible) {
     api_not_allowed(true);
 }

+ 162 - 104
main/exercice/question_pool.php

@@ -27,19 +27,21 @@ $this_section=SECTION_COURSES;
 
 $is_allowedToEdit=api_is_allowed_to_edit(null,true);
 
-if ( empty ( $delete ) ) {
+if (empty($delete)) {
     $delete = intval($_GET['delete']);
 }
 if ( empty ( $recup ) ) {
     $recup = intval($_GET['recup']);
 }
 if ( empty ( $fromExercise ) ) {
-    $fromExercise = intval($_GET['fromExercise']);
+    $fromExercise = intval($_REQUEST['fromExercise']);
 }
 if(isset($_GET['exerciseId'])){
 	$exerciseId = intval($_GET['exerciseId']);
 }
-if(isset($_GET['exerciseLevel'])){
+
+$exerciseLevel = -1;
+if(isset($_REQUEST['exerciseLevel'])){
 	$exerciseLevel = intval($_REQUEST['exerciseLevel']);
 }
 if(isset($_GET['answerType'])){
@@ -64,7 +66,7 @@ $selected_course = intval($_GET['selected_course']);
 
 
 // maximum number of questions on a same page
-$limitQuestPage=50;
+$limitQuestPage = 20;
 
 // document path
 $documentPath = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document';
@@ -84,7 +86,7 @@ if ($is_allowedToEdit) {
 	
 	//Duplicating a Question
     
-	if ($copy_question != 0 && isset($fromExercise)) {
+	if (!isset($_POST['recup']) && $copy_question != 0 && isset($fromExercise)) {
         $origin_course_id   = intval($_GET['course_id']);
         $origin_course_info = api_get_course_info_by_id($origin_course_id);
         $current_course     = api_get_course_info();     
@@ -92,39 +94,40 @@ if ($is_allowedToEdit) {
         
         //Reading the source question
 		$old_question_obj = Question::read($old_question_id, $origin_course_id);
-		$old_question_obj->updateTitle($old_question_obj->selectTitle().' - '.get_lang('Copy'));     
-        
-        //Duplicating the source question, in the current course
-		$new_id = $old_question_obj->duplicate($current_course);
-		
-        //Reading new question
-		$new_question_obj = Question::read($new_id);			
-		$new_question_obj->addToList($fromExercise);
-        			
-        //Reading Answers obj of the current course 
-		$new_answer_obj = new Answer($old_question_id, $origin_course_id);
-		$new_answer_obj->read();
-        
-        //Duplicating the Answers in the current course
-		$new_answer_obj->duplicate($new_id, $current_course);		
-		
-		// destruction of the Question object
-		unset($new_question_obj);
-		unset($old_question_obj);
-
-        if (!$objExcercise instanceOf Exercise) {
-        	$objExercise = new Exercise();
-            $objExercise->read($fromExercise);
-        }
-		// adds the question ID represented by $recup into the list of questions for the current exercise
-		//$objExercise->addToList($new_id);
-		api_session_register('objExercise');
+		if ($old_question_obj) {
+			$old_question_obj->updateTitle($old_question_obj->selectTitle().' - '.get_lang('Copy'));     
+	        
+	        //Duplicating the source question, in the current course
+			$new_id = $old_question_obj->duplicate($current_course);
+			
+	        //Reading new question
+			$new_question_obj = Question::read($new_id);
+						
+			$new_question_obj->addToList($fromExercise);
+	        			
+	        //Reading Answers obj of the current course 
+			$new_answer_obj = new Answer($old_question_id, $origin_course_id);
+			$new_answer_obj->read();
+	        
+	        //Duplicating the Answers in the current course
+			$new_answer_obj->duplicate($new_id, $current_course);		
+			
+			// destruction of the Question object
+			unset($new_question_obj);
+			unset($old_question_obj);
+	
+	        if (!$objExcercise instanceOf Exercise) {
+	        	$objExercise = new Exercise();
+	            $objExercise->read($fromExercise);
+	        }
+			api_session_register('objExercise');
+		}
 		header("Location: admin.php?".api_get_cidreq()."&exerciseId=$fromExercise");
 		exit();	
 	}
 	
 	// deletes a question from the data base and all exercises
-	if($delete) {
+	if ($delete) {
 		// construction of the Question object
 		// if the question exists
 		if($objQuestionTmp = Question::read($delete))
@@ -136,6 +139,7 @@ if ($is_allowedToEdit) {
 		// destruction of the Question object
 		unset($objQuestionTmp);
 	} elseif($recup && $fromExercise) {
+		/*
 		// gets an existing question and copies it into a new exercise
 		$objQuestionTmp = Question :: read($recup);
 		
@@ -155,24 +159,63 @@ if ($is_allowedToEdit) {
 		$objExercise->addToList($recup);
 		api_session_register('objExercise');
 		header("Location: admin.php?".api_get_cidreq()."&exerciseId=$fromExercise");
-		exit();
+		exit();*/
 	} else if( isset($_POST['recup']) && is_array($_POST['recup']) && $fromExercise) {
-		$list_recup = $_POST['recup'];
-		foreach ($list_recup as $recup) {
-			$recup = intval($recup);
-			// if the question exists
-			if($objQuestionTmp = Question :: read($recup)) {
-				// adds the exercise ID represented by $fromExercise into the list of exercises for the current question
-				$objQuestionTmp->addToList($fromExercise);
+		$list_recup 		= $_POST['recup'];
+		
+		foreach ($list_recup as $course_id => $question_data) {
+			
+			$origin_course_id   = intval($course_id);
+			$origin_course_info = api_get_course_info_by_id($origin_course_id);
+			$current_course     = api_get_course_info();
+			
+			foreach ($question_data as $old_question_id) {			
+				/*
+				$recup = intval($recup);
+				// if the question exists
+				if($objQuestionTmp = Question :: read($recup)) {
+					// adds the exercise ID represented by $fromExercise into the list of exercises for the current question
+					$objQuestionTmp->addToList($fromExercise);
+				}
+				// destruction of the Question object
+				unset($objQuestionTmp);
+		        if(!$objExcercise instanceOf Exercise) {
+		        	$objExercise = new Exercise();
+		            $objExercise->read($fromExercise);
+		        }
+				// adds the question ID represented by $recup into the list of questions for the current exercise
+				$objExercise->addToList($recup);
+				*/	
+				
+				//Reading the source question
+				$old_question_obj = Question::read($old_question_id, $origin_course_id);
+				if ($old_question_obj) {
+					$old_question_obj->updateTitle($old_question_obj->selectTitle().' - '.get_lang('Copy'));
+					
+					//Duplicating the source question, in the current course
+					$new_id = $old_question_obj->duplicate($current_course);
+					
+					//Reading new question
+					$new_question_obj = Question::read($new_id);
+					$new_question_obj->addToList($fromExercise);
+					 
+					//Reading Answers obj of the current course
+					$new_answer_obj = new Answer($old_question_id, $origin_course_id);
+					$new_answer_obj->read();
+					
+					//Duplicating the Answers in the current course
+					$new_answer_obj->duplicate($new_id, $current_course);
+					
+					// destruction of the Question object
+					unset($new_question_obj);
+					unset($old_question_obj);
+					
+					if (!$objExcercise instanceOf Exercise) {
+						$objExercise = new Exercise();
+						$objExercise->read($fromExercise);
+					}
+				}
 			}
-			// destruction of the Question object
-			unset($objQuestionTmp);
-	        if(!$objExcercise instanceOf Exercise) {
-	        	$objExercise = new Exercise();
-	            $objExercise->read($fromExercise);
-	        }
-			// adds the question ID represented by $recup into the list of questions for the current exercise
-			$objExercise->addToList($recup);
 		}
 		api_session_register('objExercise');
 		header("Location: admin.php?".api_get_cidreq()."&exerciseId=$fromExercise");
@@ -227,7 +270,7 @@ $session_select_list = array();
 foreach($session_list as $item) {
     $session_select_list[$item['id']] = $item['name'];
 }
-$select_session_html =  Display::select('session_id', $session_select_list, $session_id, array('onchange'=>'submit_form(this);'));
+$select_session_html =  Display::select('session_id', $session_select_list, $session_id, array('class'=>'chzn-select','onchange'=>'submit_form(this);'));
 echo Display::form_row(get_lang('Session'), $select_session_html);
 
 //Course list
@@ -242,7 +285,7 @@ foreach ($course_list as $item) {
 	$course_select_list[$item['id']] = $item['title'];
 }    
 
-$select_course_html =  Display::select('selected_course', $course_select_list, $selected_course, array('onchange'=>'submit_form(this);'));
+$select_course_html =  Display::select('selected_course', $course_select_list, $selected_course, array('class'=>'chzn-select','onchange'=>'submit_form(this);'));
 echo Display::form_row(get_lang('Course'), $select_course_html);    
 
 if (empty($selected_course) || $selected_course == '-1') {
@@ -261,8 +304,6 @@ $TBL_REPONSES          = Database::get_course_table(TABLE_QUIZ_ANSWER,
 
 $exercise_list         = get_all_exercises($course_info, $session_id);
 
-echo '<input type="hidden" name="fromExercise" value="'.$fromExercise.'">';
-
 //Exercise List
 $my_exercise_list = array();
 $my_exercise_list['0']  = get_lang('AllExercises');
@@ -275,18 +316,18 @@ if (is_array($exercise_list)) {
         }
     }
 }    
-$select_exercise_html =  Display::select('exerciseId', $my_exercise_list, $exerciseId, array('onchange'=>'submit_form(this);'), false);
+$select_exercise_html =  Display::select('exerciseId', $my_exercise_list, $exerciseId, array('class'=>'chzn-select','onchange'=>'submit_form(this);'), false);
 echo Display::form_row(get_lang('Exercise'), $select_exercise_html);
 
-//Difficulty list (only from 0 to 5)
-                
-$select_difficulty_html = Display::select('exerciseLevel', array(0=>0, 1=>1,2=>2,3=>3,4=>4,5=>5), $exerciseLevel, array('onchange'=>'submit_form(this);'));
+//Difficulty list (only from 0 to 5)                
+$select_difficulty_html = Display::select('exerciseLevel', array(-1 => get_lang('All'), 0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5), $exerciseLevel, array('class'=>'chzn-select', 'onchange'=>'submit_form(this);'), false);
 echo Display::form_row(get_lang('Difficulty'), $select_difficulty_html);
 
 //Answer type
 
 $question_list = Question::get_types_information();
 $new_question_list = array();
+$new_question_list['-1']  = get_lang('All');
 $objExercise->feedbacktype;
 foreach ($question_list as $key=>$item) {
     if ($objExercise->feedbacktype == EXERCISE_FEEDBACK_TYPE_DIRECT) {
@@ -303,7 +344,7 @@ foreach ($question_list as $key=>$item) {
 }
 
 //Answer type list
-$select_answer_html = Display::select('answerType', $new_question_list, $answerType, array('onchange'=>'submit_form(this);'));
+$select_answer_html = Display::select('answerType', $new_question_list, $answerType, array('class'=>'chzn-select','onchange'=>'submit_form(this);'), false);
 echo Display::form_row(get_lang('AnswerType'), $select_answer_html);
 $button = '<button class="save" type="submit" name="name" value="'.get_lang('Filter').'">'.get_lang('Filter').'</button>'; 
 echo Display::form_row('', $button);
@@ -311,12 +352,14 @@ echo Display::form_row('', $button);
 </form>
 <div class="clear"></div>
 <form method="post" action="<?php echo $url.'?'.api_get_cidreq().'&fromExercise='.$fromExercise; ?>" >
-
 <?php
+echo '<input type="hidden" name="course_id" value="'.$selected_course.'">';
 echo '<table class="data_table">';
-$from=$page*$limitQuestPage;
-// if we have selected an exercise in the list-box 'Filter'
+$from = $page * $limitQuestPage;
+
+$show_pagination = true;
 
+// if we have selected an exercise in the list-box 'Filter'
 if ($exerciseId > 0) {
 	//$sql="SELECT id,question,type FROM $TBL_EXERCICE_QUESTION,$TBL_QUESTIONS WHERE question_id=id AND exercice_id='".Database::escape_string($exerciseId)."' ORDER BY question_order LIMIT $from, ".($limitQuestPage + 1);
 	$where = '';
@@ -332,9 +375,9 @@ if ($exerciseId > 0) {
 		$where .= ' type='.$answerType.' AND ';
 	}
 
-	$sql="SELECT id,question,type,level
+	$sql = "SELECT id,question,type,level
 			FROM $TBL_EXERCICE_QUESTION,$TBL_QUESTIONS
-		  	WHERE $where question_id=id AND exercice_id='".Database::escape_string($exerciseId)."'
+		  	WHERE $where question_id=id AND exercice_id='".$exerciseId."'
 			ORDER BY question_order";
             
     $result=Database::query($sql);
@@ -383,7 +426,7 @@ if ($exerciseId > 0) {
 		$answer_where = ' questions.type='.$answerType.' AND ';
 	}
 
-	$sql='SELECT questions.id, questions.question, questions.type, quizz_questions.exercice_id , level, session_id
+	$sql = 'SELECT questions.id, questions.question, questions.type, quizz_questions.exercice_id , level, session_id
 			FROM '.$TBL_QUESTIONS.' as questions LEFT JOIN '.$TBL_EXERCICE_QUESTION.' as quizz_questions
 			ON questions.id=quizz_questions.question_id LEFT JOIN '.$TBL_EXERCICES.' as exercices
 			ON exercice_id=exercices.id
@@ -396,9 +439,8 @@ if ($exerciseId > 0) {
     }
 
 } else {
+	$show_pagination = false;
 	// if we have not selected any option in the list-box 'Filter'
-
-	//$sql="SELECT id,question,type FROM $TBL_QUESTIONS LIMIT $from, ".($limitQuestPage + 1);
 	$filter = '';
 
 	if (isset($type) && $type==1){
@@ -418,11 +460,11 @@ if ($exerciseId > 0) {
     }
     
 	$new_limit_page = $limitQuestPage + 1;
-    if ($session_id != 0) {       
-
+	
+    if ($session_id != 0) {
         $main_question_list = array();
         if (!empty($course_list))
-        foreach ($course_list as $course_item) {        
+        foreach ($course_list as $course_item) {    
             if (!empty($selected_course) && $selected_course != '-1') {
                 if ($selected_course != $course_item['id']) {                
                 	continue;
@@ -454,7 +496,13 @@ if ($exerciseId > 0) {
                                          continue;
                                      }
                                 }                    
-                                $question_row       = array('id'=>$question_obj->id, 'question'=>$question_obj->question, 'type'=>$question_obj->type, 'level'=>$question_obj->level, 'exercise_id'=>$exercise['id']);
+                                $question_row = array(	'id'			=> $question_obj->id, 
+                                						'question'		=> $question_obj->question, 
+                                						'type'			=> $question_obj->type, 
+                                						'level'			=> $question_obj->level, 
+                                						'exercise_id'	=> $exercise['id'],
+                                						'course_id'		=> $course_item['id'],
+                                );
                                                             
                                 $main_question_list[]    = $question_row;                        
                             }
@@ -467,52 +515,55 @@ if ($exerciseId > 0) {
         //By default
     	$sql="SELECT qu.id, question, qu.type, level, q.session_id FROM $TBL_QUESTIONS as qu, $TBL_EXERCICE_QUESTION as qt, $TBL_EXERCICES as q
               WHERE q.id=qt.exercice_id AND qu.id=qt.question_id AND qt.exercice_id<>".$fromExercise." $filter ORDER BY session_id ASC LIMIT $from, $new_limit_page";
+    	$result = Database::query($sql);
+    	
+    	while($row = Database::fetch_array($result, 'ASSOC')) {
+    		$main_question_list[] = $row;
+    	}
     }
 	// forces the value to 0
 	$exerciseId=0;
 }
 $nbrQuestions = count($main_question_list);
-
-echo '<tr>',
-  '<td colspan="',($fromExercise?4:4),'">',
-	'<table border="0" cellpadding="0" cellspacing="0" width="100%">',
-	'<tr>',
-	  '<td>';
-echo '</td>',
- '<td align="right">';
-
-if(!empty($page)) {
-	echo '<a href="',api_get_self(),'?',api_get_cidreq(),'&exerciseId=',$exerciseId,'&fromExercise=',$fromExercise,'&page=',($page-1),'&answerType=',$answerType,'&exerciseLevel='.$exerciseLevel.'">';
-	echo Display::return_icon('action_prev.png');
-	echo '&nbsp;'.get_lang('PreviousPage'),'</a> | ';
+if ($show_pagination) {
+	echo '<tr>',
+	  '<td colspan="',($fromExercise?4:4),'">',
+		'<table border="0" cellpadding="0" cellspacing="0" width="100%">',
+		'<tr><td align="right">';
 	
-} elseif($nbrQuestions > $limitQuestPage) {
-	echo Display::return_icon('action_prev_na.png');
-	echo '&nbsp;'.get_lang('PreviousPage'),' | ';
-}
-
-if($nbrQuestions > $limitQuestPage) {
-	echo '<a href="',api_get_self(),'?',api_get_cidreq(),'&exerciseId=',$exerciseId,'&fromExercise=',$fromExercise,'&page=',($page+1),'&answerType=',$answerType,'&exerciseLevel='.$exerciseLevel.'">',get_lang('NextPage').'&nbsp;';
-	echo Display::return_icon('action_next.png');
-	echo '</a>';
+	if(!empty($page)) {	
+		echo '<a href="',api_get_self(),'?',api_get_cidreq(),'&exerciseId=',$exerciseId,'&fromExercise=',$fromExercise,'&page=',($page-1),'&session_id='.$session_id.'&selected_course='.$selected_course.'&answerType=',$answerType,'&exerciseLevel='.$exerciseLevel.'">';
+		echo Display::return_icon('action_prev.png');
+		echo '&nbsp;';
+		
+	} elseif($nbrQuestions > $limitQuestPage) {
+		echo Display::return_icon('action_prev_na.png');
+		echo '&nbsp;';
+	}
 	
-} elseif($page) {
-   echo get_lang('NextPage');
-   echo '&nbsp;'.Display::return_icon('action_next_na.png');
+	if($nbrQuestions > $limitQuestPage) {
+		echo '<a href="',api_get_self(),'?',api_get_cidreq(),'&exerciseId=',$exerciseId,'&fromExercise=',$fromExercise,'&page=',($page+1),'&session_id='.$session_id.'&selected_course='.$selected_course.'&answerType=',$answerType,'&exerciseLevel='.$exerciseLevel.'">';
+		echo Display::return_icon('action_next.png');
+		echo '</a>';
+		
+	} elseif($page) {
+	   	echo Display::return_icon('action_next_na.png');
+	   echo '&nbsp;';
+	}
+	echo '</td>
+		</tr>
+		</table>
+	  </td>
+	</tr>';
 }
-echo '</td>
-	</tr>
-	</table>
-  </td>
-</tr>
-<tr bgcolor="#e6e6e6">';
+echo '<tr>';
 
 if (!empty($fromExercise)) {
 	if (api_get_session_id() == 0 ){
     	echo '<th width="4%"> </th>';
 	}
     echo '<th>',get_lang('Question'),'</th>',
-        '<th>',get_lang('Level'),'</th>',
+        '<th>',get_lang('Difficulty'),'</th>',
         '<th>',get_lang('Reuse'),'</th>';
 } else {
     echo '<td width="60%" align="center">',get_lang('Question'),'</td>',
@@ -525,6 +576,12 @@ $i=1;
 $session_id  = api_get_session_id();
 if (!empty($main_question_list))
 foreach ($main_question_list as $row) {
+	$my_course_id = 0;
+	if (isset($row['course_id'])) {
+		$my_course_id = $row['course_id'];
+	}
+	
+
 	// if we come from the exercise administration to get a question,
     // don't show the questions already used by that exercise
 
@@ -533,7 +590,7 @@ foreach ($main_question_list as $row) {
 	if (!$fromExercise || !isset($objExercise) || !($objExercise instanceOf Exercise) || (is_array($objExercise->questionList)) ) {
         echo '<tr ',($i%2==0?'class="row_odd"':'class="row_even"'),'>';
         if (api_get_session_id() == 0 ){
-        	echo '<td align="center"> <input type="checkbox" value="'.$row['id'].'" name="recup[]"/></td>';
+        	echo '<td align="center"> <input type="checkbox" value="'.$row['id'].'" name="recup['.$my_course_id.'][]"/></td>';
         }
         echo '  <td><a href="admin.php?',api_get_cidreq(),'&editQuestion=',$row['id'],'&fromExercise='.$fromExercise.'&answerType='.$row['type'].'">',$row['question'],'</a></td>';
         echo '  <td align="center" >';
@@ -546,7 +603,8 @@ foreach ($main_question_list as $row) {
 		} else {
 			echo $row['level'],'</td>',
 				 '<td align="center">';
-			echo '<a href="'.api_get_self().'?'.api_get_cidreq().'&amp;copy_question='.$row['id'].'&course_id='.$selected_course.'&fromExercise=',$fromExercise,'">';                
+			
+			echo '<a href="'.api_get_self().'?'.api_get_cidreq().'&amp;copy_question='.$row['id'].'&course_id='.$my_course_id.'&fromExercise=',$fromExercise,'">';                
             echo ' '.Display::return_icon('cd.gif', get_lang('ReUseACopyInCurrentTest'));
             echo '</a> ';
 			if ($row['session_id'] == $session_id) {

+ 3 - 2
main/gradebook/gradebook_display_certificate.php

@@ -111,8 +111,8 @@ echo Display::tag('h3', get_lang('GradebookListOfStudentsCertificates'));
 	<td>
 	<table class="data_table" width="100%" >
 		<?php
-		$list_certificate = get_list_gradebook_certificates_by_user_id ($value['user_id'],$cat_id);
-		foreach ($list_certificate as $index_certificate=>$value_certificate) {
+		$list_certificate = get_list_gradebook_certificates_by_user_id ($value['user_id'], $cat_id);		
+		foreach ($list_certificate as $index_certificate => $value_certificate) {
 			?>
 			<tr >
 			<td width="50%"><?php echo get_lang('Score').' : '.$value_certificate['score_certificate'] ?></td>
@@ -120,6 +120,7 @@ echo Display::tag('h3', get_lang('GradebookListOfStudentsCertificates'));
 			<td width="20%">
 			<?php			
                 $url = "index.php?export_certificate=yes&cat_id=".$cat_id."&user=".$value['user_id'];
+                //$url = api_get_path(WEB_PATH).'certificates/?id=';
     			$certificates = Display::url(Display::return_icon('certificate.png', get_lang('Certificates'), array(), 22), $url, array('target'=>'_blank'));
     			echo $certificates;
             ?>

+ 2 - 2
main/gradebook/gradebook_edit_cat.php

@@ -35,12 +35,12 @@ if ($form->validate()) {
 	$cat->set_parent_id($values['hid_parent_id']);
 	$cat->set_weight($values['weight']);
 	$cat->set_certificate_min_score($values['certif_min_score']);
-	if (empty ($values['visible'])) {
+	/*if (empty ($values['visible'])) {
 		$visible = 0;
 	} else {
 		$visible = 1;
 	}
-	$cat->set_visible($visible);
+	$cat->set_visible($visible);*/
 	$cat->save();
 	header('Location: '.Security::remove_XSS($_SESSION['gradebook_dest']).'?editcat=&selectcat=' . $cat->get_parent_id());
 	exit;

+ 12 - 7
main/gradebook/index.php

@@ -608,6 +608,7 @@ if (isset ($_GET['studentoverview'])) {
     if (empty($user_id)) {
         api_not_allowed();
     }
+    
     $my_category = Category :: load($category); //hack replace $category = Category :: load ($_GET['cat_id']); to get de course name in certificates
     global $charset;
     
@@ -626,7 +627,7 @@ if (isset ($_GET['studentoverview'])) {
                     echo @file_get_contents($user_certificate);                    
                 }  
 	        } else {
-	            $new_content_html = get_user_certificate_content($user_id, true);
+	            $new_content_html = get_user_certificate_content($user_id, api_get_course_id(), true);
 	            if (empty($new_content_html)) {
 	                Display :: display_reduced_header();
                     Display :: display_warning_message(get_lang('NoCertificateAvailable'));	                
@@ -675,7 +676,7 @@ if (isset ($_GET['studentoverview'])) {
     			$name    = $data['path_certificate'];
     
     			if (!empty($data)) {
-    			    $new_content_html = get_user_certificate_content($user_id, false);
+    			    $new_content_html = get_user_certificate_content($user_id, api_get_course_id(), false);
     				    
     				if ($cat_id = strval(intval($cat_id))) {    				    
     				    $my_path_certificate = $path_directory_user_certificate.$name;
@@ -847,12 +848,16 @@ if ($category != '0') {
             //$score_compare = ($scoretotal[0] / $scoretotal[1]) * 100; //build the total percentage obtained in order to compare it to the minimum certification percentage
 			if (isset($certificate_min_score) && $item_value >= $certificate_min_score) {
 				$url  = api_get_path(WEB_CODE_PATH) .'gradebook/'.Security::remove_XSS($_SESSION['gradebook_dest']).'?export_certificate=yes&cat_id='.$cats[0]->get_id();
-
-				$certificates = Display::url(Display::return_icon('certificate.png', get_lang('Certificates'), array(), 48), $url, array('target'=>'_blank'));
 				
-				echo '<div class="actions" align="right">';
-				echo $certificates;
-				echo '</div>';
+				$my_certificate = get_certificate_by_user_id($cats[0]->get_id(), api_get_user_id());
+				if (!empty($my_certificate)) {
+					$url  = api_get_path(WEB_PATH) .'certificates/?id='.$my_certificate['id'];	
+					$certificates = Display::url(Display::return_icon('certificate.png', get_lang('Certificates'), array(), 48), $url, array('target'=>'_blank'));					
+					echo '<div class="actions" align="right">';
+					echo $certificates;
+					echo '<br />'.Display::url($url, $url, array('_blank'));
+					echo '</div>';
+				}
 			}
 		} //end hack
 		

+ 1 - 1
main/gradebook/lib/be/evaluation.class.php

@@ -177,7 +177,7 @@ class Evaluation implements GradebookItem
 			else $sql .= ' WHERE';
 			$sql .= ' visible = '.intval($locked);
 			$paramcount ++;
-		}		
+		}
 		$result = Database::query($sql);
 		$alleval = Evaluation::create_evaluation_objects_from_sql_result($result);
 		return $alleval;

+ 1 - 1
main/gradebook/lib/fe/catform.class.php

@@ -135,7 +135,7 @@ class CatForm extends FormValidator {
    		$this->addElement('hidden','hid_user_id');
    		$this->addElement('hidden','hid_parent_id');
 		$this->addElement('textarea', 'description', get_lang('Description'),array('rows'=>'3','cols' => '34'));
-		$this->addElement('checkbox', 'visible',get_lang('Visible'));
+	//	$this->addElement('checkbox', 'visible',get_lang('Visible'));
 		$this->addElement('style_submit_button', null, get_lang('EditCategory'), 'class="save"');
 		$this->addRule('weight',get_lang('OnlyNumbers'),'numeric');
 		$this->addRule('weight',get_lang('NoDecimals'),'nopunctuation');

+ 6 - 2
main/gradebook/lib/fe/displaygradebook.php

@@ -332,13 +332,17 @@ class DisplayGradebook
                 }
 
                 if (!$message_resource) {
-                	$myname=$catobj->shows_all_information_an_category($catobj->get_id());
+                	$myname = $catobj->shows_all_information_an_category($catobj->get_id());
                  	
                 	$my_course_id=api_get_course_id();
                 	$my_file= substr($_SESSION['gradebook_dest'],0,5);
                 		
 					$header .= '<td style="vertical-align: top;"><a href="gradebook_flatview.php?'.$my_api_cidreq.'&selectcat=' . $catobj->get_id() . '">'.Display::return_icon('stats.png', get_lang('FlatView'),'','32').'</a>';
-					$header .= '<td style="vertical-align: top;"><a href="../document/document.php?curdirpath=/certificates&'.$my_api_cidreq.'&origin=gradebook&selectcat=' . $catobj->get_id() . '">'.Display::return_icon('certificate.png', get_lang('AttachCertificate'),'','32').'</a>';
+					
+					$header .= '<td style="vertical-align: top;"><a href="../document/document.php?curdirpath=/certificates&'.$my_api_cidreq.'&origin=gradebook&selectcat=' . $catobj->get_id() . '">'.
+								Display::return_icon('certificate.png', get_lang('AttachCertificate'),'','32').
+								'</a>';
+					
 					$header .= '<td style="vertical-align: top;"><a href="gradebook_display_certificate.php?'.$my_api_cidreq.'&amp;cat_id='.(int)$_GET['selectcat'].'">'.Display::return_icon('certificate_list.png', get_lang('GradebookSeeListOfStudentsCertificates'),'','32').'</a>';
 					
 					$visibility_icon    = ($catobj->is_visible() == 0) ? 'invisible' : 'visible';

+ 4 - 5
main/gradebook/lib/gradebook_functions.inc.php

@@ -598,14 +598,13 @@ function delete_certificate($cat_id, $user_id) {
     }
 }
 
-function get_user_certificate_content($user_id, $is_preview = false) {
-    //generate document HTML
-    $course_id          = api_get_course_id();
-    $content_html       = DocumentManager::replace_user_info_into_html($user_id, $course_id, $is_preview);
+function get_user_certificate_content($user_id, $course_code, $is_preview = false) {
+    //generate document HTML    
+    $content_html       = DocumentManager::replace_user_info_into_html($user_id, $course_code, $is_preview);
         
     $new_content        = explode('</head>', $content_html);    
     $new_content_html   = $new_content[1];                    
-    $path_image         = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document/images/gallery';
+    $path_image         = api_get_path(WEB_COURSE_PATH).api_get_course_path($course_code).'/document/images/gallery';
     $new_content_html   = str_replace('../images/gallery',$path_image,$new_content_html);
     
     $path_image_in_default_course = api_get_path(WEB_CODE_PATH).'default_course_document';

+ 3 - 2
main/inc/global.inc.php

@@ -101,12 +101,13 @@ require_once $lib_path.'security.lib.php';
 require_once $lib_path.'events.lib.inc.php';
 require_once $lib_path.'debug.lib.php';
 
+
+require_once $lib_path.'model.lib.php';
 require_once $lib_path.'sortabletable.class.php';
 require_once $lib_path.'usermanager.lib.php';
 require_once $lib_path.'message.lib.php';
 require_once $lib_path.'social.lib.php';
-
-
+require_once $lib_path.'notification.lib.php';
 
 
 /*  DATABASE CONNECTION  */

+ 0 - 1
main/inc/lib/career.lib.php

@@ -8,7 +8,6 @@
 /**
  * Code
  */
-require_once 'model.lib.php';
 require_once 'promotion.lib.php';
 require_once 'fckeditor/fckeditor.php';
 

+ 151 - 0
main/inc/lib/certificate.lib.php

@@ -0,0 +1,151 @@
+<?php
+/**
+* @package chamilo.library
+*/
+class Certificate extends Model {
+    var $table;
+    var $columns = array('id','cat_id','score_certificate','created_at','path_certificate');
+    var $certificate_data;
+    
+    var $certification_user_path;    
+    var $user_id;
+    
+	public function __construct($certificate_id = null) {
+        $this->table 			=  Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE);
+        $this->certificate_data = null;
+        
+        if (isset($certificate_id)) {
+        	$this->certificate_data = $this->get($certificate_id);
+        	$this->user_id = $this->certificate_data['user_id']; 
+        } else {
+        	//Try with the current user
+        	$this->user_id = api_get_user_id();
+        }
+        
+        if ($this->user_id) {
+			//Need to be called before any operation
+	        $this->check_certificate_path();
+	            
+	        if (isset($this->certificate_data) && $this->certificate_data) {        
+	        	if (empty($this->certificate_data['path_certificate'])) {
+	        		$this->generate();	        		
+	        	}        	
+	        }
+        }
+	}
+	
+	/**
+	 * Show an HTML file	 
+	 */
+	public function show() {
+		//Read file or preview file
+		if (!empty($this->certificate_data['path_certificate'])) {
+			$user_certificate = $this->certification_user_path.basename($this->certificate_data['path_certificate']);
+			if (file_exists($user_certificate)) {
+				header('Content-Type: text/html; charset='. api_get_system_encoding());
+				echo @file_get_contents($user_certificate);				
+			}
+		} else {			
+			Display :: display_reduced_header();
+			Display :: display_warning_message(get_lang('NoCertificateAvailable'));			
+		}
+		exit;
+	}
+	
+	/**
+	 * Checks the certificate user path directories
+	 * Enter description here ...
+	 */
+	public function check_certificate_path() {
+		$this->certification_user_path = null;
+		
+		//Setting certification path
+		$path_info = UserManager::get_user_picture_path_by_id($this->user_id, 'system', true);
+		
+		if (isset($path_info['dir']) && !empty($path_info)) {
+			
+			$this->certification_user_path = $path_info['dir'].'certificate/';		
+			
+			if (!is_dir($path_info['dir'])) {
+				mkdir($path_info['dir'],0777);
+			}
+					
+			if (!is_dir($this->certification_user_path)) {
+				mkdir($this->certification_user_path, 0777);
+			}
+		}
+		
+	}
+	
+	/** 
+	 * 	Generates a certificate 
+	 * */
+	
+	public function generate() {
+		
+		if (empty($this->certification_user_path)) {
+			return false;
+		}
+		
+		require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/be.inc.php';
+		require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/gradebook_functions.inc.php';
+		require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/scoredisplay.class.php';
+		
+		$my_category = Category :: load($this->certificate_data['cat_id']);		
+		if ($my_category[0]->is_certificate_available($this->user_id)) {
+						
+			$user         = api_get_user_info($this->user_id);
+			$scoredisplay = ScoreDisplay :: instance();
+			$scorecourse  = $my_category[0]->calc_score($this->user_id);
+	
+			$scorecourse_display = (isset($scorecourse) ? $scoredisplay->display_score($scorecourse,SCORE_AVERAGE) : get_lang('NoResultsAvailable'));
+			$cattotal = Category :: load($this->certificate_data['cat_id']);
+			$scoretotal= $cattotal[0]->calc_score($this->user_id);
+			$scoretotal_display = (isset($scoretotal) ? $scoredisplay->display_score($scoretotal,SCORE_PERCENT) : get_lang('NoResultsAvailable'));
+	
+			//Prepare all necessary variables:
+			$organization_name 	= api_get_setting('Institution');
+			$portal_name 		= api_get_setting('siteName');
+			$stud_fn 			= $user['firstname'];
+			$stud_ln 			= $user['lastname'];
+				
+			//@todo this code is not needed
+			$certif_text 		= sprintf(get_lang('CertificateWCertifiesStudentXFinishedCourseYWithGradeZ'), $organization_name, $stud_fn.' '.$stud_ln, $my_category[0]->get_name(), $scorecourse_display);
+			$certif_text 		= str_replace("\\n","\n", $certif_text);
+	
+			$date = date('d/m/Y', time());
+		
+			if (is_dir($this->certification_user_path)) {			
+				$name = $this->certificate_data['path_certificate'];		
+				if (!empty($this->certificate_data)) {
+					$new_content_html = get_user_certificate_content($this->user_id, $my_category[0]->get_course_code(), false);
+										
+					if ($cat_id = strval(intval($this->certificate_data['cat_id']))) {
+						$my_path_certificate = $this->certification_user_path.$name;
+						if (file_exists($my_path_certificate) && !empty($name)&& !is_dir($my_path_certificate) ) {
+							//header('Content-Type: text/html; charset='. $charset);
+							//echo $new_content_html;
+							//Seems that the file was already generated
+							return true;
+						} else {
+							$my_new_content_html = $new_content_html;
+							$my_new_content_html = mb_convert_encoding($my_new_content_html,'UTF-8', api_get_system_encoding());
+	
+							//Creating new name
+							$name    = md5($this->user_id.$this->certificate_data['cat_id']).'.html';
+							$my_path_certificate = $this->certification_user_path.$name;
+	
+							$result = @file_put_contents($my_path_certificate, $my_new_content_html);						
+							$path_certificate='/'.$name;
+							//@todo move function in this class
+							update_user_info_about_certificate($this->certificate_data['cat_id'], $this->user_id, $path_certificate);
+							$this->certificate_data['path_certificate'] = $path_certificate;
+							return $result;
+						}						
+					}
+				}
+			}
+		}
+		return false;
+	}
+}

+ 5 - 6
main/inc/lib/document.lib.php

@@ -1346,12 +1346,12 @@ return 'application/octet-stream';
         $new_content = '';
         if (Database::num_rows($rs)) {
             $row=Database::fetch_array($rs);
-            $filepath = api_get_path(SYS_COURSE_PATH).$course_info['path'].'/document'.$row['path'];
+           $filepath = api_get_path(SYS_COURSE_PATH).$course_info['path'].'/document'.$row['path'];
 
             if (is_file($filepath)) {
                 $my_content_html=file_get_contents($filepath);
             }
-            $all_user_info = self::get_all_info_to_certificate($user_id, $is_preview);
+            $all_user_info = self::get_all_info_to_certificate($user_id, $course_id, $is_preview);
             $info_to_be_replaced_in_content_html=$all_user_info[0];
             $info_to_replace_in_content_html=$all_user_info[1];
             $new_content=str_replace($info_to_be_replaced_in_content_html,$info_to_replace_in_content_html, $my_content_html);
@@ -1362,11 +1362,10 @@ return 'application/octet-stream';
     /**
      * return all content to replace and all content to be replace
      */
-    function get_all_info_to_certificate($user_id, $is_preview = false) {
+    function get_all_info_to_certificate($user_id, $course_id, $is_preview = false) {
         $info_list	= array();
         $user_id	= intval($user_id);
-        $course_id	= api_get_course_id();
-        
+                
         $course_info = api_get_course_info($course_id);
 
         //info portal
@@ -2884,7 +2883,7 @@ return 'application/octet-stream';
             //if admin or course teacher, allow anyway
             if (api_is_platform_admin() || CourseManager::is_course_teacher($user_id,$course_code)) { return true; }        
             $course_info = api_get_course_info($course_code);
-    		if ($document_data['parent_id'] == false) {
+    		if ($document_data['parent_id'] == false || empty($document_data['parent_id'])) {
     			$visible = self::is_visible_by_id($doc_id, $course_info, $session_id, $user_id);
     			return $visible;
     		} else {

+ 1 - 2
main/inc/lib/message.lib.php

@@ -287,8 +287,7 @@ class MessageManager
 				}
 			}
 			
-			//Load user settings
-			require_once api_get_path(LIBRARY_PATH).'notification.lib.php';
+			//Load user settings			
 			$notification = new Notification();			    
 		    if (empty($group_id)) {                
 		        $sender_info = api_get_user_info($user_sender_id);

+ 0 - 2
main/inc/lib/notification.lib.php

@@ -8,8 +8,6 @@
 /**
  * Code
  */
-require_once 'model.lib.php';
-require_once 'usermanager.lib.php';
 
 //@todo put constants in an array
 

+ 6 - 6
main/inc/lib/promotion.lib.php

@@ -8,7 +8,7 @@
 /**
  * Code
  */
-require_once 'model.lib.php';
+
 require_once 'career.lib.php';
 require_once 'fckeditor/fckeditor.php';
 
@@ -145,11 +145,11 @@ class Promotion extends Model {
     function return_form($url, $action = 'add') {
     	
 		$oFCKeditor = new FCKeditor('description') ;
-				$oFCKeditor->ToolbarSet = 'careers';
-				$oFCKeditor->Width		= '100%';
-				$oFCKeditor->Height		= '200';
-				$oFCKeditor->Value		= '';
-				$oFCKeditor->CreateHtml();		
+		$oFCKeditor->ToolbarSet = 'careers';
+		$oFCKeditor->Width		= '100%';
+		$oFCKeditor->Height		= '200';
+		$oFCKeditor->Value		= '';
+		$oFCKeditor->CreateHtml();		
 		
 		$form = new FormValidator('promotion', 'post', $url);
         // Settting the form elements

+ 0 - 1
main/inc/lib/social.lib.php

@@ -191,7 +191,6 @@ class SocialManager extends UserManager {
 			$sql='INSERT INTO '.$tbl_message.'(user_sender_id,user_receiver_id,msg_status,send_date,title,content) VALUES('.$user_id.','.$friend_id.','.MESSAGE_STATUS_INVITATION_PENDING.',"'.$current_date.'","'.$message_title.'","'.$message_content.'")';
 			Database::query($sql);	
 			
-			require_once api_get_path(LIBRARY_PATH).'notification.lib.php';
 			$sender_info = api_get_user_info($user_id);
 			$notification = new Notification(); 
 		    $notification->save_notification(NOTIFICATION_TYPE_INVITATION, array($friend_id), $message_title, $message_content, $sender_info);    		

+ 9 - 9
main/inc/lib/usermanager.lib.php

@@ -292,8 +292,7 @@ class UserManager {
                     GroupPortalManager::delete_user_rel_group($user_id, $group_id);
 			    }
 			}
-			
-			require_once api_get_path(LIBRARY_PATH).'social.lib.php';
+						
 			//Delete user from friend lists
 			SocialManager::remove_user_rel_user($user_id, true);
 		}
@@ -3251,15 +3250,16 @@ class UserManager {
 	  	$rs  = Database::query($sql);	  		  		  	
 	  	if (Database::num_rows($rs) > 0) {
 	  	    $row = Database::fetch_array($rs,'ASSOC');	  	
-	  	    $score = $row['score_certificate'];
+	  	    $score 		  = $row['score_certificate'];
 	  	    $category_id  = $row['cat_id'];
-	  	    $eval         = Evaluation::load(null, null, $course_code, $category_id);	  		  	
+	  	    $cat         = Category::load($category_id);	  		  	
 	  	    $displayscore = ScoreDisplay::instance();
-	  	
-	  	    $grade = '';
-	  	    if (isset($eval) && $displayscore->is_custom()) {
-                $grade = $displayscore->display_score(array($score, $eval[0]->get_max()), SCORE_DIV_PERCENT_WITH_CUSTOM);			
-    	  	}
+			$grade = '';
+	  	    if (isset($cat) && $displayscore->is_custom()) {
+                $grade = $displayscore->display_score(array($score, $cat[0]->get_weight()), SCORE_DIV_PERCENT_WITH_CUSTOM);			
+    	  	} else {
+    	  		$grade = $displayscore->display_score(array($score, $cat[0]->get_weight()));    	  		
+    	  	}    	  	    	  	    	  	
 	  	    $row['grade'] = $grade;
 	  		return $row;
         }

+ 1 - 3
main/messages/inbox.php

@@ -10,7 +10,6 @@
 $language_file = array('registration','messages','userInfo');
 $cidReset = true;
 require_once '../inc/global.inc.php';
-require_once api_get_path(LIBRARY_PATH).'message.lib.php';
 
 api_block_anonymous_users();
 if (isset($_GET['messages_page_nr'])) {
@@ -150,8 +149,7 @@ echo '<div id="social-content">';
 	//LEFT CONTENT			
 	if (api_get_setting('allow_social_tool') != 'true') { 
 		$id_content_right = 'inbox';		
-	} else {
-		require_once api_get_path(LIBRARY_PATH).'social.lib.php';
+	} else {		
 		$id_content_right = 'social-content-right';
 		echo '<div id="social-content-left">';	
 			//this include the social menu div

+ 0 - 1
main/messages/new_message.php

@@ -26,7 +26,6 @@ if (api_get_setting('allow_message_tool') !='true' ){
 
 require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php';
 require_once api_get_path(LIBRARY_PATH).'group_portal_manager.lib.php';
-require_once api_get_path(LIBRARY_PATH).'message.lib.php';
 
 $nameTools = api_xml_http_response_encode(get_lang('Messages'));
 /*	Constants and variables */

+ 0 - 1
main/messages/outbox.php

@@ -10,7 +10,6 @@
 $language_file = array('registration','messages','userInfo');
 $cidReset=true;
 require_once '../inc/global.inc.php';
-require_once api_get_path(LIBRARY_PATH).'message.lib.php';
 
 api_block_anonymous_users();
 

+ 0 - 3
main/messages/send_message.php

@@ -9,9 +9,6 @@
 $language_file = array('registration','messages','userInfo','admin');
 $cidReset=true;
 require_once '../inc/global.inc.php';
-require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';
-require_once api_get_path(LIBRARY_PATH).'message.lib.php';
-require_once api_get_path(LIBRARY_PATH).'social.lib.php';
 
 if (api_is_anonymous()) {
 	api_not_allowed();

+ 0 - 3
main/messages/send_message_to_userfriend.inc.php

@@ -9,9 +9,6 @@
 $language_file = array('registration','messages','userInfo','admin');
 $cidReset = true;
 require_once '../inc/global.inc.php';
-require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';
-require_once api_get_path(LIBRARY_PATH).'message.lib.php';
-require_once api_get_path(LIBRARY_PATH).'social.lib.php';
 
 if (api_is_anonymous()) {
 	api_not_allowed();

+ 0 - 1
main/messages/view_message.php

@@ -13,7 +13,6 @@ api_block_anonymous_users();
 if (api_get_setting('allow_message_tool')!='true') {
 	api_not_allowed();
 }
-require_once api_get_path(LIBRARY_PATH).'message.lib.php';
 
 /*		HEADER  */