Julio Montoya 14 years ago
parent
commit
7939c60520

+ 3 - 3
main/attendance/attendance_calendar.php

@@ -48,7 +48,7 @@ if (isset($action) && $action == 'calendar_add') {
 	echo '<div class="attendance-calendar-add">';
 	echo '<h4>'.get_lang('AddADateTime').'</h4>';
 		$form = new FormValidator('attendance_calendar_add','POST','index.php?action=calendar_add&attendance_id='.$attendance_id.$param_gradebook.'&'.api_get_cidreq(),'');
-		$form->addElement('datepicker', 'date_time', '', array('form_name'=>'attendance_calendar_add'));
+		$form->addElement('datepicker', 'date_time', '', array('form_name'=>'attendance_calendar_add'), 5);
 		$defaults['date_time'] = date('Y-m-d H:i',api_strtotime(api_get_local_time()));
 
                 $form->addElement('html','<br /><br />');
@@ -92,7 +92,7 @@ if (isset($action) && $action == 'calendar_add') {
 					// calendar edit form
 					echo '<div class="attendance-calendar-edit">';
 						$form = new FormValidator('attendance_calendar_edit','POST','index.php?action=calendar_edit&attendance_id='.$attendance_id.'&calendar_id='.$calendar_id.'&'.api_get_cidreq().$param_gradebook,'');
-						$form->addElement('datepicker', 'date_time', '', array('form_name'=>'attendance_calendar_edit'));
+						$form->addElement('datepicker', 'date_time', '', array('form_name'=>'attendance_calendar_edit'), 5);
 						$defaults['date_time'] = $calendar['date_time'];
 						$form->addElement('style_submit_button', null, get_lang('Save'), 'class="save"');
 						$form->addElement('style_submit_button', 'cancel', get_lang('Cancel'), 'class="cancel"');
@@ -113,4 +113,4 @@ if (isset($action) && $action == 'calendar_add') {
 	}
 	echo '</div>';
 }
-?>
+?>

+ 635 - 634
main/inc/lib/fckeditor/fckeditor.php

@@ -37,642 +37,643 @@
 
 function FCKeditor_IsCompatibleBrowser()
 {
-	if ( isset( $_SERVER ) ) {
-		$sAgent = $_SERVER['HTTP_USER_AGENT'] ;
-	}
-	else {
-		global $HTTP_SERVER_VARS ;
-		if ( isset( $HTTP_SERVER_VARS ) ) {
-			$sAgent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'] ;
-		}
-		else {
-			global $HTTP_USER_AGENT ;
-			$sAgent = $HTTP_USER_AGENT ;
-		}
-	}
-
-	if ( strpos($sAgent, 'MSIE') !== false && strpos($sAgent, 'mac') === false && strpos($sAgent, 'Opera') === false )
-	{
-		$iVersion = (float)substr($sAgent, strpos($sAgent, 'MSIE') + 5, 3) ;
-		return ($iVersion >= 5.5) ;
-	}
-	else if ( strpos($sAgent, 'Gecko/') !== false )
-	{
-		$iVersion = (int)substr($sAgent, strpos($sAgent, 'Gecko/') + 6, 8) ;
-		return ($iVersion >= 20030210) ;
-	}
-	else if ( strpos($sAgent, 'Opera/') !== false )
-	{
-		$fVersion = (float)substr($sAgent, strpos($sAgent, 'Opera/') + 6, 4) ;
-		return ($fVersion >= 9.5) ;
-	}
-	else if ( preg_match( "|AppleWebKit/(\d+)|i", $sAgent, $matches ) )
-	{
-		$iVersion = $matches[1] ;
-		return ( $matches[1] >= 522 ) ;
-	}
-	else
-		return false ;
+    if ( isset( $_SERVER ) ) {
+        $sAgent = $_SERVER['HTTP_USER_AGENT'] ;
+    }
+    else {
+        global $HTTP_SERVER_VARS ;
+        if ( isset( $HTTP_SERVER_VARS ) ) {
+            $sAgent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'] ;
+        }
+        else {
+            global $HTTP_USER_AGENT ;
+            $sAgent = $HTTP_USER_AGENT ;
+        }
+    }
+
+    if ( strpos($sAgent, 'MSIE') !== false && strpos($sAgent, 'mac') === false && strpos($sAgent, 'Opera') === false )
+    {
+        $iVersion = (float)substr($sAgent, strpos($sAgent, 'MSIE') + 5, 3) ;
+        return ($iVersion >= 5.5) ;
+    }
+    else if ( strpos($sAgent, 'Gecko/') !== false )
+    {
+        $iVersion = (int)substr($sAgent, strpos($sAgent, 'Gecko/') + 6, 8) ;
+        return ($iVersion >= 20030210) ;
+    }
+    else if ( strpos($sAgent, 'Opera/') !== false )
+    {
+        $fVersion = (float)substr($sAgent, strpos($sAgent, 'Opera/') + 6, 4) ;
+        return ($fVersion >= 9.5) ;
+    }
+    else if ( preg_match( "|AppleWebKit/(\d+)|i", $sAgent, $matches ) )
+    {
+        $iVersion = $matches[1] ;
+        return ( $matches[1] >= 522 ) ;
+    }
+    else
+        return false ;
 }
 
 class FCKeditor
 {
-	/**
-	 * Name of the FCKeditor instance.
-	 *
-	 * @access protected
-	 * @var string
-	 */
-	public $InstanceName ;
-	/**
-	 * Path to FCKeditor relative to the document root.
-	 *
-	 * @var string
-	 */
-	public $BasePath ;
-	/**
-	 * Width of the FCKeditor.
-	 * Examples: 100%, 600
-	 *
-	 * @var mixed
-	 */
-	public $Width ;
-	/**
-	 * Height of the FCKeditor.
-	 * Examples: 400, 50%
-	 *
-	 * @var mixed
-	 */
-	public $Height ;
-	/**
-	 * Name of the toolbar to load.
-	 *
-	 * @var string
-	 */
-	public $ToolbarSet ;
-	/**
-	 * Initial value.
-	 *
-	 * @var string
-	 */
-	public $Value ;
-	/**
-	 * This is where additional configuration can be passed.
-	 * Example:
-	 * $oFCKeditor->Config['EnterMode'] = 'br';
-	 *
-	 * @var array
-	 */
-	public $Config ;
-
-	/**
-	 * Main Constructor.
-	 * Refer to the _samples/php directory for examples.
-	 *
-	 * @param string $instanceName
-	 */
-	public function __construct( $instanceName )
- 	{
-		$this->InstanceName	= $instanceName ;
-		$this->BasePath		= '/fckeditor/' ;
-		$this->Width		= '100%' ;
-		$this->Height		= '200' ;
-		$this->ToolbarSet	= 'Default' ;
-		$this->Value		= '' ;
-
-		$this->Config		= array() ;
-	}
-
-	/**
-	 * Display FCKeditor.
-	 *
-	 */
-	public function Create()
-	{
-		echo $this->CreateHtml() ;
-	}
-
-	/**
-	 * Return the HTML code required to run FCKeditor.
-	 *
-	 * @return string
-	 */
-	public function CreateHtml()
-	{
-		// Adaptation for the Chamilo LMS ---------------------------------------------------------
-
-		$this->BasePath = api_get_path(REL_PATH).'main/inc/lib/fckeditor/';
-
-		$config = $this->get_custom_configuration();
-		$this->read_configuration($config);
-
-		$config = $this->get_default_configuration();
-		$this->read_configuration($config);
-
-		if ((api_is_allowed_to_edit() || api_is_platform_admin()) && isset($this->Config['BlockCopyPaste'])) {
-			$this->Config['BlockCopyPaste'] = false;
-		}
-
-		//----------------------------------------------------------------------------------------
-
-		$HtmlValue = htmlspecialchars( $this->Value ) ;
-
-		$Html = '' ;
-
-		if ( $this->IsCompatible() )
-		{
-			if ( api_get_setting('server_type') == 'test' )
-				$File = 'fckeditor.original.html' ;
-			else
-				$File = 'fckeditor.html' ;
-
-			$Link = "{$this->BasePath}editor/{$File}?InstanceName={$this->InstanceName}" ;
-
-			if ( $this->ToolbarSet != '' )
-				$Link .= "&amp;Toolbar={$this->ToolbarSet}" ;
-
-			// Render the linked hidden field.
-			$Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}\" name=\"{$this->InstanceName}\" value=\"{$HtmlValue}\" style=\"display:none\" />" ;
-
-			// Render the configurations hidden field.
-			$Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}___Config\" value=\"" . $this->GetConfigFieldString() . "\" style=\"display:none\" />" ;
-
-			// Render the editor IFRAME.
-			$Html .= "<iframe id=\"{$this->InstanceName}___Frame\" src=\"{$Link}\" width=\"{$this->Width}\" height=\"{$this->Height}\" frameborder=\"0\" scrolling=\"no\"></iframe>" ;
-		}
-		else
-		{
-			if ( strpos( $this->Width, '%' ) === false )
-				$WidthCSS = $this->Width . 'px' ;
-			else
-				$WidthCSS = $this->Width ;
-
-			if ( strpos( $this->Height, '%' ) === false )
-				$HeightCSS = $this->Height . 'px' ;
-			else
-				$HeightCSS = $this->Height ;
-
-			$Html .= "<textarea name=\"{$this->InstanceName}\" rows=\"4\" cols=\"40\" style=\"width: {$WidthCSS}; height: {$HeightCSS}\">{$HtmlValue}</textarea>" ;
-		}
-
-		return $Html ;
-	}
-
-	/**
-	 * Returns true if browser is compatible with FCKeditor.
-	 *
-	 * @return boolean
-	 */
-	public function IsCompatible()
-	{
-		return FCKeditor_IsCompatibleBrowser() ;
-	}
-
-	/**
-	 * Get settings from Config array as a single string.
-	 *
-	 * @access protected
-	 * @return string
-	 */
-	public function GetConfigFieldString()
-	{
-		$sParams = '' ;
-		$bFirst = true ;
-
-		foreach ( $this->Config as $sKey => $sValue )
-		{
-			if ( !$bFirst ) {
-				$sParams .= '&amp;' ;
-			} else {
-				$bFirst = false ;
-			}
-			if ( is_string( $sValue ) ) {
-				$sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $sValue ) ;
-			} else {
-				$sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $this->to_js( $sValue ) ) ;
-			}
-		}
-
-		return $sParams ;
-	}
-
-	/**
-	 * Encode characters that may break the configuration string
-	 * generated by GetConfigFieldString().
-	 *
-	 * @access protected
-	 * @param string $valueToEncode
-	 * @return string
-	 */
-	public function EncodeConfig( $valueToEncode )
-	{
-		$chars = array(
-			'&' => '%26',
-			'=' => '%3D',
-			'"' => '%22',
-			'%' => '%25'
-		 ) ;
-
-		return strtr( $valueToEncode,  $chars ) ;
-	}
-
-	/**
-	 * Converts a PHP variable into its Javascript equivalent.
-	 * The code of this method has been "borrowed" from the funcion drupal_to_js() within the Drupal CMS.
-	 * @param mixed $var	The variable to be converted into Javascript syntax
-	 * @return string		Returns a string
-	 * Note: This function is similar to json_encode(), in addition it produces HTML-safe strings, i.e. with <, > and & escaped.
-	 * @link http://drupal.org/
-	 */
-	private function to_js( $var ) {
-		switch ( gettype( $var ) ) {
-			case 'boolean' :
-				return $var ? 'true' : 'false' ; // Lowercase necessary!
-			case 'integer' :
-			case 'double' :
-				return (string) $var ;
-			case 'resource' :
-			case 'string' :
-				return '"' . str_replace( array( "\r", "\n", "<", ">", "&" ), array( '\r', '\n', '\x3c', '\x3e', '\x26' ), addslashes( $var ) ) . '"' ;
-			case 'array' :
-			// Arrays in JSON can't be associative. If the array is empty or if it
-			// has sequential whole number keys starting with 0, it's not associative
-			// so we can go ahead and convert it as an array.
-				if ( empty( $var ) || array_keys( $var ) === range( 0, sizeof( $var ) - 1 ) ) {
-					$output = array() ;
-					foreach ( $var as $v ) {
-						$output[] = $this->to_js( $v ) ;
-					}
-					return '[ ' . implode( ', ', $output ) . ' ]' ;
-				}
-			// Otherwise, fall through to convert the array as an object.
-			case 'object' :
-				$output = array() ;
-				foreach ( $var as $k => $v ) {
-					$output[] = $this->to_js( strval( $k ) ) . ': ' . $this->to_js( $v ) ;
-				}
-				return '{ ' . implode(', ', $output) . ' }' ;
-			default:
-				return 'null' ;
-		}
-	}
-
-	/**
-	 * This method reads configuration data for the current editor's instance without overriding settings that already exist.
-	 * @return array
-	 */
-	function read_configuration(& $config) {
-		$toolbar_set = $this->ToolbarSet;
-		$toolbar_set_maximized = $this->ToolbarSet.'Maximized';
-		foreach ($config as $key => $value) {
-			switch ($key) {
-				case 'ToolbarSets':
-					if (!empty($toolbar_set) && $toolbar_set != 'Default') {
-						if (is_array($value)) {
-							if (isset($value['Normal'])) {
-								if (!isset($this->Config[$key][$toolbar_set])) {
-									$this->Config[$key][$toolbar_set] = $value['Normal'];
-								}
-							}
-							if (isset($value['Maximized'])) {
-								if (!isset($this->Config[$key][$toolbar_set_maximized])) {
-									$this->Config[$key][$toolbar_set_maximized] = $value['Maximized'];
-								}
-							}
-						}
-					}
-					break;
-				case 'Width':
-					$this->Config[$key] = (string) $value;
-					$this->Width = $this->Config[$key];
-					break;
-				case 'Height':
-					$this->Config[$key] = (string) $value;
-					$this->Height = $this->Config[$key];
-					break;
-				default:
-					if (!isset($this->Config[$key])) {
-						$this->Config[$key] = $value;
-					}
-			}
-		}
-	}
-
-	/**
-	 * This method returns editor's custom configuration settings read from php-files.
-	 * @return array	Custom configuration data.
-	 */
-	private function & get_custom_configuration() {
-		static $config;
-		if (!isset($config)) {
-			require api_get_path(LIBRARY_PATH).'fckeditor/myconfig.php';
-		}
-		$toolbar_dir = isset($config['ToolbarSets']['Directory']) ? $config['ToolbarSets']['Directory'] : 'default';
-		return array_merge($config, $this->get_custom_toolbar_configuration($toolbar_dir));
-	}
-
-	/**
-	 * This method returns editor's toolbar configuration settings read from a php-file.
-	 * @return array	Toolbar configuration data.
-	 */
-	private function & get_custom_toolbar_configuration($toolbar_dir) {
-		static $toolbar_config = array('Default' => array());
-		if (!isset($toolbar_config[$this->ToolbarSet])) {
-			$toolbar_config[$this->ToolbarSet] = array();
-			if (preg_match('/[a-zA-Z_]+/', $toolbar_dir) && preg_match('/[a-zA-Z_]+/', $this->ToolbarSet)) { // A security check.
-				// Seeking the toolbar.
-				@include api_get_path(LIBRARY_PATH).'fckeditor/toolbars/'.$toolbar_dir.'/'.api_camel_case_to_underscore($this->ToolbarSet).'.php';
-				if (!isset($config['ToolbarSets']['Normal'])) {
-					// No toolbar has been found yet.
-					if ($toolbar_dir == 'default') {
-						// It does not exist in default toolbar definitions, giving up.
-						$this->ToolbarSet = 'Default';
-					} else {
-						// The custom toolbar does not exist, then trying to load the default one.
-						@include api_get_path(LIBRARY_PATH).'fckeditor/toolbars/default/'.api_camel_case_to_underscore($this->ToolbarSet).'.php';
-						if (!isset($config['ToolbarSets']['Normal'])) {
-							// It does not exist in default toolbar definitions, giving up.
-							$this->ToolbarSet = 'Default';
-						} else {
-							$toolbar_config[$this->ToolbarSet] = $config;
-						}
-					}
-				} else {
-					$toolbar_config[$this->ToolbarSet] = $config;
-				}
-			} else {
-				$this->ToolbarSet = 'Default';
-			}
-		}
-		return $toolbar_config[$this->ToolbarSet];
-	}
-
-	/**
-	 * This method returns automatically determined editor's configuration settings (default settings).
-	 * @return array
-	 */
-	private function & get_default_configuration() {
-		return array_merge(
-			self::get_javascript_custom_configuration_file(),
-			self::get_css_configuration(),
-			self::get_editor_language(),
-			$this->get_repository_configuration(),
-			self::get_media_configuration(),
-			self::get_user_configuration_data(),
-			$this->get_mimetex_plugin_configuration()
-		);
-	}
-
-	/**
-	 * This method returns the path to the javascript custom configuration file.
-	 * @return array
-	 */
-	private function & get_javascript_custom_configuration_file() {
-		return array('CustomConfigurationsPath' => api_get_path(REL_PATH).'main/inc/lib/fckeditor/myconfig.js');
-	}
-
-	/**
-	 * This method returns CSS-related configuration data that has been determined by the system.
-	 * @return array
-	 */
-	private function & get_css_configuration() {
-		$config['EditorAreaCSS'] = api_get_path(REL_PATH).'main/css/'.api_get_setting('stylesheets').'/default.css';
-		$config['ToolbarComboPreviewCSS'] = $config['EditorAreaCSS'];
-		return $config;
-	}
-
-	/**
-	 * This method determines editor's interface language and returns it as compatible with the editor langiage code.
-	 * @return array
-	 */
-	private function & get_editor_language() {
-		static $config;
-		if (!is_array($config)) {
-			$code_translation_table = array('' => 'en', 'sr' => 'sr-latn', 'zh' => 'zh-cn', 'zh-tw' => 'zh');
-			$editor_lang = strtolower(str_replace('_', '-', api_get_language_isocode()));
-			$editor_lang = isset($code_translation_table[$editor_lang]) ? $code_translation_table[$editor_lang] : $editor_lang;
-			$editor_lang = file_exists(api_get_path(SYS_PATH).'main/inc/lib/fckeditor/editor/lang/'.$editor_lang.'.js') ? $editor_lang : 'en';
-			$config['DefaultLanguage'] = $editor_lang;
-			$config['ContentLangDirection'] = api_get_text_direction($editor_lang);
-		}
-		return $config;
-	}
-
-	/**
-	 * This method returns default configuration for document repository that is to be used by the editor.
-	 * @return array
-	 */
-	private function & get_repository_configuration() {
-
-		// Preliminary calculations for assembling required paths.
-		$base_path = $this->BasePath;
-		$script_name = substr($_SERVER['PHP_SELF'], strlen(api_get_path(REL_PATH)));
-		$script_path = explode('/', $script_name);
-		$script_path[count($script_path) - 1] = '';
-		if (api_is_in_course()) {
-			$relative_path_prefix = str_repeat('../', count($script_path) - 1);
-		} else {
-			$relative_path_prefix = str_repeat('../', count($script_path) - 2);
-		}
-		$script_path = implode('/', $script_path);
-		$script_path = api_get_path(WEB_PATH).$script_path;
-
-		$use_advanced_filemanager = api_get_setting('advanced_filemanager') == 'true';
-		// Let javascripts "know" which file manager has been chosen.
-		$config['AdvancedFileManager'] = $use_advanced_filemanager;
-
-		if (api_is_in_course()) {
-			if (!api_is_in_group()) {
-				// 1. We are inside a course and not in a group.
-				if (api_is_allowed_to_edit()) {
-					// 1.1. Teacher (tutor and coach are not authorized to change anything in the "content creation" tools)
-					$config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document/';
-					$config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/';
-					$config['BaseHref'] = $script_path;
-				} else {
-					// 1.2. Student
-					$current_session_id = api_get_session_id();
-					if($current_session_id==0)
-					{
-
-						$config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document/shared_folder/sf_user_'.api_get_user_id().'/';
-						$config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/shared_folder/sf_user_'.api_get_user_id().'/';
-						$config['BaseHref'] = $script_path;
-					}
-					else
-					{
-						$config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document//shared_folder_session_'.$current_session_id.'/sf_user_'.api_get_user_id().'/';
-						$config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/shared_folder_session_'.$current_session_id.'/sf_user_'.api_get_user_id().'/';
-						$config['BaseHref'] = $script_path;
-					}
-				}
-			} else {
-				// 2. Inside a course and inside a group.
-				global $group_properties;
-				$config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document'.$group_properties['directory'].'/';
-				$config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document'.$group_properties['directory'].'/';
-				$config['BaseHref'] = $script_path;
-			}
-		} else {
-			if (api_is_platform_admin() && $_SESSION['this_section'] == 'platform_admin') {
-				// 3. Platform administration activities.
-				$config['CreateDocumentWebDir'] = api_get_path(WEB_PATH).'home/default_platform_document/';
-				$config['CreateDocumentDir'] = api_get_path(WEB_PATH).'home/default_platform_document/'; // A side-effect is in use here.
-				$config['BaseHref'] = api_get_path(WEB_PATH).'home/default_platform_document/';
-			} else {
-				// 4. The user is outside courses.
-				$config['CreateDocumentWebDir'] = api_get_path(WEB_PATH).'main/upload/users/'.api_get_user_id().'/my_files/';
-				$config['CreateDocumentDir'] = $relative_path_prefix.'upload/users/'.api_get_user_id().'/my_files/';
-				$config['BaseHref'] = $script_path;
-			}
-		}
-
-		// URLs for opening the file browser for different resource types (file types):
-		if ($use_advanced_filemanager) {
-			// Double slashes within the following URLs for the advanced file manager are put intentionally. Please, keep them.
-			// for images
-			$config['ImageBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
-			// for flash
-			$config['FlashBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
-			// for audio files (mp3)
-			$config['MP3BrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
-			// for video
-			$config['VideoBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
-			// for video (flv)
-			$config['MediaBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
-			// for links (any resource type)
-			$config['LinkBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
-		} else {
-			// for images
-			$config['ImageBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Images&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
-			// for flash
-			$config['FlashBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Flash&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
-			// for audio files (mp3)
-			$config['MP3BrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=MP3&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
-			// for video
-			$config['VideoBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Video&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
-			// for video (flv)
-			$config['MediaBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Video/flv&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
-			// for links (any resource type)
-			$config['LinkBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=File&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
-		}
-
-		// URLs for making quick uplods for different resource types (file types).
-		// These URLs are used by the dialogs' quick upload tabs:
-		// for images
-		$config['ImageUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Images';
-		// for flash
-		$config['FlashUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Flash';
-		// for audio files (mp3)
-		$config['MP3UploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=MP3';
-		// for video
-		$config['VideoUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Video';
-		// for video (flv)
-		$config['MediaUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Video/flv';
-		// for links (any resource type)
-		$config['LinkUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=File';
-
-		return $config;
-	}
-
-	/**
-	 * This method returns multi-media related configuration data.
-	 * @return array
-	 */
-	private function & get_media_configuration() {
-		$config['FlashPlayerAudio'] = api_get_path(TO_REL, FLASH_PLAYER_AUDIO);
-		$config['FlashPlayerVideo'] = api_get_path(TO_REL, FLASH_PLAYER_VIDEO);
-		$config['ScriptSWFObject'] = api_get_path(TO_REL, SCRIPT_SWFOBJECT);
-		$config['ScriptASCIIMathML'] = api_get_path(TO_REL, SCRIPT_ASCIIMATHML);
-		return $config;
-	}
-
-	/**
-	 * This method returns current user specific configuration data.
-	 * @return array
-	 */
-	private function & get_user_configuration_data() {
-		$config['UserIsCourseAdmin'] = api_is_allowed_to_edit() ? true : false;
-		$config['UserIsPlatformAdmin'] = api_is_platform_admin() ? true : false;
-		return $config;
-	}
-
-	/**
-	 * This method returns detected configuration data about editor's MimeTeX plugin.
-	 * @return array
-	 */
-	private function & get_mimetex_plugin_configuration() {
-		static $config;
-		if (!isset($config)) {
-			$config = array();
-			if (is_array($this->Config['LoadPlugin']) && in_array('mimetex', $this->Config['LoadPlugin'])) {
-				$server_base = api_get_path(WEB_SERVER_ROOT_PATH);
-				$server_base_parts = explode('/', $server_base);
-				$url_relative = 'cgi-bin/mimetex' . ( IS_WINDOWS_OS ? '.exe' : '.cgi' );
-				if (!isset($this->Config['MimetexExecutableInstalled'])) {
-					$this->Config['MimetexExecutableDetectionMethod'] = 'detect';
-				}
-				if ($this->Config['MimetexExecutableInstalled'] == 'detect') {
-					$detection_method = isset($this->Config['MimetexExecutableDetectionMethod']) ? $this->Config['MimetexExecutableDetectionMethod'] : 'bootstrap_ip';
-					$detection_timeout = isset($this->Config['MimetexExecutableDetectionTimeout']) ? $this->Config['MimetexExecutableDetectionTimeout'] : 0.05;
-					switch ($detection_method) {
-						case 'bootstrap_ip':
-							$detection_url = $server_base_parts[0] . '//127.0.0.1/';
-							break;
-						case 'localhost':
-							$detection_url = $server_base_parts[0] . '//localhost/';
-							break;
-						case 'ip':
-							$detection_url = $server_base_parts[0] . '//' . $_SERVER['SERVER_ADDR'] . '/';
-							break;
-						default:
-							$detection_url = $server_base_parts[0] . '//' . $_SERVER['SERVER_NAME'] . '/';
-					}
-					$detection_url .= $url_relative . '?' . rand();
-					$config['IsMimetexInstalled'] = self::url_exists($detection_url, $detection_timeout);
-				} else {
-					$config['IsMimetexInstalled'] = $this->Config['MimetexExecutableInstalled'];
-				}
-				$config['MimetexUrl'] = api_add_trailing_slash($server_base) . $url_relative;
-			}
-			// Cleaning detection related settings, we don't need them anymore.
-			unset($this->Config['MimetexExecutableInstalled']);
-			unset($this->Config['MimetexExecutableDetectionMethod']);
-			unset($this->Config['MimetexExecutableDetectionTimeout']);
-		}
-		return $config;
-	}
-
-	/*
-	 * Checks whether a given url exists.
-	 * @param string $url
-	 * @param int $timeout
-	 * @return boolean
-	 * @author Ivan Tcholakov, FEB-2009
-	 */
-	private function url_exists($url, $timeout = 30) {
-		$parsed = parse_url($url);
-		$scheme = isset($parsed['scheme']) ? $parsed['scheme'] : 'http';
-		$host = $parsed['host'];
-		$port = isset($parsed['port']) ? $parsed['port'] : ($scheme == 'http' ? 80 : ($scheme == 'https' ? 443 : -1 ));
-
-		$file_exists = false;
-		$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
-		if ($fp) {
-			$request = "HEAD ".$url." / HTTP/1.1\r\n";
-			$request .= "Host: ".$host."\r\n";
-			$request .= "Connection: Close\r\n\r\n";
-
-			@fwrite($fp, $request);
-			while (!@feof($fp)) {
-				$header = @fgets($fp, 128);
-				if(@preg_match('#HTTP/1.1 200 OK#', $header)) {
-					$file_exists = true;
-					break;
-				}
-			}
-		}
-		@fclose($fp);
-		return $file_exists;
-	}
+    /**
+     * Name of the FCKeditor instance.
+     *
+     * @access protected
+     * @var string
+     */
+    public $InstanceName ;
+    /**
+     * Path to FCKeditor relative to the document root.
+     *
+     * @var string
+     */
+    public $BasePath ;
+    /**
+     * Width of the FCKeditor.
+     * Examples: 100%, 600
+     *
+     * @var mixed
+     */
+    public $Width ;
+    /**
+     * Height of the FCKeditor.
+     * Examples: 400, 50%
+     *
+     * @var mixed
+     */
+    public $Height ;
+    /**
+     * Name of the toolbar to load.
+     *
+     * @var string
+     */
+    public $ToolbarSet ;
+    /**
+     * Initial value.
+     *
+     * @var string
+     */
+    public $Value ;
+    /**
+     * This is where additional configuration can be passed.
+     * Example:
+     * $oFCKeditor->Config['EnterMode'] = 'br';
+     *
+     * @var array
+     */
+    public $Config ;
+
+    /**
+     * Main Constructor.
+     * Refer to the _samples/php directory for examples.
+     *
+     * @param string $instanceName
+     */
+    public function __construct( $instanceName )
+     {
+        $this->InstanceName	= $instanceName ;
+        $this->BasePath		= '/fckeditor/' ;
+        $this->Width		= '100%' ;
+        $this->Height		= '200' ;
+        $this->ToolbarSet	= 'Default' ;
+        $this->Value		= '' ;
+
+        $this->Config		= array() ;
+    }
+
+    /**
+     * Display FCKeditor.
+     *
+     */
+    public function Create()
+    {
+        echo $this->CreateHtml() ;
+    }
+
+    /**
+     * Return the HTML code required to run FCKeditor.
+     *
+     * @return string
+     */
+    public function CreateHtml()
+    {
+        // Adaptation for the Chamilo LMS ---------------------------------------------------------
+
+        $this->BasePath = api_get_path(REL_PATH).'main/inc/lib/fckeditor/';
+
+        $config = $this->get_custom_configuration();
+        $this->read_configuration($config);
+
+        $config = $this->get_default_configuration();
+        $this->read_configuration($config);
+
+        if ((api_is_allowed_to_edit() || api_is_platform_admin()) && isset($this->Config['BlockCopyPaste'])) {
+            $this->Config['BlockCopyPaste'] = false;
+        }
+
+        //----------------------------------------------------------------------------------------
+
+        $HtmlValue = htmlspecialchars( $this->Value ) ;
+
+        $Html = '' ;
+
+        if ( $this->IsCompatible() )
+        {
+            if ( api_get_setting('server_type') == 'test' )
+                $File = 'fckeditor.original.html' ;
+            else
+                $File = 'fckeditor.html' ;
+
+            $Link = "{$this->BasePath}editor/{$File}?InstanceName={$this->InstanceName}" ;
+
+            if ( $this->ToolbarSet != '' )
+                $Link .= "&amp;Toolbar={$this->ToolbarSet}" ;
+
+            // Render the linked hidden field.
+            $Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}\" name=\"{$this->InstanceName}\" value=\"{$HtmlValue}\" style=\"display:none\" />" ;
+
+            // Render the configurations hidden field.
+            $Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}___Config\" value=\"" . $this->GetConfigFieldString() . "\" style=\"display:none\" />" ;
+
+            // Render the editor IFRAME.
+            $Html .= "<iframe id=\"{$this->InstanceName}___Frame\" src=\"{$Link}\" width=\"{$this->Width}\" height=\"{$this->Height}\" frameborder=\"0\" scrolling=\"no\"></iframe>" ;
+        }
+        else
+        {
+            if ( strpos( $this->Width, '%' ) === false )
+                $WidthCSS = $this->Width . 'px' ;
+            else
+                $WidthCSS = $this->Width ;
+
+            if ( strpos( $this->Height, '%' ) === false )
+                $HeightCSS = $this->Height . 'px' ;
+            else
+                $HeightCSS = $this->Height ;
+
+            $Html .= "<textarea name=\"{$this->InstanceName}\" rows=\"4\" cols=\"40\" style=\"width: {$WidthCSS}; height: {$HeightCSS}\">{$HtmlValue}</textarea>" ;
+        }
+
+        return $Html ;
+    }
+
+    /**
+     * Returns true if browser is compatible with FCKeditor.
+     *
+     * @return boolean
+     */
+    public function IsCompatible()
+    {
+        return FCKeditor_IsCompatibleBrowser() ;
+    }
+
+    /**
+     * Get settings from Config array as a single string.
+     *
+     * @access protected
+     * @return string
+     */
+    public function GetConfigFieldString()
+    {
+        $sParams = '' ;
+        $bFirst = true ;
+
+        foreach ( $this->Config as $sKey => $sValue )
+        {
+            if ( !$bFirst ) {
+                $sParams .= '&amp;' ;
+            } else {
+                $bFirst = false ;
+            }
+            if ( is_string( $sValue ) ) {
+                $sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $sValue ) ;
+            } else {
+                $sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $this->to_js( $sValue ) ) ;
+            }
+        }
+
+        return $sParams ;
+    }
+
+    /**
+     * Encode characters that may break the configuration string
+     * generated by GetConfigFieldString().
+     *
+     * @access protected
+     * @param string $valueToEncode
+     * @return string
+     */
+    public function EncodeConfig( $valueToEncode )
+    {
+        $chars = array(
+            '&' => '%26',
+            '=' => '%3D',
+            '"' => '%22',
+            '%' => '%25'
+         ) ;
+
+        return strtr( $valueToEncode,  $chars ) ;
+    }
+
+    /**
+     * Converts a PHP variable into its Javascript equivalent.
+     * The code of this method has been "borrowed" from the funcion drupal_to_js() within the Drupal CMS.
+     * @param mixed $var	The variable to be converted into Javascript syntax
+     * @return string		Returns a string
+     * Note: This function is similar to json_encode(), in addition it produces HTML-safe strings, i.e. with <, > and & escaped.
+     * @link http://drupal.org/
+     */
+    private function to_js( $var ) {
+        switch ( gettype( $var ) ) {
+            case 'boolean' :
+                return $var ? 'true' : 'false' ; // Lowercase necessary!
+            case 'integer' :
+            case 'double' :
+                return (string) $var ;
+            case 'resource' :
+            case 'string' :
+                return '"' . str_replace( array( "\r", "\n", "<", ">", "&" ), array( '\r', '\n', '\x3c', '\x3e', '\x26' ), addslashes( $var ) ) . '"' ;
+            case 'array' :
+            // Arrays in JSON can't be associative. If the array is empty or if it
+            // has sequential whole number keys starting with 0, it's not associative
+            // so we can go ahead and convert it as an array.
+                if ( empty( $var ) || array_keys( $var ) === range( 0, sizeof( $var ) - 1 ) ) {
+                    $output = array() ;
+                    foreach ( $var as $v ) {
+                        $output[] = $this->to_js( $v ) ;
+                    }
+                    return '[ ' . implode( ', ', $output ) . ' ]' ;
+                }
+            // Otherwise, fall through to convert the array as an object.
+            case 'object' :
+                $output = array() ;
+                foreach ( $var as $k => $v ) {
+                    $output[] = $this->to_js( strval( $k ) ) . ': ' . $this->to_js( $v ) ;
+                }
+                return '{ ' . implode(', ', $output) . ' }' ;
+            default:
+                return 'null' ;
+        }
+    }
+
+    /**
+     * This method reads configuration data for the current editor's instance without overriding settings that already exist.
+     * @return array
+     */
+    function read_configuration(& $config) {
+        $toolbar_set = $this->ToolbarSet;
+        $toolbar_set_maximized = $this->ToolbarSet.'Maximized';
+        foreach ($config as $key => $value) {
+            switch ($key) {
+                case 'ToolbarSets':
+                    if (!empty($toolbar_set) && $toolbar_set != 'Default') {
+                        if (is_array($value)) {
+                            if (isset($value['Normal'])) {
+                                if (!isset($this->Config[$key][$toolbar_set])) {
+                                    $this->Config[$key][$toolbar_set] = $value['Normal'];
+                                }
+                            }
+                            if (isset($value['Maximized'])) {
+                                if (!isset($this->Config[$key][$toolbar_set_maximized])) {
+                                    $this->Config[$key][$toolbar_set_maximized] = $value['Maximized'];
+                                }
+                            }
+                        }
+                    }
+                    break;
+                case 'Width':
+                    $this->Config[$key] = (string) $value;
+                    $this->Width = $this->Config[$key];
+                    break;
+                case 'Height':
+                    $this->Config[$key] = (string) $value;
+                    $this->Height = $this->Config[$key];
+                    break;
+                default:
+                    if (!isset($this->Config[$key])) {
+                        $this->Config[$key] = $value;
+                    }
+            }
+        }
+    }
+
+    /**
+     * This method returns editor's custom configuration settings read from php-files.
+     * @return array	Custom configuration data.
+     */
+    private function & get_custom_configuration() {
+        static $config;
+        if (!isset($config)) {
+            require api_get_path(LIBRARY_PATH).'fckeditor/myconfig.php';
+        }
+        $toolbar_dir = isset($config['ToolbarSets']['Directory']) ? $config['ToolbarSets']['Directory'] : 'default';
+        return array_merge($config, $this->get_custom_toolbar_configuration($toolbar_dir));
+    }
+
+    /**
+     * This method returns editor's toolbar configuration settings read from a php-file.
+     * @return array	Toolbar configuration data.
+     */
+    private function & get_custom_toolbar_configuration($toolbar_dir) {
+        static $toolbar_config = array('Default' => array());
+        if (!isset($toolbar_config[$this->ToolbarSet])) {
+            $toolbar_config[$this->ToolbarSet] = array();
+            if (preg_match('/[a-zA-Z_]+/', $toolbar_dir) && preg_match('/[a-zA-Z_]+/', $this->ToolbarSet)) { // A security check.
+                // Seeking the toolbar.
+                @include api_get_path(LIBRARY_PATH).'fckeditor/toolbars/'.$toolbar_dir.'/'.api_camel_case_to_underscore($this->ToolbarSet).'.php';
+                if (!isset($config['ToolbarSets']['Normal'])) {
+                    // No toolbar has been found yet.
+                    if ($toolbar_dir == 'default') {
+                        // It does not exist in default toolbar definitions, giving up.
+                        $this->ToolbarSet = 'Default';
+                    } else {
+                        // The custom toolbar does not exist, then trying to load the default one.
+                        @include api_get_path(LIBRARY_PATH).'fckeditor/toolbars/default/'.api_camel_case_to_underscore($this->ToolbarSet).'.php';
+                        if (!isset($config['ToolbarSets']['Normal'])) {
+                            // It does not exist in default toolbar definitions, giving up.
+                            $this->ToolbarSet = 'Default';
+                        } else {
+                            $toolbar_config[$this->ToolbarSet] = $config;
+                        }
+                    }
+                } else {
+                    $toolbar_config[$this->ToolbarSet] = $config;
+                }
+            } else {
+                $this->ToolbarSet = 'Default';
+            }
+        }
+        return $toolbar_config[$this->ToolbarSet];
+    }
+
+    /**
+     * This method returns automatically determined editor's configuration settings (default settings).
+     * @return array
+     */
+    private function & get_default_configuration() {
+        return array_merge(
+            self::get_javascript_custom_configuration_file(),
+            self::get_css_configuration(),
+            self::get_editor_language(),
+            $this->get_repository_configuration(),
+            self::get_media_configuration(),
+            self::get_user_configuration_data(),
+            $this->get_mimetex_plugin_configuration()
+        );
+    }
+
+    /**
+     * This method returns the path to the javascript custom configuration file.
+     * @return array
+     */
+    private function & get_javascript_custom_configuration_file() {
+        return array('CustomConfigurationsPath' => api_get_path(REL_PATH).'main/inc/lib/fckeditor/myconfig.js');
+    }
+
+    /**
+     * This method returns CSS-related configuration data that has been determined by the system.
+     * @return array
+     */
+    private function & get_css_configuration() {
+        $config['EditorAreaCSS'] = api_get_path(REL_PATH).'main/css/'.api_get_setting('stylesheets').'/default.css';
+        $config['ToolbarComboPreviewCSS'] = $config['EditorAreaCSS'];
+        return $config;
+    }
+
+    /**
+     * This method determines editor's interface language and returns it as compatible with the editor langiage code.
+     * @return array
+     */
+    private function & get_editor_language() {
+        static $config;
+        if (!is_array($config)) {
+            $code_translation_table = array('' => 'en', 'sr' => 'sr-latn', 'zh' => 'zh-cn', 'zh-tw' => 'zh');
+            $editor_lang = strtolower(str_replace('_', '-', api_get_language_isocode()));
+            $editor_lang = isset($code_translation_table[$editor_lang]) ? $code_translation_table[$editor_lang] : $editor_lang;
+            $editor_lang = file_exists(api_get_path(SYS_PATH).'main/inc/lib/fckeditor/editor/lang/'.$editor_lang.'.js') ? $editor_lang : 'en';
+            $config['DefaultLanguage'] = $editor_lang;
+            $config['ContentLangDirection'] = api_get_text_direction($editor_lang);
+        }
+        return $config;
+    }
+
+    /**
+     * This method returns default configuration for document repository that is to be used by the editor.
+     * @return array
+     */
+    private function & get_repository_configuration() {
+
+        // Preliminary calculations for assembling required paths.
+        $base_path = $this->BasePath;
+        $script_name = substr($_SERVER['PHP_SELF'], strlen(api_get_path(REL_PATH)));
+        $script_path = explode('/', $script_name);
+        $script_path[count($script_path) - 1] = '';
+        if (api_is_in_course()) {
+            $relative_path_prefix = str_repeat('../', count($script_path) - 1);
+        } else {
+            $relative_path_prefix = str_repeat('../', count($script_path) - 2);
+        }
+        $script_path = implode('/', $script_path);
+        $script_path = api_get_path(WEB_PATH).$script_path;
+
+        $use_advanced_filemanager = api_get_setting('advanced_filemanager') == 'true';
+        // Let javascripts "know" which file manager has been chosen.
+        $config['AdvancedFileManager'] = $use_advanced_filemanager;
+
+        if (api_is_in_course()) {
+            if (!api_is_in_group()) {
+                // 1. We are inside a course and not in a group.
+                if (api_is_allowed_to_edit()) {
+                    // 1.1. Teacher (tutor and coach are not authorized to change anything in the "content creation" tools)
+                    $config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document/';
+                    $config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/';
+                    $config['BaseHref'] = $script_path;
+                } else {
+                    // 1.2. Student
+                    $current_session_id = api_get_session_id();
+                    if($current_session_id==0)
+                    {
+
+                        $config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document/shared_folder/sf_user_'.api_get_user_id().'/';
+                        $config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/shared_folder/sf_user_'.api_get_user_id().'/';
+                        $config['BaseHref'] = $script_path;
+                    }
+                    else
+                    {
+                        $config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document//shared_folder_session_'.$current_session_id.'/sf_user_'.api_get_user_id().'/';
+                        $config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document/shared_folder_session_'.$current_session_id.'/sf_user_'.api_get_user_id().'/';
+                        $config['BaseHref'] = $script_path;
+                    }
+                }
+            } else {
+                // 2. Inside a course and inside a group.
+                global $group_properties;
+                $config['CreateDocumentWebDir'] = api_get_path(WEB_COURSE_PATH).api_get_course_path().'/document'.$group_properties['directory'].'/';
+                $config['CreateDocumentDir'] = $relative_path_prefix.'courses/'.api_get_course_path().'/document'.$group_properties['directory'].'/';
+                $config['BaseHref'] = $script_path;
+            }
+        } else {
+            if (api_is_platform_admin() && $_SESSION['this_section'] == 'platform_admin') {
+                // 3. Platform administration activities.
+                $config['CreateDocumentWebDir'] = api_get_path(WEB_PATH).'home/default_platform_document/';
+                $config['CreateDocumentDir'] = api_get_path(WEB_PATH).'home/default_platform_document/'; // A side-effect is in use here.
+                $config['BaseHref'] = api_get_path(WEB_PATH).'home/default_platform_document/';
+            } else {
+                // 4. The user is outside courses.
+                $config['CreateDocumentWebDir'] = api_get_path(WEB_PATH).'main/upload/users/'.api_get_user_id().'/my_files/';
+                $config['CreateDocumentDir'] = $relative_path_prefix.'upload/users/'.api_get_user_id().'/my_files/';
+                $config['BaseHref'] = $script_path;
+            }
+        }
+
+        // URLs for opening the file browser for different resource types (file types):
+        if ($use_advanced_filemanager) {
+            // Double slashes within the following URLs for the advanced file manager are put intentionally. Please, keep them.
+            // for images
+            $config['ImageBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
+            // for flash
+            $config['FlashBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
+            // for audio files (mp3)
+            $config['MP3BrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
+            // for video
+            $config['VideoBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
+            // for video (flv)
+            $config['MediaBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
+            // for links (any resource type)
+            $config['LinkBrowserURL'] = $base_path.'/editor/plugins/ajaxfilemanager/ajaxfilemanager.php';
+        } else {
+            // for images
+            $config['ImageBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Images&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
+            // for flash
+            $config['FlashBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Flash&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
+            // for audio files (mp3)
+            $config['MP3BrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=MP3&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
+            // for video
+            $config['VideoBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Video&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
+            // for video (flv)
+            $config['MediaBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=Video/flv&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
+            // for links (any resource type)
+            $config['LinkBrowserURL'] = $base_path.'editor/filemanager/browser/default/browser.html?Type=File&Connector='.$base_path.'editor/filemanager/connectors/php/connector.php';
+        }
+
+        // URLs for making quick uplods for different resource types (file types).
+        // These URLs are used by the dialogs' quick upload tabs:
+        // for images
+        $config['ImageUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Images';
+        // for flash
+        $config['FlashUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Flash';
+        // for audio files (mp3)
+        $config['MP3UploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=MP3';
+        // for video
+        $config['VideoUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Video';
+        // for video (flv)
+        $config['MediaUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=Video/flv';
+        // for links (any resource type)
+        $config['LinkUploadURL'] = $base_path.'editor/filemanager/connectors/php/upload.php?Type=File';
+
+        return $config;
+    }
+
+    /**
+     * This method returns multi-media related configuration data.
+     * @return array
+     */
+    private function & get_media_configuration() {
+        $config['FlashPlayerAudio'] = api_get_path(TO_REL, FLASH_PLAYER_AUDIO);
+        $config['FlashPlayerVideo'] = api_get_path(TO_REL, FLASH_PLAYER_VIDEO);
+        $config['ScriptSWFObject'] = api_get_path(TO_REL, SCRIPT_SWFOBJECT);
+        $config['ScriptASCIIMathML'] = api_get_path(TO_REL, SCRIPT_ASCIIMATHML);
+        $config['DrawingASCIISVG'] = api_get_path(TO_REL, DRAWING_ASCIISVG);
+        return $config;
+    }
+
+    /**
+     * This method returns current user specific configuration data.
+     * @return array
+     */
+    private function & get_user_configuration_data() {
+        $config['UserIsCourseAdmin'] = api_is_allowed_to_edit() ? true : false;
+        $config['UserIsPlatformAdmin'] = api_is_platform_admin() ? true : false;
+        return $config;
+    }
+
+    /**
+     * This method returns detected configuration data about editor's MimeTeX plugin.
+     * @return array
+     */
+    private function & get_mimetex_plugin_configuration() {
+        static $config;
+        if (!isset($config)) {
+            $config = array();
+            if (is_array($this->Config['LoadPlugin']) && in_array('mimetex', $this->Config['LoadPlugin'])) {
+                $server_base = api_get_path(WEB_SERVER_ROOT_PATH);
+                $server_base_parts = explode('/', $server_base);
+                $url_relative = 'cgi-bin/mimetex' . ( IS_WINDOWS_OS ? '.exe' : '.cgi' );
+                if (!isset($this->Config['MimetexExecutableInstalled'])) {
+                    $this->Config['MimetexExecutableDetectionMethod'] = 'detect';
+                }
+                if ($this->Config['MimetexExecutableInstalled'] == 'detect') {
+                    $detection_method = isset($this->Config['MimetexExecutableDetectionMethod']) ? $this->Config['MimetexExecutableDetectionMethod'] : 'bootstrap_ip';
+                    $detection_timeout = isset($this->Config['MimetexExecutableDetectionTimeout']) ? $this->Config['MimetexExecutableDetectionTimeout'] : 0.05;
+                    switch ($detection_method) {
+                        case 'bootstrap_ip':
+                            $detection_url = $server_base_parts[0] . '//127.0.0.1/';
+                            break;
+                        case 'localhost':
+                            $detection_url = $server_base_parts[0] . '//localhost/';
+                            break;
+                        case 'ip':
+                            $detection_url = $server_base_parts[0] . '//' . $_SERVER['SERVER_ADDR'] . '/';
+                            break;
+                        default:
+                            $detection_url = $server_base_parts[0] . '//' . $_SERVER['SERVER_NAME'] . '/';
+                    }
+                    $detection_url .= $url_relative . '?' . rand();
+                    $config['IsMimetexInstalled'] = self::url_exists($detection_url, $detection_timeout);
+                } else {
+                    $config['IsMimetexInstalled'] = $this->Config['MimetexExecutableInstalled'];
+                }
+                $config['MimetexUrl'] = api_add_trailing_slash($server_base) . $url_relative;
+            }
+            // Cleaning detection related settings, we don't need them anymore.
+            unset($this->Config['MimetexExecutableInstalled']);
+            unset($this->Config['MimetexExecutableDetectionMethod']);
+            unset($this->Config['MimetexExecutableDetectionTimeout']);
+        }
+        return $config;
+    }
+
+    /*
+     * Checks whether a given url exists.
+     * @param string $url
+     * @param int $timeout
+     * @return boolean
+     * @author Ivan Tcholakov, FEB-2009
+     */
+    private function url_exists($url, $timeout = 30) {
+        $parsed = parse_url($url);
+        $scheme = isset($parsed['scheme']) ? $parsed['scheme'] : 'http';
+        $host = $parsed['host'];
+        $port = isset($parsed['port']) ? $parsed['port'] : ($scheme == 'http' ? 80 : ($scheme == 'https' ? 443 : -1 ));
+
+        $file_exists = false;
+        $fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
+        if ($fp) {
+            $request = "HEAD ".$url." / HTTP/1.1\r\n";
+            $request .= "Host: ".$host."\r\n";
+            $request .= "Connection: Close\r\n\r\n";
+
+            @fwrite($fp, $request);
+            while (!@feof($fp)) {
+                $header = @fgets($fp, 128);
+                if(@preg_match('#HTTP/1.1 200 OK#', $header)) {
+                    $file_exists = true;
+                    break;
+                }
+            }
+        }
+        @fclose($fp);
+        return $file_exists;
+    }
 }

+ 3 - 1
main/inc/lib/main_api.lib.php

@@ -203,6 +203,7 @@ define('FLASH_PLAYER_AUDIO', '{FLASH_PLAYER_AUDIO}');
 define('FLASH_PLAYER_VIDEO', '{FLASH_PLAYER_VIDEO}');
 define('SCRIPT_SWFOBJECT', '{SCRIPT_SWFOBJECT}');
 define('SCRIPT_ASCIIMATHML', '{SCRIPT_ASCIIMATHML}');
+define('DRAWING_ASCIISVG', '{DRAWING_ASCIISVG}');
 
 // Forcing PclZip library to use a custom temporary folder.
 define('PCLZIP_TEMPORARY_DIR', api_get_path(SYS_ARCHIVE_PATH));
@@ -339,7 +340,8 @@ function api_get_path($path_type, $path = null) {
         FLASH_PLAYER_AUDIO      => 'inc/lib/mediaplayer/player.swf',
         FLASH_PLAYER_VIDEO      => 'inc/lib/mediaplayer/player.swf',
         SCRIPT_SWFOBJECT        => 'inc/lib/swfobject/swfobject.js',
-        SCRIPT_ASCIIMATHML      => 'inc/lib/asciimath/ASCIIMathML.js'
+        SCRIPT_ASCIIMATHML      => 'inc/lib/asciimath/ASCIIMathML.js',
+        DRAWING_ASCIISVG        => 'inc/lib/asciimath/d.svg'
     );
 
     static $is_this_function_initialized;

+ 1 - 1
main/template/default/auth/courses_categories.php

@@ -129,7 +129,7 @@ $stok = Security::get_token();
 
                 $title = $course['title'];
                 $tutor_name = $course['tutor'];
-                $creation_date = $course['creation_date'];
+                $creation_date = substr($course['creation_date'],0,10);
                 $count_connections = $course['count_connections'];
 
 

+ 478 - 476
tests/main/inc/lib/main_api.lib.test_standalone.php

@@ -7,332 +7,334 @@
 
 class TestMainApi extends UnitTestCase {
 
-	function TestMainApi() {
+    function TestMainApi() {
         $this->UnitTestCase('Main API tests');
-	}
-
-	public function testApiGetPath() {
-
-		$common_paths = array(
-			WEB_PATH,
-			SYS_PATH,
-			REL_PATH,
-			WEB_SERVER_ROOT_PATH,
-			SYS_SERVER_ROOT_PATH,
-			WEB_COURSE_PATH,
-			SYS_COURSE_PATH,
-			REL_COURSE_PATH,
-			REL_CODE_PATH,
-			WEB_CODE_PATH,
-			SYS_CODE_PATH,
-			SYS_LANG_PATH,
-			WEB_IMG_PATH,
-			WEB_CSS_PATH,
-			SYS_PLUGIN_PATH,
-			WEB_PLUGIN_PATH,
-			SYS_ARCHIVE_PATH,
-			WEB_ARCHIVE_PATH,
-			INCLUDE_PATH,
-			LIBRARY_PATH,
-			CONFIGURATION_PATH,
-			WEB_LIBRARY_PATH
-		);
-
-		$specific_paths = array(
-			FLASH_PLAYER_AUDIO,
-			FLASH_PLAYER_VIDEO,
-			SCRIPT_SWFOBJECT,
-			SCRIPT_ASCIIMATHML
-		);
-
-		$res = array();
-		$is_ok = array();
-		$message = array();
-		$paths = array();
-
-		$message[] = '';
-		$message[] = '<strong>A test about api_get_path()</strong>';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-
-		$message[] = '';
-		$message[] = 'Changed behaviour of the function api_get_path() after Dokeos 1.8.6.1, i.e. as of Chamilo 1.8.6.2.';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-		$message[] = 'Old behaviour (1.8.6.1) api_get_path(INCLUDE_PATH) = '.api_get_path_1_8_6_1(INCLUDE_PATH).'&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;'.'New behaviour (1.8.6.2) api_get_path(INCLUDE_PATH) = '.api_get_path(INCLUDE_PATH);
-		$message[] = '* Reason for this change: Difference here is due to the fact that the etalonic old function api_get_path() has ben moved in this file ( see api_get_path_1_8_6_1() ). Even for such rare, hypothetical cases, this widely used function should be stable. Now, after installation, the function returns results based on configuration settings only, as it should be.';
-		$message[] = '';
-		$message[] = 'Old behaviour (1.8.6.1) api_get_path(WEB_CSS_PATH) = '.api_get_path_1_8_6_1(WEB_CSS_PATH).'&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;'.'New behaviour (1.8.6.2) api_get_path(WEB_CSS_PATH) = '.api_get_path(WEB_CSS_PATH);
-		$message[] = '* This is a proposed implementation. Retrieving css paths through user\'s configuration options has not been implemented yet.';
-		$message[] = '';
-
-		$message[] = '';
-		$message[] = 'Reading common purpose paths';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-
-		foreach ($common_paths as $path) {
-
-			$test_case = "api_get_path($path)";
-			$res[$test_case] = api_get_path($path);
-			switch ($path) {
-				case INCLUDE_PATH:
-				case WEB_CSS_PATH:
-					$is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
-					break;
-				default:
-					$is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]) && $res[$test_case] == api_get_path_1_8_6_1($path);
-			}
-			$message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
-		}
-
-		$message[] = '';
-		$message[] = '';
-		$message[] = 'Reading specific purpose paths';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-
-		foreach ($specific_paths as $path) {
-
-			$test_case = "api_get_path(TO_WEB, $path)";
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_WEB, $path);
-			$is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
-			$message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
-			$paths[] = $path;
-
-			$test_case = "api_get_path(TO_SYS, $path)";
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_SYS, $path);
-			$is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
-			$message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
-			$paths[] = $path;
-
-			$test_case = "api_get_path(TO_REL, $path)";
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_REL, $path);
-			$is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
-			$message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
-			$paths[] = $path;
-		}
-
-		$message[] = '';
-		$message[] = '';
-		$message[] = 'Testing path conversions';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-
-		$paths = array();
-		foreach ($common_paths as $path) {
-			$paths[] = array($path, api_get_path($path));
-		}
-		foreach ($specific_paths as $path) {
-			$paths[] = array($path, api_get_path(TO_WEB, $path));
-			$paths[] = array($path, api_get_path(TO_SYS, $path));
-			$paths[] = array($path, api_get_path(TO_REL, $path));
-		}
-
-		foreach ($paths as $path) {
-
-			$test_case = 'api_get_path(TO_WEB, '.$path[0].')';
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_WEB, $path[0]);
-			$test_case_1 = 'api_get_path(TO_WEB, \''.$path[1].'\')';
-			$res[$test_case_1] = api_get_path(TO_WEB, $path[1]);
-			$is_ok[$test_case] =
-				is_string($res[$test_case]) && !empty($res[$test_case])
-				&& is_string($res[$test_case_1]) && !empty($res[$test_case_1])
-				&& $res[$test_case] == $res[$test_case_1];
-			$message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : ';
-			$message[] = $test_case.' => '.$res[$test_case];
-			$message[] = $test_case_1.' => '.$res[$test_case_1];
-			$message[] = '';
-
-			$test_case = 'api_get_path(TO_SYS, '.$path[0].')';
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_SYS, $path[0]);
-			$test_case_1 = 'api_get_path(TO_SYS, \''.$path[1].'\')';
-			$res[$test_case_1] = api_get_path(TO_SYS, $path[1]);
-			$is_ok[$test_case] =
-				is_string($res[$test_case]) && !empty($res[$test_case])
-				&& is_string($res[$test_case_1]) && !empty($res[$test_case_1])
-				&& $res[$test_case] == $res[$test_case_1];
-			$message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : ';
-			$message[] = $test_case.' => '.$res[$test_case];
-			$message[] = $test_case_1.' => '.$res[$test_case_1];
-			$message[] = '';
-
-			$test_case = 'api_get_path(TO_REL, '.$path[0].')';
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_REL, $path[0]);
-			$test_case_1 = 'api_get_path(TO_REL, \''.$path[1].'\')';
-			$res[$test_case_1] = api_get_path(TO_REL, $path[1]);
-			$is_ok[$test_case] =
-				is_string($res[$test_case]) && !empty($res[$test_case])
-				&& is_string($res[$test_case_1]) && !empty($res[$test_case_1])
-				&& $res[$test_case] == $res[$test_case_1];
-			$message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : ';
-			$message[] = $test_case.' => '.$res[$test_case];
-			$message[] = $test_case_1.' => '.$res[$test_case_1];
-			$message[] = '';
-
-		}
-
-		$message[] = '';
-		$message[] = 'Random examples, check them visually';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-		$message[] = '$_SERVER[\'REQUEST_URI\'] => '.$_SERVER['REQUEST_URI'];
-		$message[] = '<strong>Note:</strong> Try some query strings. They should be removed from the results.';
-		$message[] = 'api_get_path(TO_WEB, $_SERVER[\'REQUEST_URI\']) => '.api_get_path(TO_WEB, $_SERVER['REQUEST_URI']);
-		$message[] = 'api_get_path(TO_SYS, $_SERVER[\'REQUEST_URI\']) => '.api_get_path(TO_SYS, $_SERVER['REQUEST_URI']);
-		$message[] = 'api_get_path(TO_REL, $_SERVER[\'REQUEST_URI\']) => '.api_get_path(TO_REL, $_SERVER['REQUEST_URI']);
-		$message[] = '';
-		$message[] = '__FILE__ => '.__FILE__;
-		$message[] = 'api_get_path(TO_WEB, __FILE__) => '.api_get_path(TO_WEB, __FILE__);
-		$message[] = 'api_get_path(TO_SYS, __FILE__) => '.api_get_path(TO_SYS, __FILE__);
-		$message[] = 'api_get_path(TO_REL, __FILE__) => '.api_get_path(TO_REL, __FILE__);
-		$message[] = '';
-		$message[] = '$_SERVER[\'PHP_SELF\'] => '.$_SERVER['PHP_SELF'];
-		$message[] = 'api_get_path(TO_WEB, $_SERVER[\'PHP_SELF\']) => '.api_get_path(TO_WEB, $_SERVER['PHP_SELF']);
-		$message[] = 'api_get_path(TO_SYS, $_SERVER[\'PHP_SELF\']) => '.api_get_path(TO_SYS, $_SERVER['PHP_SELF']);
-		$message[] = 'api_get_path(TO_REL, $_SERVER[\'PHP_SELF\']) => '.api_get_path(TO_REL, $_SERVER['PHP_SELF']);
-		$message[] = '';
-
-		$message[] = '';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = 'This test and changes of behaviour of api_get_path() have been done by Ivan Tcholakov, September 22, 2009.';
-		$message[] = '';
-
-		$result = !in_array(false, $is_ok);
-	 	$this->assertTrue($result);
-	 	//var_dump($res);
-	 	foreach ($message as $line) { echo $line.'<br />'; }
-
-	 	// Sample code for showing results in different context.
-	 	/*
-		$common_paths = array(
-			WEB_PATH,
-			SYS_PATH,
-			REL_PATH,
-			WEB_SERVER_ROOT_PATH,
-			SYS_SERVER_ROOT_PATH,
-			WEB_COURSE_PATH,
-			SYS_COURSE_PATH,
-			REL_COURSE_PATH,
-			REL_CODE_PATH,
-			WEB_CODE_PATH,
-			SYS_CODE_PATH,
-			SYS_LANG_PATH,
-			WEB_IMG_PATH,
-			WEB_CSS_PATH,
-			SYS_PLUGIN_PATH,
-			WEB_PLUGIN_PATH,
-			SYS_ARCHIVE_PATH,
-			WEB_ARCHIVE_PATH,
-			INCLUDE_PATH,
-			LIBRARY_PATH,
-			CONFIGURATION_PATH,
-			WEB_LIBRARY_PATH
-		);
-
-		$specific_paths = array(
-			FLASH_PLAYER_AUDIO,
-			FLASH_PLAYER_VIDEO,
-			SCRIPT_SWFOBJECT,
-			SCRIPT_ASCIIMATHML
-		);
-
-		$res = array();
-		$is_ok = array();
-		$message = array();
-		$paths = array();
-
-		$message[] = '';
-		$message[] = 'Reading common purpose paths';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-
-		foreach ($common_paths as $path) {
-
-			$test_case = "api_get_path($path)";
-			$res[$test_case] = api_get_path($path);
-			$message[] = $test_case.' => '.$res[$test_case];
-		}
-
-		$message[] = '';
-		$message[] = '';
-		$message[] = 'Reading specific purpose paths';
-		$message[] = '---------------------------------------------------------------------------------------------------------------';
-		$message[] = '';
-
-		foreach ($specific_paths as $path) {
-
-			$test_case = "api_get_path(TO_WEB, $path)";
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_WEB, $path);
-			$message[] = $test_case.' => '.$res[$test_case];
-			$paths[] = $path;
-
-			$test_case = "api_get_path(TO_SYS, $path)";
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_SYS, $path);
-			$message[] = $test_case.' => '.$res[$test_case];
-			$paths[] = $path;
-
-			$test_case = "api_get_path(TO_REL, $path)";
-			$test_case = str_replace(array('{', '}'), '', $test_case);
-			$res[$test_case] = api_get_path(TO_REL, $path);
-			$message[] = $test_case.' => '.$res[$test_case];
-			$paths[] = $path;
-		}
-
-		foreach ($message as $line) { echo $line.'<br />'; }
-		*/
-	}
-
-	public function testApiIsInternalPath() {
-		$path1 = api_get_path(WEB_IMG_PATH);
-		$path2 = 'http://kdflskfsenfnmzsdn/fnefsdsmdsdmsdfsdcmxaddfdafada/index.html';
-		$path3 = api_get_path(TO_SYS, WEB_IMG_PATH);
-		$path4 = 'C:\Inetpub\wwwroot\fnefsdsmdsdmsdfsdcmxaddfdafada/index.html';
-		$path5 = api_get_path(TO_REL, WEB_IMG_PATH);
-		$path6 = '/fnefsdsmdsdmsdfsdcmxaddfdafada/index.html';
-		$res1 = api_is_internal_path($path1);
-		$res2 = api_is_internal_path($path2);
-		$res3 = api_is_internal_path($path3);
-		$res4 = api_is_internal_path($path4);
-		$res5 = api_is_internal_path($path5);
-		$res6 = api_is_internal_path($path6);
-		$this->assertTrue(is_bool($res1) && is_bool($res2) && is_bool($res3) && is_bool($res4) && is_bool($res5) && is_bool($res6)
-			&& $res1 && !$res2 && $res3 && !$res4 && $res5 && !$res6);
-		//var_dump($res1);
-		//var_dump($res2);
-		//var_dump($res1);
-		//var_dump($res2);
-		//var_dump($res1);
-		//var_dump($res2);
-	}
-
-	public function testApiAddTrailingSlash() {
-		$string1 = 'path';
-		$string2 = 'path/';
-		$res1 = api_add_trailing_slash($string1);
-		$res2 = api_add_trailing_slash($string2);
-		$this->assertTrue(is_string($res1) && is_string($res2) && $res1 == $res2);
-		//var_dump($res1);
-		//var_dump($res2);
-	}
-
-	public function testRemoveAddTrailingSlash() {
-		$string1 = 'path';
-		$string2 = 'path/';
-		$res1 = api_remove_trailing_slash($string1);
-		$res2 = api_remove_trailing_slash($string2);
-		$this->assertTrue(is_string($res1) && is_string($res2) && $res1 == $res2);
-		//var_dump($res1);
-		//var_dump($res2);
-	}
+    }
+
+    public function testApiGetPath() {
+
+        $common_paths = array(
+            WEB_PATH,
+            SYS_PATH,
+            REL_PATH,
+            WEB_SERVER_ROOT_PATH,
+            SYS_SERVER_ROOT_PATH,
+            WEB_COURSE_PATH,
+            SYS_COURSE_PATH,
+            REL_COURSE_PATH,
+            REL_CODE_PATH,
+            WEB_CODE_PATH,
+            SYS_CODE_PATH,
+            SYS_LANG_PATH,
+            WEB_IMG_PATH,
+            WEB_CSS_PATH,
+            SYS_PLUGIN_PATH,
+            WEB_PLUGIN_PATH,
+            SYS_ARCHIVE_PATH,
+            WEB_ARCHIVE_PATH,
+            INCLUDE_PATH,
+            LIBRARY_PATH,
+            CONFIGURATION_PATH,
+            WEB_LIBRARY_PATH
+        );
+
+        $specific_paths = array(
+            FLASH_PLAYER_AUDIO,
+            FLASH_PLAYER_VIDEO,
+            SCRIPT_SWFOBJECT,
+            SCRIPT_ASCIIMATHML,
+            DRAWING_ASCIISVG
+        );
+
+        $res = array();
+        $is_ok = array();
+        $message = array();
+        $paths = array();
+
+        $message[] = '';
+        $message[] = '<strong>A test about api_get_path()</strong>';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+
+        $message[] = '';
+        $message[] = 'Changed behaviour of the function api_get_path() after Dokeos 1.8.6.1, i.e. as of Chamilo 1.8.6.2.';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+        $message[] = 'Old behaviour (1.8.6.1) api_get_path(INCLUDE_PATH) = '.api_get_path_1_8_6_1(INCLUDE_PATH).'&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;'.'New behaviour (1.8.6.2) api_get_path(INCLUDE_PATH) = '.api_get_path(INCLUDE_PATH);
+        $message[] = '* Reason for this change: Difference here is due to the fact that the etalonic old function api_get_path() has ben moved in this file ( see api_get_path_1_8_6_1() ). Even for such rare, hypothetical cases, this widely used function should be stable. Now, after installation, the function returns results based on configuration settings only, as it should be.';
+        $message[] = '';
+        $message[] = 'Old behaviour (1.8.6.1) api_get_path(WEB_CSS_PATH) = '.api_get_path_1_8_6_1(WEB_CSS_PATH).'&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;'.'New behaviour (1.8.6.2) api_get_path(WEB_CSS_PATH) = '.api_get_path(WEB_CSS_PATH);
+        $message[] = '* This is a proposed implementation. Retrieving css paths through user\'s configuration options has not been implemented yet.';
+        $message[] = '';
+
+        $message[] = '';
+        $message[] = 'Reading common purpose paths';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+
+        foreach ($common_paths as $path) {
+
+            $test_case = "api_get_path($path)";
+            $res[$test_case] = api_get_path($path);
+            switch ($path) {
+                case INCLUDE_PATH:
+                case WEB_CSS_PATH:
+                    $is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
+                    break;
+                default:
+                    $is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]) && $res[$test_case] == api_get_path_1_8_6_1($path);
+            }
+            $message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
+        }
+
+        $message[] = '';
+        $message[] = '';
+        $message[] = 'Reading specific purpose paths';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+
+        foreach ($specific_paths as $path) {
+
+            $test_case = "api_get_path(TO_WEB, $path)";
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_WEB, $path);
+            $is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
+            $message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
+            $paths[] = $path;
+
+            $test_case = "api_get_path(TO_SYS, $path)";
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_SYS, $path);
+            $is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
+            $message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
+            $paths[] = $path;
+
+            $test_case = "api_get_path(TO_REL, $path)";
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_REL, $path);
+            $is_ok[$test_case] = is_string($res[$test_case]) && !empty($res[$test_case]);
+            $message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : '.$test_case.' => '.$res[$test_case];
+            $paths[] = $path;
+        }
+
+        $message[] = '';
+        $message[] = '';
+        $message[] = 'Testing path conversions';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+
+        $paths = array();
+        foreach ($common_paths as $path) {
+            $paths[] = array($path, api_get_path($path));
+        }
+        foreach ($specific_paths as $path) {
+            $paths[] = array($path, api_get_path(TO_WEB, $path));
+            $paths[] = array($path, api_get_path(TO_SYS, $path));
+            $paths[] = array($path, api_get_path(TO_REL, $path));
+        }
+
+        foreach ($paths as $path) {
+
+            $test_case = 'api_get_path(TO_WEB, '.$path[0].')';
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_WEB, $path[0]);
+            $test_case_1 = 'api_get_path(TO_WEB, \''.$path[1].'\')';
+            $res[$test_case_1] = api_get_path(TO_WEB, $path[1]);
+            $is_ok[$test_case] =
+                is_string($res[$test_case]) && !empty($res[$test_case])
+                && is_string($res[$test_case_1]) && !empty($res[$test_case_1])
+                && $res[$test_case] == $res[$test_case_1];
+            $message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : ';
+            $message[] = $test_case.' => '.$res[$test_case];
+            $message[] = $test_case_1.' => '.$res[$test_case_1];
+            $message[] = '';
+
+            $test_case = 'api_get_path(TO_SYS, '.$path[0].')';
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_SYS, $path[0]);
+            $test_case_1 = 'api_get_path(TO_SYS, \''.$path[1].'\')';
+            $res[$test_case_1] = api_get_path(TO_SYS, $path[1]);
+            $is_ok[$test_case] =
+                is_string($res[$test_case]) && !empty($res[$test_case])
+                && is_string($res[$test_case_1]) && !empty($res[$test_case_1])
+                && $res[$test_case] == $res[$test_case_1];
+            $message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : ';
+            $message[] = $test_case.' => '.$res[$test_case];
+            $message[] = $test_case_1.' => '.$res[$test_case_1];
+            $message[] = '';
+
+            $test_case = 'api_get_path(TO_REL, '.$path[0].')';
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_REL, $path[0]);
+            $test_case_1 = 'api_get_path(TO_REL, \''.$path[1].'\')';
+            $res[$test_case_1] = api_get_path(TO_REL, $path[1]);
+            $is_ok[$test_case] =
+                is_string($res[$test_case]) && !empty($res[$test_case])
+                && is_string($res[$test_case_1]) && !empty($res[$test_case_1])
+                && $res[$test_case] == $res[$test_case_1];
+            $message[] = ($is_ok[$test_case] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' : ';
+            $message[] = $test_case.' => '.$res[$test_case];
+            $message[] = $test_case_1.' => '.$res[$test_case_1];
+            $message[] = '';
+
+        }
+
+        $message[] = '';
+        $message[] = 'Random examples, check them visually';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+        $message[] = '$_SERVER[\'REQUEST_URI\'] => '.$_SERVER['REQUEST_URI'];
+        $message[] = '<strong>Note:</strong> Try some query strings. They should be removed from the results.';
+        $message[] = 'api_get_path(TO_WEB, $_SERVER[\'REQUEST_URI\']) => '.api_get_path(TO_WEB, $_SERVER['REQUEST_URI']);
+        $message[] = 'api_get_path(TO_SYS, $_SERVER[\'REQUEST_URI\']) => '.api_get_path(TO_SYS, $_SERVER['REQUEST_URI']);
+        $message[] = 'api_get_path(TO_REL, $_SERVER[\'REQUEST_URI\']) => '.api_get_path(TO_REL, $_SERVER['REQUEST_URI']);
+        $message[] = '';
+        $message[] = '__FILE__ => '.__FILE__;
+        $message[] = 'api_get_path(TO_WEB, __FILE__) => '.api_get_path(TO_WEB, __FILE__);
+        $message[] = 'api_get_path(TO_SYS, __FILE__) => '.api_get_path(TO_SYS, __FILE__);
+        $message[] = 'api_get_path(TO_REL, __FILE__) => '.api_get_path(TO_REL, __FILE__);
+        $message[] = '';
+        $message[] = '$_SERVER[\'PHP_SELF\'] => '.$_SERVER['PHP_SELF'];
+        $message[] = 'api_get_path(TO_WEB, $_SERVER[\'PHP_SELF\']) => '.api_get_path(TO_WEB, $_SERVER['PHP_SELF']);
+        $message[] = 'api_get_path(TO_SYS, $_SERVER[\'PHP_SELF\']) => '.api_get_path(TO_SYS, $_SERVER['PHP_SELF']);
+        $message[] = 'api_get_path(TO_REL, $_SERVER[\'PHP_SELF\']) => '.api_get_path(TO_REL, $_SERVER['PHP_SELF']);
+        $message[] = '';
+
+        $message[] = '';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = 'This test and changes of behaviour of api_get_path() have been done by Ivan Tcholakov, September 22, 2009.';
+        $message[] = '';
+
+        $result = !in_array(false, $is_ok);
+         $this->assertTrue($result);
+         //var_dump($res);
+         foreach ($message as $line) { echo $line.'<br />'; }
+
+         // Sample code for showing results in different context.
+         /*
+        $common_paths = array(
+            WEB_PATH,
+            SYS_PATH,
+            REL_PATH,
+            WEB_SERVER_ROOT_PATH,
+            SYS_SERVER_ROOT_PATH,
+            WEB_COURSE_PATH,
+            SYS_COURSE_PATH,
+            REL_COURSE_PATH,
+            REL_CODE_PATH,
+            WEB_CODE_PATH,
+            SYS_CODE_PATH,
+            SYS_LANG_PATH,
+            WEB_IMG_PATH,
+            WEB_CSS_PATH,
+            SYS_PLUGIN_PATH,
+            WEB_PLUGIN_PATH,
+            SYS_ARCHIVE_PATH,
+            WEB_ARCHIVE_PATH,
+            INCLUDE_PATH,
+            LIBRARY_PATH,
+            CONFIGURATION_PATH,
+            WEB_LIBRARY_PATH
+        );
+
+        $specific_paths = array(
+            FLASH_PLAYER_AUDIO,
+            FLASH_PLAYER_VIDEO,
+            SCRIPT_SWFOBJECT,
+            SCRIPT_ASCIIMATHML,
+            DRAWING_ASCIISVG
+        );
+
+        $res = array();
+        $is_ok = array();
+        $message = array();
+        $paths = array();
+
+        $message[] = '';
+        $message[] = 'Reading common purpose paths';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+
+        foreach ($common_paths as $path) {
+
+            $test_case = "api_get_path($path)";
+            $res[$test_case] = api_get_path($path);
+            $message[] = $test_case.' => '.$res[$test_case];
+        }
+
+        $message[] = '';
+        $message[] = '';
+        $message[] = 'Reading specific purpose paths';
+        $message[] = '---------------------------------------------------------------------------------------------------------------';
+        $message[] = '';
+
+        foreach ($specific_paths as $path) {
+
+            $test_case = "api_get_path(TO_WEB, $path)";
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_WEB, $path);
+            $message[] = $test_case.' => '.$res[$test_case];
+            $paths[] = $path;
+
+            $test_case = "api_get_path(TO_SYS, $path)";
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_SYS, $path);
+            $message[] = $test_case.' => '.$res[$test_case];
+            $paths[] = $path;
+
+            $test_case = "api_get_path(TO_REL, $path)";
+            $test_case = str_replace(array('{', '}'), '', $test_case);
+            $res[$test_case] = api_get_path(TO_REL, $path);
+            $message[] = $test_case.' => '.$res[$test_case];
+            $paths[] = $path;
+        }
+
+        foreach ($message as $line) { echo $line.'<br />'; }
+        */
+    }
+
+    public function testApiIsInternalPath() {
+        $path1 = api_get_path(WEB_IMG_PATH);
+        $path2 = 'http://kdflskfsenfnmzsdn/fnefsdsmdsdmsdfsdcmxaddfdafada/index.html';
+        $path3 = api_get_path(TO_SYS, WEB_IMG_PATH);
+        $path4 = 'C:\Inetpub\wwwroot\fnefsdsmdsdmsdfsdcmxaddfdafada/index.html';
+        $path5 = api_get_path(TO_REL, WEB_IMG_PATH);
+        $path6 = '/fnefsdsmdsdmsdfsdcmxaddfdafada/index.html';
+        $res1 = api_is_internal_path($path1);
+        $res2 = api_is_internal_path($path2);
+        $res3 = api_is_internal_path($path3);
+        $res4 = api_is_internal_path($path4);
+        $res5 = api_is_internal_path($path5);
+        $res6 = api_is_internal_path($path6);
+        $this->assertTrue(is_bool($res1) && is_bool($res2) && is_bool($res3) && is_bool($res4) && is_bool($res5) && is_bool($res6)
+            && $res1 && !$res2 && $res3 && !$res4 && $res5 && !$res6);
+        //var_dump($res1);
+        //var_dump($res2);
+        //var_dump($res1);
+        //var_dump($res2);
+        //var_dump($res1);
+        //var_dump($res2);
+    }
+
+    public function testApiAddTrailingSlash() {
+        $string1 = 'path';
+        $string2 = 'path/';
+        $res1 = api_add_trailing_slash($string1);
+        $res2 = api_add_trailing_slash($string2);
+        $this->assertTrue(is_string($res1) && is_string($res2) && $res1 == $res2);
+        //var_dump($res1);
+        //var_dump($res2);
+    }
+
+    public function testRemoveAddTrailingSlash() {
+        $string1 = 'path';
+        $string2 = 'path/';
+        $res1 = api_remove_trailing_slash($string1);
+        $res2 = api_remove_trailing_slash($string2);
+        $this->assertTrue(is_string($res1) && is_string($res2) && $res1 == $res2);
+        //var_dump($res1);
+        //var_dump($res2);
+    }
 }
 
 /**
@@ -377,161 +379,161 @@ class TestMainApi extends UnitTestCase {
  */
 function api_get_path_1_8_6_1($path_type) {
 
-	global $_configuration;
-	if (!isset($_configuration['access_url']) || $_configuration['access_url']==1 || $_configuration['access_url']=='') {
-		//by default we call the $_configuration['root_web'] we don't query to the DB
-		//$url_info= api_get_access_url(1);
-		//$root_web = $url_info['url'];
-		if(isset($_configuration['root_web']))
-			$root_web = $_configuration['root_web'];
-	} else {
-		//we look into the DB the function api_get_access_url
-		//this funcion have a problem because we can't called to the Database:: functions
-		$url_info= api_get_access_url($_configuration['access_url']);
-		if ($url_info['active']==1) {
-			$root_web = $url_info['url'];
-		} else {
-			$root_web = $_configuration['root_web'];
-		}
-	}
-
-	switch ($path_type) {
-
-		case WEB_SERVER_ROOT_PATH:
-			// example: http://www.mydokeos.com/
-			$result = preg_replace('@'.api_get_path(REL_PATH).'$@', '', api_get_path(WEB_PATH));
-			if (substr($result, -1) == '/') {
-				return $result;
-			} else {
-				return $result.'/';
-			}
-			break;
-
-		case SYS_SERVER_ROOT_PATH:
-			$result = preg_replace('@'.api_get_path(REL_PATH).'$@', '', api_get_path(SYS_PATH));
-			if (substr($result, -1) == '/') {
-				return $result;
-			} else {
-				return $result.'/';
-			}
-			break;
-
-		case WEB_PATH :
-			// example: http://www.mydokeos.com/ or http://www.mydokeos.com/dokeos/ if you're using
-			// a subdirectory of your document root for Dokeos
-			if (substr($root_web,-1) == '/') {
-				return $root_web;
-			} else {
-				return $root_web.'/';
-			}
-			break;
-
-		case SYS_PATH :
-			// example: /var/www/dokeos/
-			if (substr($_configuration['root_sys'],-1) == '/') {
-				return $_configuration['root_sys'];
-			} else {
-				return $_configuration['root_sys'].'/';
-			}
-			break;
-
-		case REL_PATH :
-			// example: dokeos/
-			if (substr($_configuration['url_append'], -1) === '/') {
-				return $_configuration['url_append'];
-			} else {
-				return $_configuration['url_append'].'/';
-			}
-			break;
-
-		case WEB_COURSE_PATH :
-			// example: http://www.mydokeos.com/courses/
-			return $root_web.$_configuration['course_folder'];
-			break;
-
-		case SYS_COURSE_PATH :
-			// example: /var/www/dokeos/courses/
-			return $_configuration['root_sys'].$_configuration['course_folder'];
-			break;
-
-		case REL_COURSE_PATH :
-			// example: courses/ or dokeos/courses/
-			return api_get_path(REL_PATH).$_configuration['course_folder'];
-			break;
-
-		case REL_CODE_PATH :
-			// example: main/ or dokeos/main/
-			return api_get_path(REL_PATH).$_configuration['code_append'];
-			break;
-
-		case WEB_CODE_PATH :
-			// example: http://www.mydokeos.com/main/
-			//return $GLOBALS['clarolineRepositoryWeb']; // this was changed
-			return $root_web.$_configuration['code_append'];
-			break;
-
-		case SYS_CODE_PATH :
-			// example: /var/www/dokeos/main/
-			return $GLOBALS['clarolineRepositorySys'];
-			break;
-
-		case SYS_LANG_PATH :
-			// example: /var/www/dokeos/main/lang/
-			return api_get_path(SYS_CODE_PATH).'lang/';
-			break;
-
-		case WEB_IMG_PATH :
-			// example: http://www.mydokeos.com/main/img/
-			return api_get_path(WEB_CODE_PATH).'img/';
-			break;
-
-		case SYS_PLUGIN_PATH :
-			// example: /var/www/dokeos/plugin/
-			return api_get_path(SYS_PATH).'plugin/';
-			break;
-
-		case WEB_PLUGIN_PATH :
-			// example: http://www.mydokeos.com/plugin/
-			return api_get_path(WEB_PATH).'plugin/';
-			break;
+    global $_configuration;
+    if (!isset($_configuration['access_url']) || $_configuration['access_url']==1 || $_configuration['access_url']=='') {
+        //by default we call the $_configuration['root_web'] we don't query to the DB
+        //$url_info= api_get_access_url(1);
+        //$root_web = $url_info['url'];
+        if(isset($_configuration['root_web']))
+            $root_web = $_configuration['root_web'];
+    } else {
+        //we look into the DB the function api_get_access_url
+        //this funcion have a problem because we can't called to the Database:: functions
+        $url_info= api_get_access_url($_configuration['access_url']);
+        if ($url_info['active']==1) {
+            $root_web = $url_info['url'];
+        } else {
+            $root_web = $_configuration['root_web'];
+        }
+    }
+
+    switch ($path_type) {
+
+        case WEB_SERVER_ROOT_PATH:
+            // example: http://www.mydokeos.com/
+            $result = preg_replace('@'.api_get_path(REL_PATH).'$@', '', api_get_path(WEB_PATH));
+            if (substr($result, -1) == '/') {
+                return $result;
+            } else {
+                return $result.'/';
+            }
+            break;
+
+        case SYS_SERVER_ROOT_PATH:
+            $result = preg_replace('@'.api_get_path(REL_PATH).'$@', '', api_get_path(SYS_PATH));
+            if (substr($result, -1) == '/') {
+                return $result;
+            } else {
+                return $result.'/';
+            }
+            break;
+
+        case WEB_PATH :
+            // example: http://www.mydokeos.com/ or http://www.mydokeos.com/dokeos/ if you're using
+            // a subdirectory of your document root for Dokeos
+            if (substr($root_web,-1) == '/') {
+                return $root_web;
+            } else {
+                return $root_web.'/';
+            }
+            break;
+
+        case SYS_PATH :
+            // example: /var/www/dokeos/
+            if (substr($_configuration['root_sys'],-1) == '/') {
+                return $_configuration['root_sys'];
+            } else {
+                return $_configuration['root_sys'].'/';
+            }
+            break;
+
+        case REL_PATH :
+            // example: dokeos/
+            if (substr($_configuration['url_append'], -1) === '/') {
+                return $_configuration['url_append'];
+            } else {
+                return $_configuration['url_append'].'/';
+            }
+            break;
+
+        case WEB_COURSE_PATH :
+            // example: http://www.mydokeos.com/courses/
+            return $root_web.$_configuration['course_folder'];
+            break;
+
+        case SYS_COURSE_PATH :
+            // example: /var/www/dokeos/courses/
+            return $_configuration['root_sys'].$_configuration['course_folder'];
+            break;
+
+        case REL_COURSE_PATH :
+            // example: courses/ or dokeos/courses/
+            return api_get_path(REL_PATH).$_configuration['course_folder'];
+            break;
+
+        case REL_CODE_PATH :
+            // example: main/ or dokeos/main/
+            return api_get_path(REL_PATH).$_configuration['code_append'];
+            break;
+
+        case WEB_CODE_PATH :
+            // example: http://www.mydokeos.com/main/
+            //return $GLOBALS['clarolineRepositoryWeb']; // this was changed
+            return $root_web.$_configuration['code_append'];
+            break;
+
+        case SYS_CODE_PATH :
+            // example: /var/www/dokeos/main/
+            return $GLOBALS['clarolineRepositorySys'];
+            break;
+
+        case SYS_LANG_PATH :
+            // example: /var/www/dokeos/main/lang/
+            return api_get_path(SYS_CODE_PATH).'lang/';
+            break;
+
+        case WEB_IMG_PATH :
+            // example: http://www.mydokeos.com/main/img/
+            return api_get_path(WEB_CODE_PATH).'img/';
+            break;
+
+        case SYS_PLUGIN_PATH :
+            // example: /var/www/dokeos/plugin/
+            return api_get_path(SYS_PATH).'plugin/';
+            break;
+
+        case WEB_PLUGIN_PATH :
+            // example: http://www.mydokeos.com/plugin/
+            return api_get_path(WEB_PATH).'plugin/';
+            break;
 
         case GARBAGE_PATH : //now set to be same as archive
-		case SYS_ARCHIVE_PATH :
-			// example: /var/www/dokeos/archive/
-			return api_get_path(SYS_PATH).'archive/';
-			break;
-
-		case WEB_ARCHIVE_PATH :
-			// example: http://www.mydokeos.com/archive/
-			return api_get_path(WEB_PATH).'archive/';
-			break;
-
-		case INCLUDE_PATH :
-			// Generated by main/inc/global.inc.php
-			// example: /var/www/dokeos/main/inc/
+        case SYS_ARCHIVE_PATH :
+            // example: /var/www/dokeos/archive/
+            return api_get_path(SYS_PATH).'archive/';
+            break;
+
+        case WEB_ARCHIVE_PATH :
+            // example: http://www.mydokeos.com/archive/
+            return api_get_path(WEB_PATH).'archive/';
+            break;
+
+        case INCLUDE_PATH :
+            // Generated by main/inc/global.inc.php
+            // example: /var/www/dokeos/main/inc/
             $incpath = realpath(dirname(__FILE__).'/../');
             return str_replace('\\', '/', $incpath).'/';
-			break;
-
-		case LIBRARY_PATH :
-			// example: /var/www/dokeos/main/inc/lib/
-			return api_get_path(INCLUDE_PATH).'lib/';
-			break;
-
-		case WEB_LIBRARY_PATH :
-			// example: http://www.mydokeos.com/main/inc/lib/
-			return api_get_path(WEB_CODE_PATH).'inc/lib/';
-			break;
-
-		case CONFIGURATION_PATH :
-			// example: /var/www/dokeos/main/inc/conf/
-			return api_get_path(INCLUDE_PATH).'conf/';
-			break;
-
-		default :
-			return;
-			break;
-	}
+            break;
+
+        case LIBRARY_PATH :
+            // example: /var/www/dokeos/main/inc/lib/
+            return api_get_path(INCLUDE_PATH).'lib/';
+            break;
+
+        case WEB_LIBRARY_PATH :
+            // example: http://www.mydokeos.com/main/inc/lib/
+            return api_get_path(WEB_CODE_PATH).'inc/lib/';
+            break;
+
+        case CONFIGURATION_PATH :
+            // example: /var/www/dokeos/main/inc/conf/
+            return api_get_path(INCLUDE_PATH).'conf/';
+            break;
+
+        default :
+            return;
+            break;
+    }
 }
 
 ?>