jmontoyaa 8 rokov pred
rodič
commit
da0a88492b
100 zmenil súbory, kde vykonal 2405 pridanie a 2467 odobranie
  1. 10 0
      app/Migrations/Schema/V110/Version20151101082200.php
  2. 16 8
      app/Migrations/Schema/V110/Version20151101082300.php
  3. 29 13
      app/Resources/public/css/scorm.css
  4. 11 2
      composer.json
  5. 383 4
      documentation/changelog.html
  6. 53 270
      documentation/optimization.html
  7. 1 1
      main/admin/course_add.php
  8. 9 7
      main/admin/filler.php
  9. 1 1
      main/admin/special_exports.php
  10. 1 1
      main/auth/profile.php
  11. 2 2
      main/course_info/infocours.php
  12. 2 6
      main/course_progress/index.php
  13. 1 1
      main/coursecopy/copy_course.php
  14. 1 1
      main/coursecopy/create_backup.php
  15. 1 1
      main/coursecopy/import_backup.php
  16. 5 3
      main/coursecopy/import_moodle.php
  17. 1 1
      main/create_course/add_course.php
  18. 1 1
      main/document/upload.php
  19. 520 517
      main/exercise/TestCategory.php
  20. 3 1
      main/exercise/exercise.class.php
  21. 8 2
      main/exercise/exercise_result.php
  22. 2 2
      main/exercise/overview.php
  23. 21 12
      main/exercise/result.php
  24. 2 5
      main/exercise/showinframes.php
  25. 28 38
      main/exercise/tests_category.php
  26. 3 2
      main/exercise/upload_exercise.php
  27. 1 1
      main/forum/forumfunction.inc.php
  28. 86 79
      main/gradebook/lib/fe/dataform.class.php
  29. 121 63
      main/gradebook/lib/fe/evalform.class.php
  30. BIN
      main/img/icons/64/file_upload.png
  31. 5 2
      main/img/icons/svg/file_upload.svg
  32. 2 2
      main/inc/ajax/install.ajax.php
  33. 22 10
      main/inc/ajax/lp.ajax.php
  34. 18 15
      main/inc/ajax/message.ajax.php
  35. 2 2
      main/inc/ajax/myspace.ajax.php
  36. 28 52
      main/inc/global_error_message.inc.php
  37. 3 8
      main/inc/lib/MoodleImport.php
  38. 32 30
      main/inc/lib/TicketManager.php
  39. 1 2
      main/inc/lib/add_course.lib.inc.php
  40. 11 3
      main/inc/lib/api.lib.php
  41. 7 3
      main/inc/lib/banner.lib.php
  42. 2 2
      main/inc/lib/course.lib.php
  43. 24 13
      main/inc/lib/course_home.lib.php
  44. 10 0
      main/inc/lib/diagnoser.lib.php
  45. 29 13
      main/inc/lib/document.lib.php
  46. 17 79
      main/inc/lib/formvalidator/FormValidator.class.php
  47. 4 4
      main/inc/lib/groupmanager.lib.php
  48. 55 197
      main/inc/lib/javascript/badge-studio/media/images/templates/template-2.svg
  49. 58 207
      main/inc/lib/javascript/badge-studio/media/images/templates/template-3.svg
  50. 363 366
      main/inc/lib/javascript/badge-studio/media/js/studio.js
  51. 9 66
      main/inc/lib/javascript/upload.js
  52. 45 46
      main/inc/lib/myspace.lib.php
  53. 1 1
      main/inc/lib/online.inc.php
  54. 5 7
      main/inc/lib/pdf.lib.php
  55. 21 2
      main/inc/lib/plugin.lib.php
  56. 61 56
      main/inc/lib/social.lib.php
  57. 3 2
      main/inc/lib/template.lib.php
  58. 0 33
      main/inc/lib/upload.xajax.php
  59. 1 14
      main/inc/lib/usermanager.lib.php
  60. 4 4
      main/inc/lib/webservices/WebService.class.php
  61. 5 13
      main/inc/local.inc.php
  62. 0 6
      main/install/configuration.dist.php
  63. 75 61
      main/install/index.php
  64. 52 27
      main/install/install.lib.php
  65. 1 1
      main/lang/arabic/trad4all.inc.php
  66. 1 1
      main/lang/asturian/trad4all.inc.php
  67. 2 2
      main/lang/basque/trad4all.inc.php
  68. 4 2
      main/lang/brazilian/trad4all.inc.php
  69. 1 1
      main/lang/bulgarian/trad4all.inc.php
  70. 2 2
      main/lang/catalan/trad4all.inc.php
  71. 1 1
      main/lang/croatian/trad4all.inc.php
  72. 2 2
      main/lang/dutch/trad4all.inc.php
  73. 15 3
      main/lang/english/trad4all.inc.php
  74. 1 1
      main/lang/esperanto/trad4all.inc.php
  75. 12 0
      main/lang/french/trad4all.inc.php
  76. 2 2
      main/lang/galician/trad4all.inc.php
  77. 2 2
      main/lang/german/trad4all.inc.php
  78. 2 2
      main/lang/greek/trad4all.inc.php
  79. 1 1
      main/lang/hungarian/trad4all.inc.php
  80. 1 1
      main/lang/indonesian/trad4all.inc.php
  81. 2 2
      main/lang/italian/trad4all.inc.php
  82. 2 2
      main/lang/latvian/trad4all.inc.php
  83. 1 1
      main/lang/lithuanian/trad4all.inc.php
  84. 1 1
      main/lang/macedonian/trad4all.inc.php
  85. 2 2
      main/lang/polish/trad4all.inc.php
  86. 10 11
      main/lang/portuguese/trad4all.inc.php
  87. 1 1
      main/lang/quechua_cusco/trad4all.inc.php
  88. 2 2
      main/lang/romanian/trad4all.inc.php
  89. 1 1
      main/lang/russian/trad4all.inc.php
  90. 1 1
      main/lang/simpl_chinese/trad4all.inc.php
  91. 2 2
      main/lang/slovak/trad4all.inc.php
  92. 2 2
      main/lang/slovenian/trad4all.inc.php
  93. 15 3
      main/lang/spanish/trad4all.inc.php
  94. 1 1
      main/lang/spanish_latin/trad4all.inc.php
  95. 1 1
      main/lang/swedish/trad4all.inc.php
  96. 1 1
      main/lang/thai/trad4all.inc.php
  97. 1 1
      main/lang/trad_chinese/trad4all.inc.php
  98. 1 1
      main/lang/turkish/trad4all.inc.php
  99. 8 13
      main/lp/lp_view.php
  100. 2 1
      main/session/about.php

+ 10 - 0
app/Migrations/Schema/V110/Version20151101082200.php

@@ -30,6 +30,16 @@ class Version20151101082200 extends AbstractMigrationChamilo
         $this->addSql("ALTER TABLE session MODIFY session_category_id INT NULL");
 
         $this->addSql("UPDATE session SET session_category_id = NULL WHERE session_category_id NOT IN (SELECT id FROM session_category)");
+
+        $table = $schema->getTable('session_rel_course_rel_user');
+        if ($table->hasForeignKey('FK_720167E91D79BD3')) {
+            $this->addSql("ALTER TABLE session_rel_course_rel_user DROP FOREIGN KEY FK_720167E91D79BD3");
+        }
+
+        $table = $schema->getTable('session_rel_course');
+        if ($table->hasForeignKey('FK_12D110D391D79BD3')) {
+            $this->addSql("ALTER TABLE session_rel_course DROP FOREIGN KEY FK_12D110D391D79BD3");
+        }
     }
 
     /**

+ 16 - 8
app/Migrations/Schema/V110/Version20151101082300.php

@@ -27,25 +27,33 @@ class Version20151101082300 extends AbstractMigrationChamilo
         $accessUrlRelCourse->addForeignKeyConstraint('access_url', ['access_url_id'], ['id']);
         $accessUrlRelCourse->addForeignKeyConstraint('course', ['c_id'], ['id']);
 
-        $schema->renameTable('class', 'class_item');
+        if ($schema->hasTable('class')) {
+            $schema->renameTable('class', 'class_item');
+        }
 
-        $classUser = $schema->getTable('class_user');
-        $classUser->getColumn('class_id')->setUnsigned(false);
-        $classUser->getColumn('user_id')->setUnsigned(false);
+        if ($schema->hasTable('class_user')) {
+            $classUser = $schema->getTable('class_user');
+            $classUser->getColumn('class_id')->setUnsigned(false);
+            $classUser->getColumn('user_id')->setUnsigned(false);
+        }
 
         $course = $schema->getTable('course');
         $course->getColumn('course_type_id')->setUnsigned(false);
         $course->addForeignKeyConstraint('room', ['room_id'], ['id']);
 
-        $courseRelClass = $schema->getTable('course_rel_class');
-        $courseRelClass->getColumn('class_id')->setUnsigned(false)->setType(Type::getType(Type::INTEGER));
+        if ($schema->hasTable('course_rel_class')) {
+            $courseRelClass = $schema->getTable('course_rel_class');
+            $courseRelClass->getColumn('class_id')->setUnsigned(false)->setType(Type::getType(Type::INTEGER));
+        }
 
         $courseRelUser = $schema->getTable('course_rel_user');
         $courseRelUser->addForeignKeyConstraint('course', ['c_id'], ['id']);
         $courseRelUser->addForeignKeyConstraint('user', ['user_id'], ['id']);
 
-        $courseType = $schema->getTable('course_type');
-        $courseType->getColumn('id')->setUnsigned(false);
+        if ($schema->hasTable('course_type')) {
+            $courseType = $schema->getTable('course_type');
+            $courseType->getColumn('id')->setUnsigned(false);
+        }
 
         $schema->getTable('c_announcement')->addIndex(['c_id']);
         $schema->getTable('c_announcement_attachment')->addIndex(['c_id']);

+ 29 - 13
app/Resources/public/css/scorm.css

@@ -152,18 +152,22 @@ See https://support.chamilo.org/issues/6976
 #learning_path_breadcrumb_zone .breadcrumb a:hover{
   color: #dddddd;
 }
-#view_as_link{
-  margin-right: 10px;
-}
 .total{
   width: 100%;
 }
+.view-options{
+    padding-top: 3px;
+    margin-right: 5px;
+}
 .panel-default .panel-heading .btn{
   top: -25px;
 }
 .panel-default .panel-heading .dropdown-menu{
   top: 30%;
 }
+#content-scorm .breadcrumb{
+  padding: 5px;
+}
 .scorm-heading{
   font-size: 14px;
   padding-top: 5px;
@@ -401,14 +405,25 @@ See https://support.chamilo.org/issues/6976
 }
 #lp-view-expand-button{
     border: none;
+    background: none;
+    padding: 0;
+    margin: 0;
 }
-.icon-toolbar{
-    border-radius: 100%;
-    width: 35px;
-    display: inline-block;
-    margin: 0px 5px 5px 0px;
-    color: #fff;
-    
+.movil-toolbar{
+    width: 100%;
+    height: 40px;
+    padding-top: 5px;
+}
+.btn-movil{
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+.btn-movil li{
+    display: block;
+    float: left;
+    margin-left: 5px;
+    margin-right: 5px;
 }
 .icon-toolbar .fa{
     width: 35px;
@@ -418,6 +433,7 @@ See https://support.chamilo.org/issues/6976
     border-radius: 100%;
     background-color: #34495E;
     font-size: 20px;
+    color: #FFF;
 }
 .icon-toolbar .fa:hover{
     background-color: #000;
@@ -508,10 +524,10 @@ See https://support.chamilo.org/issues/6976
     #home-course{
         display: none !important;
     }
-    .movil-toolbar{
-        text-align: center;
-    }
     .scorm-title{
         font-size: 14px;
     }
+    .movil-toolbar{
+        padding-left: 35%;
+    }
 }

+ 11 - 2
composer.json

@@ -32,12 +32,19 @@
             "main/inc/lib/hook"
         ]
     },
+    "repositories": [
+        {
+            "type": "vcs",
+            "url": "https://github.com/ywarnier/iCalcreator"
+        }
+    ],
     "require": {
         "php": ">=5.4",
         "ext-intl": "*",
         "ext-gd": "*",
         "ext-curl": "*",
         "ext-zlib": "*",
+        "ext-zip": "*",
         "ext-xml": "*",
         "ext-json": "*",
         "ext-mbstring": "*",
@@ -120,7 +127,7 @@
         "aferrandini/phpqrcode": "1.0.1",
         "mpdf/mpdf": "6.1.*",
         "barryvdh/elfinder-builds": "2.1.0.3",
-        "jbroadway/urlify": "1.0.7-stable",
+        "jbroadway/urlify": "dev-master",
         "monolog/monolog": "~1.0",
 
         "ircmaxell/password-compat": "~1.0.4",
@@ -138,7 +145,6 @@
         "media-alchemyst/media-alchemyst": "~0.5",
         "php-ffmpeg/php-ffmpeg": "0.5.1",
         "imagine/imagine": "0.6.2",
-        "essence/essence": "^3.2",
         "jeroendesloovere/vcard": "^1.2",
         "a2lix/translation-form-bundle": "~2.0",
         "knplabs/doctrine-behaviors": "~1.1",
@@ -146,6 +152,9 @@
         "theodo-evolution/session-bundle": "1.0.*",
         "jimmiw/php-time-ago": "^0.4.11",
         "phpoffice/phpword": "^0.12.1",
+        "facebook/php-sdk-v4" : "~5.0",
+        "kigkonsult/icalcreator" : "0.1.0",
+        "essence/essence": "2.6.1",
         "pclzip/pclzip": "2.8.2"
     },
     "require-dev": {

+ 383 - 4
documentation/changelog.html

@@ -77,6 +77,9 @@
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/91ab44dc37711a51094413c213bdeafc49b8303e">91ab44dc</a> - <a href="https://task.beeznest.com/issues/11321">BT#11321</a>) Add exact question type export to SCORM format</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b1734ced90bb09e0f2baaa5b53cd231395f7f856">b1734ced</a> - <a href="https://task.beeznest.com/issues/11321">BT#11321</a>) Add free question type export to SCORM format</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9b5779acf8f8fc98c5fd219b333470e96773a7c6">9b5779ac</a>) Add document size selector for teachers in Rapid PPT conversion</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b1734ced90bb09e0f2baaa5b53cd231395f7f856">b1734ced</a> - <a href="https://task.beeznest.com/issues/11321">BT#11321</a>) Add free-answer question type support to SCORM export</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/91ab44dc37711a51094413c213bdeafc49b8303e">91ab44dc</a> - <a href="https://task.beeznest.com/issues/11321">BT#11321</a>) Add exact question type support to SCORM export</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8e340ef510eb3a0724f3a5aee249c3616594ca6f">8e340ef5</a>) Add bootstrap/jquery when exporting a SCORM package, adding oral question type</li>
     </ul>
     <h4>For developers and sysadmins (by relevance)</h4>
     <ul>
@@ -108,20 +111,398 @@
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/439008d4c5868283491e5df561614eb7dbae1b51">439008d4</a> - <a href="https://support.chamilo.org/issues/8308">#8308</a>) Add mail tester interface on admin panel</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/389f1174697be95de4928dbb97cd076191d28203">389f1174</a> - <a href="https://support.chamilo.org/issues/8262">#8262</a>) Added move_uploaded_file validations when you uploading a work or correction</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4af52bf917eb7949da80fef0e972bc635c8d7a3f">4af52bf9</a>) Add sso_authentication_subclass setting</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/016a5bd34b5001cbab3ddd214e250cf892f9f6b6">016a5bd3</a> - <a href="https://task.beeznest.com/issues/11353">BT#11353</a>) By default drh_can_access_all_session_content should be false</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/eaad94645794242c74eb98ce308744f69206e0c5">eaad9464</a>) Hide "software_name" in footer if empty</li>
     </ul>
     <h3>Improvements (minor features) and debug (by date - the latest are listed first)</h3>
     <ul>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5e47b495f26a961fa288a119c677b7f1f6c8b312">5e47b495</a> - <a href="https://support.chamilo.org/issues/8389">#8389</a>) Fix navigation menu display</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/64a4e40db385338c1c100b9be6223a23e60d0e70">64a4e40d</a>) Improve session search form appearance</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5969c8982f006daca03f87a1e3f995c428eae488">5969c898</a> - <a href="https://support.chamilo.org/issues/8388">#8388</a>) Use copy of icalcreator repo to avoid the git submodule issue when packaging, because icalcreator maintainers don't care about applying a tag to their repo</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f97bcecd68c0b9235934f864c194cf73fd1ea9cd">f97bcecd</a>) Fix buttons navigation on mobile view corrected css</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/47fa15c138a1490efd551c1ab2d8688e616a2d7e">47fa15c1</a> - <a href="https://support.chamilo.org/issues/8366">#8366</a>) Fix user validation in REST services</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/cdf514ff841e7a412417163e70f6944871c720c6">cdf514ff</a>) Fix match case in Moodle import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bd703fa544e55b6326b2545f12e967ebb54510e5">bd703fa5</a>) Use Display::cleanFlashMessages() instead Session::erase('flash_messages') in Moodle import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/128f16a5ecaf2583f58fa2cfcca00b699664ce9c">128f16a5</a> - <a href="https://support.chamilo.org/issues/8394">#8394</a>) Fix Minor lang var in chamilo install</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f6a5c08b81049ebe833455974108209da04b796c">f6a5c08b</a> - <a href="https://support.chamilo.org/issues/8401">#8401</a>) Using classic gif that show progress</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e493fd5448fcf2bea3babe487e3275869550b79f">e493fd54</a>) Fix template add missing show_footer and show_header conditions</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a3af85f27658bf4f9659cd530f4830715faa8bb8">a3af85f2</a>) Rename function to sendInvitationToUser, use AddFlash</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/277763de13dd9f7ca073036ec73451097a438543">277763de</a>) Use essence 2.5.2 patched using fork</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f46eb1c74d1dac32c6595cdf659aff90c04d2134">f46eb1c7</a>) Add ticket_allow_category_edition validations</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/49438c8579b94eaf9056bebe774f157ed610872c">49438c85</a> - <a href="https://support.chamilo.org/issues/8361">#8361</a>) Add removal of directories deprecated in 1.11.x to composer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3c41e353ab9e7465ab5d789df2b83e7be8e98dea">3c41e353</a> - <a href="https://support.chamilo.org/issues/8366">#8366</a>) Remove configuration value to send messages to the Google developer console</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4d3f93bfec00e2db96ff174cc028eeeff27f9643">4d3f93bf</a>) Fix the quick course navigation menu</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d8e5d8bcfc24ac6d7193674c20fdab4e622fe94a">d8e5d8bc</a> - <a href="https://support.chamilo.org/issues/8366">#8366</a>) Fix user validation by api REST</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7ec05095495783c35ffbd1bd7c1b6a3793f694a3">7ec05095</a>) Change logo in badge designer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/14d3a58c412be550a7d5e3f93567dfb5f86f5a74">14d3a58c</a>) Fix iframe height in HotPotatoes viewer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/571678abc2af73a4cf86766cd1deab75d6e9e08f">571678ab</a>) Remove font awesome from installer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a3bdc84f1bc92cc54cd0ee5ee3e742ee923a013d">a3bdc84f</a>) Update link to report issues from Redmine to Github</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b122f061fce77310edf2a2c308ce15ce78e56acd">b122f061</a> - <a href="https://support.chamilo.org/issues/8388">#8388</a>) Decrease field lenght on version table</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/90a7000afaecf27bf3c359b2d4c034c8a4d60bdb">90a7000a</a>) Remove readme.txt (replaced with readme.md)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f1bcb49dac72efcffd967faa09e4f84d1d197ccc">f1bcb49d</a>) WIP: Simplify progress bar, remove upload.xajax.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/eb9872167a5c0d5808351b7c687e83d235909cf3">eb987216</a>) Rename class CourseCopyTestCategory</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/10de35b2cdca50b8af922508d05e8b413d7fa394">10de35b2</a>) Change TestCategory class use getCategory instead of constructor.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/deef939d379cc8ab498c5dd5fd88a06d68059e1c">deef939d</a>) Fix function, format code.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6cbf3389c797c21b3a36e4c268dce0d51ced8a00">6cbf3389</a>) Rename file</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/314cea2e6d3a38700e6c4a0150c9658db949c4bd">314cea2e</a>) Remove pclzip</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3ae340930e3eeac7349dc754093c6b8e8d24f165">3ae34093</a>) Fix variables, add AddFlash functions</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/96dfd2eadcc7bad1272f3801c05037aa36bd4d73">96dfd2ea</a> - <a href="https://support.chamilo.org/issues/8362">#8362</a>) Fix url + css paths</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2b71fe65e098c09d49d05912c476fbec9d62588d">2b71fe65</a>) Add recommendation for OPcache and APCu in Chamilo installer and system status page</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/01d2ace59fa21ecdf8d219fb86c5718663a8691d">01d2ace5</a> - <a href="https://support.chamilo.org/issues/8394">#8394</a>) Move "next" button after form in license page in install process</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5d57715344f10c2bedda4b75ad9c43291eb6f5d0">5d577153</a> - <a href="https://support.chamilo.org/issues/8388">#8388</a>) Fix installer when DB is in strict mode</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1a5cbebd3cc0226a1ba53a0d5a9ca661e15af6e2">1a5cbebd</a> - <a href="https://support.chamilo.org/issues/8390">#8390</a>) Improve Readme file from BBB plugin</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2f826cdd09268fbd436a6aee44864317c74e306d">2f826cdd</a>) Fix course settings form with plugins</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6ced718c2ccdd9f3e7d87aabb064caca9cb4db97">6ced718c</a>) Fix duplicate quiz answer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4c0be1a5be394ff9307428ef1a7952d19c3b18c3">4c0be1a5</a>) Fix split function</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1bdd29cfcbc8796096051aa602fe8cbd94f025b6">1bdd29cf</a>) Add pclzip as a vendor + fix php warning</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a9bd9b47a03724596a6290cca8cc00b41cb2d7e1">a9bd9b47</a> - <a href="https://task.beeznest.com/issues/11209">BT#11209</a>) Fix broken url images in moodle import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c76975b479b37493ac66424ec7d9b16c454e19d1">c76975b4</a>) Added spaces to hyphens validation in upload files</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c6a73493c7d928040d4cefc9da706956dfc877de">c6a73493</a> - <a href="https://task.beeznest.com/issues/11209">BT#11209</a>) Fix question files import in moodle import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/cf7438bac81e81ad890e27fe545888f2916b65c7">cf7438ba</a>) Allow upgrade from 1.10.x to 1.11.x</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/82d1bb2b8969588318c0542527114c61a210a0cd">82d1bb2b</a>) Remove query</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c1926f7f392eb37e8a32cf0535e46297f6f2a8b2">c1926f7f</a> - <a href="https://support.chamilo.org/issues/8380">#8380</a>) Remove unneeded DB change</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2d57c8d81a7bded187f3fb91f0bb75be5044789a">2d57c8d8</a> - <a href="https://task.beeznest.com/issues/11081">BT#11081</a>) Add CRUD for ticket priority, status</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6a1cac6154296edd202328f28fa202aee9696513">6a1cac61</a>) Move bower.json file, update assets</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/511db9d20691e38c5d5e9870ad9bdf96d36ce731">511db9d2</a>) Allow upgrade from 1.10.8</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/492f89bc515a20f8c04bc1cb0379a09a6d68e614">492f89bc</a> - <a href="https://support.chamilo.org/issues/8390">#8390</a>) Add info to try migrate from Chamilo LMS 1.9.x to 1.10.x</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b117ab7e68d5e7cad888f9112902976f46f12775">b117ab7e</a> - <a href="https://support.chamilo.org/issues/8390">#8390</a>) Add info to try migrate from Chamilo LMS 1.9.x to 1.10.x</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d4e85c53ebf437e539a14214c82716df4a3566f0">d4e85c53</a>) Fix Welcome to courses message that shows when you course list is empty</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0bb1625e0ab5792774c68c5142ee0ea3e4ac4e44">0bb1625e</a>) Update reference to Essence\Essence to show course videos</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ce651aa02d9f6252e853ebe1bb4c76b14e153fa6">ce651aa0</a>) Update Essence/Essence versión to 3.2</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3fa47967b8ef98675fdf5b72308a50053f7c9762">3fa47967</a> - <a href="https://task.beeznest.com/issues/11424">BT#11424</a>) Show custom logo on PDF export and emails</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1b557c43166bd7ae6118760f0e623420f2cef684">1b557c43</a> - <a href="https://task.beeznest.com/issues/11424">BT#11424</a>) Fix set custom logo for multi-url</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5bb2a84c15b6e1ad164aec32bdb00224bc8267eb">5bb2a84c</a>) Add query to optimization guide</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a10c573621d97118c83ae973cde6227c056b270f">a10c5736</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Fix custom logo file path</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0430b64579ec67e89ffe2216148b070322f4eb3e">0430b645</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Add custom logo to pdf template</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1745e281bb6e1f3624d78477c2f0a669ce2cc76f">1745e281</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Fix show the correct logo when in platform mails</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1b5758f2a9adef06aed494ede0048875493225e3">1b5758f2</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Added new template function to return the current logo</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f255d812d470c915db6ee53bf86d913e6cc40201">f255d812</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Fix custom logo file path</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6d75b7b99e2e2c4081901923058d3cde5da98908">6d75b7b9</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Add custom logo to pdf template</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c89d59afc7864252c244a2278c9cacfc9eaa537c">c89d59af</a>) Use entities when inserting a new c_quiz_answer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/173ebc8c8c6b246eaee2f07b7616f57ed8bebe20">173ebc8c</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Fix show the correct logo when in platform mails</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/43d24b2512027b6276dc67240e196d5a234d79da">43d24b25</a> - <a href="https://task.beeznest.com/issues/11486">BT#11486</a>) Added new template function to return the current logo</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7d51b428307696db81d8132736cafba026690a1b">7d51b428</a>) Set ponderation and destination for questions and answers</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7b77b375e96f259f487a3e04edc0484d2bcfc372">7b77b375</a> - <a href="https://support.chamilo.org/issues/11477">#11477</a>) Set null to post_parent_id when it is 0 on c_forum_post table</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9909ec2ad3301430ba970fc66bec05dffba95488">9909ec2a</a> - <a href="https://support.chamilo.org/issues/11477">#11477</a>) Set null to post_parent_id when it is 0 on c_forum_post table</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/080258d2a80a9f1f29d852a238f122eafa2f6c64">080258d2</a> - <a href="https://task.beeznest.com/issues/11477">BT#11477</a>) Fix migration when moving files</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/52dcdc532fbd9f3d2105795c4bcb1cf1276f2aed">52dcdc53</a> - <a href="https://task.beeznest.com/issues/11477">BT#11477</a>) Fix Migration on c_item_property</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9c8927fee8a9c0b823726d8d4611a784308d696a">9c8927fe</a> - <a href="https://task.beeznest.com/issues/11477">BT#11477</a>) Fix migration when moving files</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d2b7b40844368bcb0b249808416db16a7a77acb1">d2b7b408</a> - <a href="https://task.beeznest.com/issues/11477">BT#11477</a>) Fix Migration on c_item_property</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b13725313412ec8f540de61dd85f8b2c84f82f51">b1372531</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add comments and validations to IMS/QTI import code</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8a184a79d7450e8d9a29f22b2c64fc50d74b59ec">8a184a79</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add partial support for attached images in IMS/QTI v1.2 import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c6730139827f1a0953a48cd67e4c3def41f3993e">c6730139</a>) Set doctype html5 for system templates</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7ba2774af998befbc1c2a81a31eb292f164af846">7ba2774a</a> - <a href="https://task.beeznest.com/issues/11478">BT#11478</a>) Fix "-" if qualification doesn't exist in last work upload and added upload success msg</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/110e833e50d0a482862655b9d50154286bbf1ae8">110e833e</a>) Fix export to PDF from HTML docs</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/922cf4d46e70bbc188f9f920298005f0ce983613">922cf4d4</a> - <a href="https://task.beeznest.com/issues/11478">BT#11478</a>) Add function to prevent double ajax drag and drop upload</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2919a29e87b42e34a451faa943ee574680cc7c64">2919a29e</a>) Fix reduceded footer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/de40643fd31985d719a981c05bf46fed1e34a0a7">de40643f</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Fix IMS/QTI v2.0 import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/840f49cfbd2e656bcf1d265d51d02caaeabf56fc">840f49cf</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add support for two-levels zips for IMS/QTI v1.2 import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/77799c0025684839e1128564e63993b9fe4ae8ec">77799c00</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add support for IMS/QTIv1.2 import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/da67d2e40f1e9920e920d0fa43f7995161d0d5fc">da67d2e4</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add support for IMS/QTIv1.2 import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/46c7afa543087587d852dd098bf1f815bf0bfda9">46c7afa5</a>) Use DOMDocument to add print button for certificates</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b78b3c9df61de5951df27732496d6000ca327943">b78b3c9d</a>) Remove Student/Teacher view from places that is not in the course and it tools</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2025ff53fa690fb5480549f5f8956383ca6dbc4c">2025ff53</a> - <a href="https://support.chamilo.org/issues/8374">#8374</a>) Update Wiris doc in installation guide</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/92bb6158ad9cd679576c42e7d31826ff8908b4c8">92bb6158</a> - <a href="https://support.chamilo.org/issues/8334">#8334</a>) Fix match question type edit error</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b5a0a701e075b6e9b3b0737d037c2210072aabe8">b5a0a701</a> - <a href="https://task.beeznest.com/issues/11455">BT#11455</a>) Arrangement scrolling sidebar lessons for 1.11.x</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/068e786fe64c683253fc59492f77172fe16367ec">068e786f</a> - <a href="https://support.chamilo.org/issues/8364">#8364</a>) Fix save badge button and add button to set the badge to the form</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c1b15239ac1bac714638aa006bb3271e0b2f071f">c1b15239</a>) Set gray color to disabled skills in skill wheel</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4c4b847174f6930107ba737811282fc78601d422">4c4b8471</a>) Fix namespace, fix PHP warning</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8caa9b21ede64142d416cfeeac6ec2c9ec22d9c4">8caa9b21</a>) Use flash to show messages.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b75d2fa30ca78d37d2ea9b3ee295c28adc3c9df4">b75d2fa3</a>) Fix indexes in CLp entity</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/18718697101f111a10fa50bb3564fa8e10d2afdd">18718697</a>) Fix lp scorm export to PDF (no images)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/23ca116ab6b0ca4eed5f972e25fb975874a6cc4e">23ca116a</a>) Fix lp scorm export to PDF (no images)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/559b244bf27f8d60f636f7084c36deb56d42cbc3">559b244b</a>) Remove api_html_entity_decode and stripslashes</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1df72cd51b4fa35e9d327cd94c9705347340a643">1df72cd5</a>) Add autocapitalize = none</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d542df949bb9b8fd736c3bc1e31efef0f090c77a">d542df94</a> - <a href="https://task.beeznest.com/issues/11447">BT#11447</a>) Fix migration</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6c5445b27b688304026657751cac748ca8e71e30">6c5445b2</a> - <a href="https://task.beeznest.com/issues/11447">BT#11447</a>) Fix migration</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/503274de44aae5b72b22b4ae725f09d294259c55">503274de</a>) Fix scorm import, fix bug that replace "_" with "-" when using urlify</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6066fb86be967d94841724f0a8a2076253b6dc99">6066fb86</a>) Swap Skill Wheel colors</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6639d4f29231e2b679883873327c4593427a80ca">6639d4f2</a> - <a href="https://support.chamilo.org/issues/8370">#8370</a>) Revert "Fix Skill Wheel that showing disabled skills</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/033bfd98b3db82a8888e69cb05ba2707bc8e7c9a">033bfd98</a>) Add initial branch_sync</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/56882c943395947305b1773150fc3ec77a92c964">56882c94</a> - <a href="https://support.chamilo.org/issues/8331">#8331</a>) Fixes courses tables for migration and imports</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/31d0e637855a6e82780e68f843d3ead60f86d615">31d0e637</a> - <a href="https://support.chamilo.org/issues/8370">#8370</a>) Fix Skill Wheel that showing disabled skills</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5cc1a1b8f6314dcf2d74b2a870d7cb55a9fe7271">5cc1a1b8</a> - <a href="https://support.chamilo.org/issues/8161">#8161</a>) Improved view of groups in the social network</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/34397791f6b5adfac5bf371c2cd90be33a3de264">34397791</a> - <a href="https://support.chamilo.org/issues/8370">#8370</a>) Fix skill parent "None" that shows if a root skill already exists</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4643f1d525ff365a27fc0c232435676cbf5b17a5">4643f1d5</a>) Format code, fix message</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8c1aa2accb32dcd0a1b3068df11da7568231d92e">8c1aa2ac</a>) Fix PHP error</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b7ebb9a01cf55999399031c89b5b7a781912c29c">b7ebb9a0</a>) Remove unused code, format code</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f3093f40eb4340ece5fb644fc46213c1400ac35a">f3093f40</a>) Replace PEAR::raiseError with new Exception</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9817000323cbd5853ce5f651afa96fda89c833d7">98170003</a> - <a href="https://support.chamilo.org/issues/8369">#8369</a>) Fix langs</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3262a0fc6af5dbd22633416b77f193de3f569855">3262a0fc</a>) Fix query.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/89524d42109dbadc624fd1ceba46db1f9bdbca30">89524d42</a> - <a href="https://task.beeznest.com/issues/7685">BT#7685</a>) Open/close divs in the installer welcome source</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/79674f2ad78c0b48c902ba129492b471a92ce96b">79674f2a</a> - <a href="https://task.beeznest.com/issues/7685">BT#7685</a>) Improve position of button to go to the portal at the end of the installation process</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d17b4d4c1a73a46bc7b873f989a18aae28f537fd">d17b4d4c</a>) Add validations to avoid NOTICE messages if profile.conf.php does not exist (and as such its constants are not available)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bcea8b3046371a0c767183ad13866ecc899e01e9">bcea8b30</a> - <a href="https://task.beeznest.com/issues/7685">BT#7685</a>) Improving position button to go to the portal installed</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a41929ac42be9ed62c0aa2b30e6970f4a10b04c7">a41929ac</a> - <a href="https://support.chamilo.org/issues/8336">#8336</a>) Fix Draggable matching answer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/05994edbfb44f1e0cbbce2d2627cc876e0060780">05994edb</a> - <a href="https://support.chamilo.org/issues/8365">#8365</a>) Fix translation on BBB plugin</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6b29f9c9ff0b6bf34267cf1a6fdbdf0928e6949c">6b29f9c9</a> - <a href="https://support.chamilo.org/issues/8365">#8365</a>) Fix BBB api</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/78dc19ba40c9ba569dd53207e47de061c9b471cc">78dc19ba</a> - <a href="https://task.beeznest.com/issues/11419">BT#11419</a>) Set flash_flvPlayer as rel path</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7d175d49a0782f77add1974c176bf1fb2693b815">7d175d49</a>) Fix video plugin view</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/08a54874ed506d8a50ca7c0c161181947487eb20">08a54874</a> - <a href="https://task.beeznest.com/issues/11431">BT#11431</a>) Fix Firefox v47 error if poster="" </li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/97b9a5e10c20231763ed97adbbe14389a47a6333">97b9a5e1</a>) Rename function name</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/06145ce0d82e08e31c141ae1147da949fa630aa0">06145ce0</a>) Fix query</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f9e6bc0606d5e3bc40f23a9af871d33864c132bb">f9e6bc06</a> - <a href="https://task.beeznest.com/issues/8347">BT#8347</a>) LastName and Firstname are mandatory</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/743c97a508628c1444d8da55c82f15f5ef2fdf28">743c97a5</a>) Add plugin/ticket/ to the list of deprecated directories that should be removed on install</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1d25a7dbaa1b59655d1aabd847ba553a08cd6f75">1d25a7db</a>) Fix buttons in light courses sessions</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/98450dfe3a4ed8d64fb010c954661e5bc3d6b426">98450dfe</a> - <a href="https://support.chamilo.org/issues/8340">#8340</a>) Fix prevent multiple simultaneous login</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7d4f0ac11bdb401ed3ee59719c07e78098f668d2">7d4f0ac1</a>) Fix my_courses_view_by_session view in user_portal</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4eb24d15bbbc28772af05fbda5b00457b3d33fc3">4eb24d15</a>) Buttons setting options for course tools in two columns view</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/898c85b4edeeab127d20e1e33a9decf77cfdc7a3">898c85b4</a>) Improve Css style for select answers in matching question</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9416e1ce05a94850bc88f821f4b465d3a8fec262">9416e1ce</a>) Fix Behat tests</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f58be9b55cf991b2795055af5254b646f2b5ec4c">f58be9b5</a>) Fix social invitations</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6479e46fff36b0ff3ef810554b0b0a04c92a041a">6479e46f</a>) Add missing icons in vertical column tool course view</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8e80f98d31cfc760733791bbcba407583d9ad279">8e80f98d</a>) Fix include footer.js.tpl</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e278017851f996168eaf30069767d62e7e9a687a">e2780178</a>) Fix Behat tests</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/284ee8af12476dc39d549c2dda6b489186a69619">284ee8af</a>) Fix message when forum category is added</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f78304a26dc74375b277c466a1a1d75032ff5a3f">f78304a2</a>) Resetting icon that enables multi urls portals options</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8ee6a6449f2eb2b3dfa5f2f8a25d0748e04db02a">8ee6a644</a>) Resetting icon that enables multi urls portals options</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/373991b9b8a1a3ff6ff0642116d3e115a4d02880">373991b9</a>) Replace jQuery UI accordion with Bootstrap collapse in inforcours.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a5af227fc05de3c847a4aaf5b0d0fb162977ca90">a5af227f</a> - <a href="https://task.beeznest.com/issues/11437">BT#11437</a>) Fix cidreq breadcrumb issue</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2e9a3304ef24c2fdf409da380af6ab461b938773">2e9a3304</a> - <a href="https://support.chamilo.org/issues/8323">#8323</a>) Fix new document template missing list from learning paths</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4a6e788589343c2dc37e8227cc21e4e770f763b0">4a6e7885</a>) Remove visio code, replaced by plugins (bbb,  openmeetings)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a2fc8cecaf9d1a85912a2e9ce78a0549aea1f386">a2fc8cec</a>) Remove visio code, replaced by bbb and openmeetings</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d2912b82ba10547de713efb82282052949617a76">d2912b82</a>) Fix variables</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d9d1869ce299480b4918b2be11243baa249c3762">d9d1869c</a>) WIP ChamiloApi adding "ChamiloApi::getConfigurationValue()" function</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a3279f92173087710ae18c9e2933b2c01b92a832">a3279f92</a>) Add ChamiloApi class to properly start rewrite of api.lib.php as a static class</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/966e07fce090481eb78e6c5d838667f744379728">966e07fc</a>) Email_canonical not unique</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d4f7a9cda6a67d36ec1dd8fc5817611468a28990">d4f7a9cd</a> - <a href="https://support.chamilo.org/issues/8308">#8308</a>) Update e-mail tester script to only show if the test directory is there (representative of a development platform or platform managed by a developer). Add documentation</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/05835c5861c7e631639ab55ea644074a62a8c601">05835c58</a> - <a href="https://support.chamilo.org/issues/8302">#8302</a>) Use field display text instead of internal value in add users to course and session</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bac9946d813a5b7f233e404994affc6fc9d2c078">bac9946d</a>) Fixing behat context</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/46a8e9656c62f2951cc06c23f8ad21fe4a807b81">46a8e965</a>) Setting button view student lessons</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7b6d08e9cc2c66c9577f699c310a0c62384699a3">7b6d08e9</a> - <a href="https://support.chamilo.org/issues/8360">#8360</a>) Under error show header and footer in a final item of scorm</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2678b3c74f66726ba586b1f44d240d501b10e52e">2678b3c7</a>) Style setting for attachments in new mail message</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a6ef2d55ab3c2ac33d66cc2344ae88af709caed3">a6ef2d55</a>) Height adjusting for AJAX multi selector</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/997fa37c4acbbc3c85e67ef0e95fc22ea59d6f65">997fa37c</a>) Fix conflict between ExtraField model and ExtraField entity</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e9ee045e68dccdd6fc4e223347e5cf2955b771ff">e9ee045e</a>) Revert "Fix ExtraField call in session manager"</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/711ddf5d3f19125f8704140fbd2bd9169c523956">711ddf5d</a>) Fix ExtraField call in session manager</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5fab733a5f830b2f5f6c6552c1b483b7440209a1">5fab733a</a>) Height adjusting for input search results in exercises table</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8853e37c493920baeddc11767d3b29d8d326cf3d">8853e37c</a>) Fix warning and notice and hide skill tag filter if there is no tags configured</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/17f05eb83b8eb7fab479d4969c9398e22035b5e2">17f05eb8</a>) Add missing footer.js.tpl</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a14c022bfe7e63f68b19e71e168c603f7ea32d50">a14c022b</a>) Remove sniff.tpl</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a15e7bbb387f94a98448b64a3cda6da9ba6ba88a">a15e7bbb</a>) Add oembed</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8ca97a910cbf7290381a492938ba6f1b7485b639">8ca97a91</a>) Update assets</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ef23e1d28fb5ec94ae3211e8bc83c98f5ca5aaaa">ef23e1d2</a>) Format code, adding api_get_cidreq + fix documentation</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c947d71e8f19555f738c9ee5b9574922869d8778">c947d71e</a>) Remove require_once 'scorm.class.php';</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/56f84e482abed72167b7b91dfe22c2668f467be7">56f84e48</a>) Use AddFlash</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/52e8df794d51af0cd097bb9ec9e46d4564760867">52e8df79</a>) Fix form + format code</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6572c53a028cc5cb43cda32d099a862758be219d">6572c53a</a>) Add message.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bba57f8888e8bb6a89b51e288d9e18b66bcfeae6">bba57f88</a>) Fix function names in api.lib.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/208bcb14a14c6077a2d65a3b9573d2a7281fa999">208bcb14</a>) Remove Session::read('message'); use Display::addFlash, remove api_set_failure/api_get_failure</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/917ab67fdbd2df3ffd9411cd6b2900f5659aff6c">917ab67f</a>) Remove Session::read('message'); use Display::addFlash</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b5158a117b9127c26707f63953a3c49faa4730bf">b5158a11</a>) Fix api_not_allowed UI</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/fad270e90eadd8f2498b1c6e10449642ab1c2067">fad270e9</a>) Fix namespaces</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2a47c02329fb8dee04a6b6425c9ee7601c6f32e2">2a47c023</a>) Add intval + Security::remove_XSS</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5562832a4cc600f7c8280daab008ab625cd2f9a5">5562832a</a>) Update BBB plugin with sedra changes</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e1a3c19d8447cbc2a986ee3647d13a2651802f9c">e1a3c19d</a>) Change version to support 5.4</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9b5779acf8f8fc98c5fd219b333470e96773a7c6">9b5779ac</a>) Add document size selector for teachers in Rapid PPT conversion</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3a3952389c7a1e70cd613513f698cec07292652f">3a395238</a>) Use function to get all document conversion sizes (used in PPT conversion)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6c022643afbcfa94d40fc6606b2aba80a6a73aeb">6c022643</a>) Add function to get all document conversion sizes (used in PPT conversion)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bf463ee43cb768bab51df6125918c317798be6b5">bf463ee4</a>) Add README to the webservices folder</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1ec71b08bb79ff7d85372557cdfd4fe22c17af7e">1ec71b08</a> - <a href="https://support.chamilo.org/issues/8211">#8211</a>) Fix missing statement getting the accumulate_scorm_time setting from the c_lp table</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/09f5f59cb2c28157fe556025a84f3f9afb2df950">09f5f59c</a>) Add format management to remote Rapid PPT Converter</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9fce56b5cddf14647cd6c389fc1442dc1836e55a">9fce56b5</a>) Add format options to Rapid PPT Converter</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/99b68ac1d9ec5f3b790589b8194a91291f18252b">99b68ac1</a>) Show special courses on top in user_portal.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/735dac1474066a61844f85e1ff885018b702c5ab">735dac14</a>) Remove unnecesary URL param</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3619ac89169a2d81fb42e9cbe6c409b5e235f34a">3619ac89</a>) Add zip as requirement needed by phpexcel export</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6dc4840f70c121d1122e46fbf0635bfc534399f1">6dc4840f</a>) Installing getid3 with composer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f9886fbb8d9de0118c62a9750f6cae617d07ff0c">f9886fbb</a>) Remove  iCalcreator.class.php add lib with composer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ac75f9ac061e5a9a751ce831f57577fa2262104f">ac75f9ac</a>) Format code + fix PHP warning</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5a2d3258ab27f298a2be0f8c6bf586acb459ad30">5a2d3258</a>) Allow X-Frame-Options: SAMEORIGIN</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4bda1d008d6d6682fd6f433f958cdc2cd097f57e">4bda1d00</a> - <a href="https://task.beeznest.com/issues/11421">BT#11421</a>) Fix bug when filtering courses</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c719802364d4d7b51dfb1a77828c3c8390f4abdf">c7198023</a> - <a href="https://support.chamilo.org/issues/8161">#8161</a>) Added visual tweaks to social groups</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a9f7a621456f07b36bfc3a70616289572c4ab9ad">a9f7a621</a> - <a href="https://support.chamilo.org/issues/8349">#8349</a>) Fix add Group announcement that cannot add users</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f9297f1c6aa3aea0328ff5445cabb3af34eb4434">f9297f1c</a> - <a href="https://support.chamilo.org/issues/8331">#8331</a>) Add warning message for new directories name when upgrading</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6688c098ddf7a90ebc80c4379217bd0e5a6c6b53">6688c098</a>) Fix post visualization in forum threads</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/35ae690eabd1236fdf31b4f548f88ff13855ba73">35ae690e</a>) Fix issue preventing user image upload when initial image is empty - v2</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/92eb58bbebbed43f1080d4b1b155c2f97f95bd2b">92eb58bb</a> - <a href="https://support.chamilo.org/issues/8331">#8331</a>) Remove newscorm directory for migration</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2d2df81c398a4f361b693d5860faae452dd5856e">2d2df81c</a> - <a href="https://support.chamilo.org/issues/8331">#8331</a>) Fix migration on c_item_property</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/dc756b39384550336042af4d012ec01a31154465">dc756b39</a> - <a href="https://support.chamilo.org/issues/8331">#8331</a>) Fix migration process</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/71592f15266984cd22d1ed012c01e0ddabf640b4">71592f15</a> - <a href="https://support.chamilo.org/issues/8331">#8331</a>) Fix migration on c_item_property</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/922975a7b7b4ee2396614a7e02fc429072efc9eb">922975a7</a>) Fix icon</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/064c945c9fb01326fc350095f92a1b8f17d1fd69">064c945c</a>) Add confirmation, bigger icons, fix warning</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/633a16118eb2d0266f050ffa52602c87038d8dc6">633a1611</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Fixing time spent on LMS better integration</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ae43d264fb4a01fbe76ebe4dfdd447a998af9ecc">ae43d264</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Fixing time spent on LMS better integration</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bb8c4bc57efbfbde92b2197e7b3c5b13c182c095">bb8c4bc5</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Fixing time spent on LMS to set it from the begining and not only last 7 days</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/99d66c55dfb0feacc190983b4acccdd7a2957d6f">99d66c55</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Fixing time spent on LMS to set it from the begining and not only last 7 days</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b3ba06305870508778ff3b07d7149d782050a2d6">b3ba0630</a>) WIP vchamilo updates</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d17a0c3aca350897e23d6deb33a51a3e891429ae">d17a0c3a</a>) Change params order returnFontAwesomeIcon</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3906a32d4f10ef4e671eda4f9b5fb8612488d06d">3906a32d</a>) Replace variable name</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8348130888b77aada5e5db6772821a528fb0533a">83481308</a> - <a href="https://support.chamilo.org/issues/8348">#8348</a>) Arrangement show header and footer to show iframe lessons</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/dd4cc44c350952e720bc7c73a138dea6f6d08573">dd4cc44c</a>) Email arrangement condition tester</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/aaee4e834731d23bbca805244767da7e9d6d8b43">aaee4e83</a>) Fix issue preventing user image upload when initial image is empty</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/734da3a120091261d68d5e907119eb5313e1f7ef">734da3a1</a>) Improved design invitations from friends on social network</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9595138f8396d983d7db42b38abc3178cc558d73">9595138f</a>) Fix aspect ratio for user image</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8047eb2440a951ac98a95cc5533b5bb0ad9bdd88">8047eb24</a> - <a href="https://support.chamilo.org/issues/8331">#8331</a>) Fix restore learnpath with item type = dokeos_chapter</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/357055060ccb830815d60be9936a2e2352dc59ea">35705506</a> - <a href="https://support.chamilo.org/issues/8350">#8350</a>) Fix accept friend invitation in shared profile</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0c0bb08608a11d98af1280cc3e4f8b318a921f91">0c0bb086</a>) Fix migrations from 1.9 to 1.11</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/cc2494593ed10902c9760b219fbcbba4f7e57f07">cc249459</a>) Fix class extends</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/77e726cb3d451d377ed870bc1b4800088b6e1fae">77e726cb</a>) Add V110 migrations</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/af7f65b1710a2f362a38aa132e275fff9bbf5a6e">af7f65b1</a>) Fix table creation.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5809e1bd5e344e36b42974024fcdebde741830a8">5809e1bd</a>) Fix clean_up_files_in_zip function</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/415ca7c7aa9e18cc5b1f0ea4c9d73583bc5fb926">415ca7c7</a>) Blocking app/console</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/78ff5e010d6d0891e7fb8f8ecdc1cf2acc764268">78ff5e01</a>) Add 1.9.x support in the upgrade process</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/18835c4fa32372a1eb0b7e81c6555a402cd44100">18835c4f</a>) Fix issue preventing the ratio to be set on the image cropper (caused by commit af164930aa)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1fc7546107e4d1dd9a8e38644678484bd74aedbe">1fc75461</a>) Save c_student_publication with session = null instead of session = 0</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8b4da8e73a0a9915b473f8f4ad6571e2ce3eb1ec">8b4da8e7</a>) Change of appearance of widget user invitations pending</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/554c8061c4f26decc5fc773ed5fa6a478f6ee8a7">554c8061</a>) Fix issue with production files path and friends invitations image path in shared profile</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8625503f7b181aded849b87d7657010714bc438a">8625503f</a> - <a href="https://task.beeznest.com/issues/11356">BT#11356</a>) Fix save forum threads when the forum is moderated</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/52ef413e2719be2da521beb83a476d91468ef5e7">52ef413e</a>) Add database::escape_string, Security::remove_XSS</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0df4479ece6e50a38381f47058973e1524adc2f9">0df4479e</a> - <a href="https://support.chamilo.org/issues/8346">#8346</a>) Fix issue #8346</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9d9afda55f606e272d592509a888d1596aac5e80">9d9afda5</a> - <a href="https://support.chamilo.org/issues/8346">#8346</a>) Fix table id</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1fe2caca580b4a48f17902dc2887107900fb793d">1fe2caca</a> - <a href="https://support.chamilo.org/issues/8337">#8337</a>) Fix issue #8337 wars</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/14d08db0664610d83d8b3e01cf7237e78feb5af2">14d08db0</a>) Recover Version111.php after removed in 1.10.x merge</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3fcd83e118e40a0e5d4bb914fec937f50e0b9ffe">3fcd83e1</a>) Improve the LP action menu</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/23fb113481501862aef84697386c3c000dd57905">23fb1134</a>) Avoid repeat code to expand/contract sidebar on documents tool</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/91e7907dd334b8cb3151966a557cf7d671b13968">91e7907d</a>) Add Claroline changelog + remove dead links to old D0keos wiki (now private or disappeared)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c0e8ff207b0f29799b0b8687781bf9c54e99ecbe">c0e8ff20</a> - <a href="https://task.beeznest.com/issues/11395">BT#11395</a>) Fix get document list in tree</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4b5689eae06b1082554844c30e08d567246d0d1c">4b5689ea</a> - <a href="https://task.beeznest.com/issues/11395">BT#11395</a>) Add association mapping between Session and CStudentPublication</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/63604f24a59c9c104bf433655777387c2d29df7c">63604f24</a>) Add Claroline changelog + remove dead links to old D0keos wiki (now private or disappeared)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b3b57d78c87cf061cd6749d636b6f4fea9dd3225">b3b57d78</a>) Fix visibility</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/643291a8452fef350361af6e683b5a49a96e851a">643291a8</a>) Fix condition</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e56d74df7bf4762a60c87b0d3d22bc2bf61f8179">e56d74df</a>) Fix password validation + adding lib with bower</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/9fcaeebfea8eba396ebdfc05a552789d9bdab8ff">9fcaeebf</a> - <a href="https://support.chamilo.org/issues/8330">#8330</a>) Add alt attribute to hot course icons</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/029e45d075710cf639bcb396685a48bc234fdd2c">029e45d0</a>) Added New Loader bar to import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0bef78f078d159c2903450331c5e2ee574126b19">0bef78f0</a>) Update css well install</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7c2af3bcfbae43c05e12fd27282fffc5d8d31837">7c2af3bc</a> - <a href="https://task.beeznest.com/issues/11209">BT#11209</a>) Fix bug in True/false questions and add support to Match Questions</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bfc6de7f50dbca8cb082179a773d38b2000ae446">bfc6de7f</a>) Chamilo design update installer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/331d04acee3b10b2d952cf05054035b851274932">331d04ac</a>) Fix spacing between items of FormValidator group</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/04875d964cc7d571410a0e24f2c2d8b540f2ba86">04875d96</a>) Deleted img install chamilo.gif</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ec843c12248fad15d36b6cb74dc26b6bf0a9e2e4">ec843c12</a>) Add css style for install page</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7eba6cf80e78916ad94616a9f02b6daf2a83589e">7eba6cf8</a>) Add css style for install page</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4521e20f835c69dafb2c3eefb383ec6b008dab98">4521e20f</a> - <a href="https://support.chamilo.org/issues/8339">#8339</a>) Fix certificate generation</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3a977c9211806e596b557003801d5f9461ee6617">3a977c92</a> - <a href="https://support.chamilo.org/issues/8339">#8339</a>) Fix gradebook result graphics</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b2a19350f90b39551cc535abb1160d1ef9661473">b2a19350</a> - <a href="https://support.chamilo.org/issues/8339">#8339</a>) Improve gradebook results table</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/307f729c994ff8fa58a0e973d2086780ab81d9e2">307f729c</a> - <a href="https://support.chamilo.org/issues/8337">#8337</a>) Fix little issue on install</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c06f0b775c5873466a1827d007a1b6df87b4b402">c06f0b77</a> - <a href="https://task.beeznest.com/issues/11209">BT#11209</a>) Rename MoodleImport.lib.php to MoodleImport.class.php </li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d0e66faeb727512481633946942275b5abc5889f">d0e66fae</a> - <a href="https://support.chamilo.org/issues/8113">#8113</a>) Fix import course validating foreign keys</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3562bbc2ad81c266a18e2d3d56ec130378d51244">3562bbc2</a> - <a href="https://support.chamilo.org/issues/8302">#8302</a>) Added User Tag Filter to subscribe users to sessions</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a1b4247b65dd8e50e0267ed79953e61c26c6e285">a1b4247b</a> - <a href="https://support.chamilo.org/issues/8319">#8319</a>) Removed allow_browser_sniffer settings from platform</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5cd232cf00c6e0c1a57d58abf4a5c2d1e48885df">5cd232cf</a>) Fix installer's allow-registration option: 'approval' option was never saved to database (2)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4151d1fa16e34d993afad6a8ae5e09c894c7275b">4151d1fa</a>) Fix installer's allow-registration option: 'approval' option was never saved to database</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5cd9e77f8eea8167a062788f202dff85fa03fc67">5cd9e77f</a> - <a href="https://support.chamilo.org/issues/8262">#8262</a>) Added Display::addFlash() to move_uploaded_files - Resf #8262</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/43d5f6735a8cee0add188f31f53d297de8b335ed">43d5f673</a> - <a href="https://support.chamilo.org/issues/8113">#8113</a>) Improve code on restore documents</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4abc73703bccbb12e6d42db0cc4b8cf3dda675e5">4abc7370</a> - <a href="https://support.chamilo.org/issues/8134">#8134</a>) Fix creating course with template by user teacher</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d457fef59561cf83afeba1b646786573718c547a">d457fef5</a> - <a href="https://support.chamilo.org/issues/8134">#8134</a>) Fix Select Ajax element</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/345c520b1c348b63b54d9dcfc721c1c5fe0f4cd3">345c520b</a> - <a href="https://support.chamilo.org/issues/8325">#8325</a>) Fix advance parameters on thread response that shows empty</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/000c17d2122c94c7fcf6957f40bebe1551d0fc42">000c17d2</a> - <a href="https://support.chamilo.org/issues/8278">#8278</a>) Fix DELETE queries on migrations</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1f3258caa80e2aabe818cd929b78633c26ba6699">1f3258ca</a> - <a href="https://support.chamilo.org/issues/8325">#8325</a>) Fix advance parameters on thread response that shows empty</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2647ed66d21a7c6f47a7136b2d0b351059aaf65e">2647ed66</a> - <a href="https://task.beeznest.com/issues/11032">BT#11032</a>) Fix session list on teachers time report by session</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7cec8d8c7ba6f917f8c9c3aab4d9fa274fedb959">7cec8d8c</a> - <a href="https://task.beeznest.com/issues/11032">BT#11032</a>) Fix session list on teachers time report by session</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/611ea167c77e186b143103b5e882790823bfa9c2">611ea167</a>) Fixing composer.json</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/72b7a6146ef9b3d06f22c862a96bd09118c702a9">72b7a614</a>) Fix Symfony requirement</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/72c94279018ec565abcb972aa37183307191e33b">72c94279</a>) Fixing ambiguous id in query</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e335cf50896ea667b1dba1657ee9e4f68b9c8515">e335cf50</a>) Fixing ambiguous id in query</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e453dd09a0f95f31669b60e6f03b51698926e582">e453dd09</a>) Default value empty</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f0eaac4247696073a763446db17c7a75aeb57e1f">f0eaac42</a>) Making function depending on the id of the element</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/af164930aa70b1309cda606f59a21f59cd87d528">af164930</a>) Move crop image into formvalidator and the file class to avoid doubles</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3d74cee8e3c7ef2590ed4c81f35b859dca10a71f">3d74cee8</a>) Update assets</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/57bfc7788ccb39c71d2dfd9866d5209d397dc98e">57bfc778</a>) Remove symfony + sonata not available in 1.11.x</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f681741abc7042e0e8fc7d166d338e46d91769f1">f681741a</a> - <a href="https://support.chamilo.org/issues/8326">#8326</a>) Fix import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2d3d7847809bbb403b6a06d28e4141f75c1d642a">2d3d7847</a> - <a href="https://support.chamilo.org/issues/8200">#8200</a>) Remove unused v111 migration, update changes from 1.11.x</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/994f4736d8c160c965e5bc7344c16415023fec65">994f4736</a>) Remove unused files</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3260461db083e48ecee808a1e992f9538bab1578">3260461d</a>) Update documentation</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a8470af3d0fecd187e6c78de490284582743553e">a8470af3</a>) Update version numbers in install scripts</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/65c9464ef58a23db0ec22ef3a48d7353d4cfd097">65c9464e</a> - <a href="https://support.chamilo.org/issues/8211">#8211</a>) Fix cumulative_scorm_time in individual LPs</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ca91fc063a45fd8fa5fc64c332b565bf30a08754">ca91fc06</a>) WIP: Implementation of a removeSettingCurrent() method for the down() calls in migrations</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/80ef92201d062c4ea37abdbbc795ebd12cb57935">80ef9220</a>) Added Support to Fill in Blanks and Free_Answer (match && ddmatch still in working) in Moodle import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d32b819ba8036c34b4b41b9ae13e5eb8ad56611b">d32b819b</a> - <a href="https://support.chamilo.org/issues/8256">#8256</a>) New structure to display hand cursor in IE</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8aa5aa12855a9f1eae4c15ffcfcaf672d4bbbb6a">8aa5aa12</a>) Fix work list all icons</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c9f000a5a7b5b77d4f08adae1c89ab0e08d60d2c">c9f000a5</a>) Add icons save pack in work tool</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4f0bcda3b9caaf00df8fdc02b042e90de2bab2cf">4f0bcda3</a> - <a href="https://support.chamilo.org/issues/8324">#8324</a>) Fix course creationg in other language</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f0f83d3919ea8741ca3e32a6246566f5dea7bc3e">f0f83d39</a>) Improved design structure in the task tool</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/07b950b05f65129f06284b47539c45c51b5a606b">07b950b0</a>) Use ChamiloSession</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c1294ca5d7245465ad1934fdb49f7b307f7d104e">c1294ca5</a>) Fix toolbarAction calls</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2c1dfe2ce7b7ce07afa2b8b22aa31ee2cbf595ca">2c1dfe2c</a>) Use ChamiloSession</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0d7ff4b6e733360f085d73c5dce55540a9ce2127">0d7ff4b6</a>) Fix classes</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1cddb24a79b4177fd77956775ef60e780221e481">1cddb24a</a>) Use AddFlash function</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3d793f4fa30055a96aceb9aba1e6c0f412389b9a">3d793f4f</a>) Remove ClassManager</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5b8f725faa937ead2d8d4ff8a1bb50135fbd5449">5b8f725f</a>) Inserting quiz and questions import support</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/786a83762d950b39fdc378ec4a633bb2d7b9ae60">786a8376</a> - <a href="https://task.beeznest.com/issues/11384">BT#11384</a>) Fix condition</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c304e02331414adc0bb974f22646fe7e13cb77b1">c304e023</a>) Factorize code to reduce wsConvertPpt() complexity as suggested by #scrutinizer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8697dc2c03b41c2b80cd7d448fadff1ddc3772e8">8697dc2c</a>) Factorize fillCourse() static method to reduce create_course() complexity as suggested by #scrutinizer</li>
+
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1b3f9b757e28b63198fe03672b93b3ee0d21ec92">1b3f9b75</a>) Add icon in menu bar items</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2ebca934a0ce3a32e7fad92c7daa8105e38496b5">2ebca934</a> - <a href="https://task.beeznest.com/issues/11358">BT#11358</a>) Fix import/export course progress</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bfcb9885883057d0dce9b7117f94e6e145dbac6c">bfcb9885</a>) Fix text caption figure</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0ade1298a05d2bb6160e3c2e96cfda047e975516">0ade1298</a>) Arrangement input search style in width auto for the skills</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/af0b56322befdb876f10cf11f471d46ba1608f99">af0b5632</a>) Add clock icon in size 22, 32 and 48px</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a41db930e9152e4d95f7965a686ccc24aab55d25">a41db930</a>) Add clock icon in size 22, 32 and 48px</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e88f00982149d8a68511f40ce78e4901e2fa2de5">e88f0098</a>) New function expand and collapse in edit document in SCORM</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f6ca3f3f20f14200e314d447688eebdf2e21749b">f6ca3f3f</a>) New function expand and collapse in create document in SCORM</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/eea4ccb9dd9ff44bf960f13ddf333217c595d0a3">eea4ccb9</a>) Fix expand document edit</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b6be4224a717f8f140dfb7f0b21be7f470b0126c">b6be4224</a>) Add temporary patch to make certificates media publicly accessible</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0b66f73f96705bcbdaa209774fcfcd8b47e0e841">0b66f73f</a>) Fix toolbar course navigation</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/947de49b91a979aad0323a4c38d8a0399bae6595">947de49b</a> - <a href="https://task.beeznest.com/issues/11374">BT#11374</a>) Fix panel hide template scroll</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7449aef2bd2d1a835aeb1fdf9a1a430ada91d708">7449aef2</a> - <a href="https://task.beeznest.com/issues/11032">BT#11032</a>) Restoring access to teacher time report for admin and session's admin ref BT#11032</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6b02540fa5823a921b04e54c7f6c710ef106f3ec">6b02540f</a> - <a href="https://task.beeznest.com/issues/11040">BT#11040</a>) Fix issue returning the same session multiple times in SessionManager::get_sessions_list()</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8f890f88870190fe26803109fa38eb9ad9257e17">8f890f88</a> - <a href="https://task.beeznest.com/issues/11040">BT#11040</a>) Fix issue returning the same session multiple times in SessionManager::get_sessions_list()</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2184b8ab0a3d1787ba2a20d6811eef63462dfa3e">2184b8ab</a> - <a href="https://task.beeznest.com/issues/11032">BT#11032</a>) Allow session admin and session coach to teachers time report</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/dec94a645f6b94f5e6c1e2f97c6d428ec7db67d8">dec94a64</a> - <a href="https://task.beeznest.com/issues/11373">BT#11373</a>) Fix session admin can't see the session list</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ef3ba79e44c034f089262b4a07c82c82163feab6">ef3ba79e</a> - <a href="https://support.chamilo.org/issues/8264">#8264</a>) Update Facebook auth with new SDK</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3da72ceb0ba8b04bc3b8da6ff56a9ea7c2197fc6">3da72ceb</a> - <a href="https://support.chamilo.org/issues/8264">#8264</a>) Delete old Facebook SDK + Use new Facebook SDK with composer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/87f115b2bc915a898d3c9b29ea2f4a841cfbd59c">87f115b2</a> - <a href="https://task.beeznest.com/issues/11369">BT#11369</a>) Fix CSV import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7c993b1ba5a52339cf64abb875df44c540706e04">7c993b1b</a>) Apply small format corrections following Chamilo code style.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ce7f036ff4b5ab00f327b52496101a39ef141359">ce7f036f</a> - <a href="https://support.chamilo.org/issues/8200">#8200</a>) Fix Add index to accelerate query</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d1c538749b0ea07b5eef37021a4da23ef5631c48">d1c53874</a> - <a href="https://task.beeznest.com/issues/11321">BT#11321</a>) Hide oral expression in export to scorm</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/56096966b168ba5d6c25a86e0e637df9703ccbdf">56096966</a> - <a href="https://support.chamilo.org/issues/8318">#8318</a>) Added Tag filter to skill management</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7723bab926731d09658b3c33cee1597a8c7a083f">7723bab9</a> - <a href="https://support.chamilo.org/issues/8222">#8222</a>) Improve view of share buttons plugin</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b5442448300251bd0f5cc16306b5e44f76f24326">b5442448</a> - <a href="https://support.chamilo.org/issues/8222">#8222</a>) Show plugin block on admin page only when plugins are assigned to this region</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0106766c7021f22570c433ed34bdb92dda9be765">0106766c</a>) Add webservices to add or remove visibility rules between users and courses in the courses catalogue</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/43ad39178e155ecfa066d85bcd92c5496096a36d">43ad3917</a>) Add backend feature to let choose which users can see or not see which courses in the courses catalogue</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0b3d9271c8a9f4766d7eed8b991daecaca40a2fc">0b3d9271</a>) Fix global-modal por class-ajax links</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a8ffce3227f1ee49f95f60276c59ce488a35c9a5">a8ffce32</a>) Fix layout admin</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/439008d4c5868283491e5df561614eb7dbae1b51">439008d4</a> - <a href="https://support.chamilo.org/issues/8308">#8308</a>) Allow test mail configuration</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5f6730f5e60d956e8f95c44a585071dca3403b85">5f6730f5</a> - <a href="https://task.beeznest.com/issues/11032">BT#11032</a>) Add link to teachers time by session report to myspace/session.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a60d60e3ac8d09199d1367abb5ccfdd64dbe38e0">a60d60e3</a>) Add tools icons in 32px</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4d3a97466cfb017a58d2a30425f884556bb87033">4d3a9746</a> - <a href="https://task.beeznest.com/issues/11032">BT#11032</a>) Add link to teachers time by session report to myspace/session.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/67f0338c5f81ffeb31ff5e0a2d097616678e1657">67f0338c</a> - <a href="https://task.beeznest.com/issues/7589">BT#7589</a>) Fix icons page admin refs-BT#7589</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b7cf7d48db9538eb0c6a9b6e3b548d8eee318eb5">b7cf7d48</a>) Fix icons admin page</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f75965f5a9d3b5a620e1278a30abc60dbf1d3537">f75965f5</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Improve works in session report</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/68aa90f328c25153a7a828079caf8ebd05f8d8da">68aa90f3</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Remove reference to allow_browser_sniffer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f51540021a99ff427b13b08bdab4ac41de29fb28">f5154002</a>) Fix session catalog refs</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6eef57f939d5aac72747a07f54d519c92df8eb6b">6eef57f9</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Fix display_categories_on_homepage</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3df621e14693c5edc64337236932c4b836ec12a5">3df621e1</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Improve works in session report</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f2bf214175308a627d420561ed4f114e9ef1e60c">f2bf2141</a> - <a href="https://support.chamilo.org/issues/8318">#8318</a>) Add support for skills tags</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/660a3bffb44872ed2ab3f9951337d82202a271e4">660a3bff</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Remove reference to allow_browser_sniffer</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5d84c533d273d4353de000c7fa1a1bb98b7b3bc5">5d84c533</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Fix display_categories_on_homepage</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5c30c2f9e2b0509e99acef66e11a44897f956199">5c30c2f9</a>) Remove custom messages</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/71ef6efb49e65c26217f5444d718c12809ab061b">71ef6efb</a>) Fix question exports</li>
+
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a2c9fca6540125f5686f3a1be6135ae8100b60bf">a2c9fca6</a> - <a href="https://support.chamilo.org/issues/8211">#8211</a>) Add SCORM time to lp</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8be9d734b54bca53fed40f436b681476cab0df85">8be9d734</a> - <a href="https://task.beeznest.com/issues/11358">BT#11358</a>) Avoid edit Thematic advanced via ajax modal</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d3464efa703abb53538e4857cb9554e7e428d9ff">d3464efa</a>) Fix get_logged_user_course_html</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0ca7d93ecdf81eeef0479c75c1fa31eb3d01d980">0ca7d93e</a> - <a href="https://task.beeznest.com/issues/11360">BT#11360</a>) Fix "update legal terms" feature</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/db6d382829ad992d6af26f1b97e50f8feebd6a4d">db6d3828</a> - <a href="https://support.chamilo.org/issues/8161">#8161</a>) Fix tpl issues in social groups views</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/740b5dda526968ab46b9a8c9016426cca9b3f2c2">740b5dda</a> - <a href="https://task.beeznest.com/issues/11359">BT#11359</a>) Allow platform admin to edit a course agenda event</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2c14b74acd7fc0cf4f7104d6f6f8420e2405de95">2c14b74a</a> - <a href="https://task.beeznest.com/issues/11360">BT#11360</a>) Fix "update legal terms" feature</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/814da60ba8db12ef6191cc3236a3b4b5abf3a999">814da60b</a> - <a href="https://task.beeznest.com/issues/11358">BT#11358</a>) Fix save thematic advance - BT#11358</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/07d75682fa823c4228d57f0ef7340e70903130e3">07d75682</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Add link to Works Report in session on mySpace/session.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/50e4f534f696795389a876990836214b962f3b9b">50e4f534</a>) Fix query - replace course_code for c_id</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5da5f7270aa9c39ca2aba5e14bf6f5a8d20ff622">5da5f727</a>) Add course list if drh has courses assigned</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f6bb4e1c4e74148e75f1abe553fd96b12652d887">f6bb4e1c</a>) Fix css of tools menu shortcuts icons</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2ed226496f7539cbb3fc5064d6090f4199817bfa">2ed22649</a>) Add icons tool menu shortcuts</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4ed6c109571027cec155f8bd2311da702fa87691">4ed6c109</a>) Fix chat tools</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/389f1174697be95de4928dbb97cd076191d28203">389f1174</a> - <a href="https://support.chamilo.org/issues/8262">#8262</a>) Added move_uploaded_file validations when one uploads a work or correction</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e24ceaedd15f1ac6dc1815e96b92207dc9eb3627">e24ceaed</a>) Fix Individual Work correction ajax loader</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/74153108f51bde23aef448ca21239243aa97f948">74153108</a>) Fix configuration saving buttons when scrolling</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2e7d58b3ac99d26bc63f2fbef66aac365613dfb5">2e7d58b3</a>) Only clean filename, not all in path clean_up_files_in_zip</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/93536e452d1f1c2dfc31e0001abd23a90c305cd3">93536e45</a>) Added Behat Test to Teachers time reports</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ce0b9d2b3aebda643decbf2f920d97f8b20dafff">ce0b9d2b</a>) Fix Teacher report time</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/708d28bf8c64105c3327a44f41a0654cb0d70da5">708d28bf</a>) Fix a notice when you add a question type for the first time in a exercise</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6a3a53700d91fdaeb327ff57b95165dd3de160eb">6a3a5370</a> - <a href="https://support.chamilo.org/issues/8295">#8295</a>) Fix HTML QuickForm compare fields parent compatibility function and HTML Markup in Grade models</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f2af24b9195528ed3ede5d852de940b5666864a7">f2af24b9</a>) Fix SCORM audio widget width and error float part 2</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/77d28be94d9b7e9ae10f4092ce4a5adc6d13a52b">77d28be9</a>) Fix SCORM audio widget width and error float</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b4f86e2859a0982e5fa74ff75eb73a30e2b13237">b4f86e28</a>) Fix width and height of avatar images</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/080258d2a80a9f1f29d852a238f122eafa2f6c64">080258d2</a> - <a href="https://task.beeznest.com/issues/11477">BT#11477</a>) Fix migration when moving files</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/52dcdc532fbd9f3d2105795c4bcb1cf1276f2aed">52dcdc53</a> - <a href="https://task.beeznest.com/issues/11477">BT#11477</a>) Fix Migration on c_item_property</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b13725313412ec8f540de61dd85f8b2c84f82f51">b1372531</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add comments and validations to IMS/QTI import code</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8a184a79d7450e8d9a29f22b2c64fc50d74b59ec">8a184a79</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add (incomplete) support for attached media in IMS/QTI v1.2 import</li>
-        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c6730139827f1a0953a48cd67e4c3def41f3993e">c6730139</a>) Set doctype html5 for system document templates</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c6730139827f1a0953a48cd67e4c3def41f3993e">c6730139</a>) Set doctype to HTML5 for system document templates</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7ba2774af998befbc1c2a81a31eb292f164af846">7ba2774a</a> - <a href="https://task.beeznest.com/issues/11478">BT#11478</a>) Fix "-" if qualification doesn't exist in last work upload + added upload success msg</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/110e833e50d0a482862655b9d50154286bbf1ae8">110e833e</a>) Fix export to PDF from HTML docs</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2919a29e87b42e34a451faa943ee574680cc7c64">2919a29e</a>) Fix reduced footer issues in learning paths</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/de40643fd31985d719a981c05bf46fed1e34a0a7">de40643f</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Fix IMS/QTI v2.0 import</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/840f49cfbd2e656bcf1d265d51d02caaeabf56fc">840f49cf</a> - <a href="https://task.beeznest.com/issues/11438">BT#11438</a>) Add support for two-levels zips for IMS/QTI v1.2 import</li>
-
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/46c7afa543087587d852dd098bf1f815bf0bfda9">46c7afa5</a>) Use DOMDocument to add print button for certificates</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b78b3c9df61de5951df27732496d6000ca327943">b78b3c9d</a>) Remove Student/Teacher view from places that is not in the course and it tools</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2025ff53fa690fb5480549f5f8956383ca6dbc4c">2025ff53</a> - <a href="https://support.chamilo.org/issues/8374">#8374</a>) Update Wiris doc in installation guide</li>
@@ -313,8 +694,6 @@
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5d84c533d273d4353de000c7fa1a1bb98b7b3bc5">5d84c533</a> - <a href="https://task.beeznest.com/issues/11031">BT#11031</a>) Fix display_categories_on_homepage</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8e340ef510eb3a0724f3a5aee249c3616594ca6f">8e340ef5</a>) Add bootstrap/jquery when exporting a SCORM package, adding oral question type</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/71ef6efb49e65c26217f5444d718c12809ab061b">71ef6efb</a>) Fix question exports</li>
-        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a2c9fca6540125f5686f3a1be6135ae8100b60bf">a2c9fca6</a> - <a href="https://support.chamilo.org/issues/8211">#8211</a>) Added Scorm time to lp</li>
-        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4764670ed10df4d71ba960506f45c034aa5f8470">4764670e</a> - <a href="https://task.beeznest.com/issues/11358">BT#11358</a>) Avoid edit Thematic advanced via ajax modal</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d3464efa703abb53538e4857cb9554e7e428d9ff">d3464efa</a>) Fix get_logged_user_course_html</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0ca7d93ecdf81eeef0479c75c1fa31eb3d01d980">0ca7d93e</a> - <a href="https://task.beeznest.com/issues/11360">BT#11360</a>) Fix update legal terms</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/db6d382829ad992d6af26f1b97e50f8feebd6a4d">db6d3828</a> - <a href="https://support.chamilo.org/issues/8161">#8161</a>) Fix tpl issues in social groups views</li>

+ 53 - 270
documentation/optimization.html

@@ -62,286 +62,46 @@
 <h2><a name="1.Using-XCache"></a>1. Using opcaches</h2>
     <h3>Zend OpCode (Zend Optimizer+)</h3>
     From version 5.5, PHP includes the Zend OpCache Optimizer, which can
-    produce considerable efficiency boosts and is very reliable.
+    bring considerable efficiency improvements and is very reliable.
 
     Using OpCache should come by default, but if you want to make sure it's
     running, just check that your opcache.ini config file says
     <pre>opcache.enable = 1</pre>
     Some websites will recommend the addition of additional settings, and this
-    is really up to you. Check <a href="http://php.net/manual/en/opcache.configuration.php">the official OpCache config page for more information</a>.
+    is really up to you. Check
+    <a href="http://php.net/manual/en/opcache.configuration.php">the official OpCache config page for more information</a>.
+
+    To check if OpCache is effectively running, you can check the
+    <a href="/main/admin/system_status.php?section=php">Chamilo systems status page</a>
+    on the administration page, or you can check it in phpinfo, if you have any script with it.
 
     Zend OpCache is an "opcode" cache, meaning it will compile static code to make their processing faster.
     However, this will not allow you to "store" shared variables in memory between all users. To do that, we suggest
     you complement Zend OpCache (opcode) with a user-land cache like APCu.
 
-    <h3>xCache</h3>
-
-See <a href="http://xcache.lighttpd.net/">xCache's website</a> for summary documentation.<br />
-<ul>
-<li>On Debian/Ubuntu<=14.04: sudo apt-get install php5-xcache</li>
-</ul>
-Set your xcache.ini configuration (/etc/php5/conf.d/xcache.ini) to match your
-    system. For example, you *could* have something like this (intentionally
-    hiding comments here):
-<pre>
-xcache.shm_scheme =        "mmap"
-xcache.size  =                32M
-xcache.count =                 2
-xcache.slots =                8K
-xcache.ttl   =                 0
-xcache.gc_interval =           0
-xcache.var_size  =           16M
-xcache.var_count =            16
-xcache.var_slots =            8K
-xcache.var_ttl   =            60
-xcache.var_maxttl   =        300
-xcache.var_gc_interval =     300
-xcache.test =                Off
-</pre>
-xCache will feel useless until you actually start to put some variables in
-    cache. If you're showing the "Who is online" counter, that's one of the
-    best item there is to implement xCache.<br />
-For example, you could implement it this way (in main/inc/lib/banner.lib.php):<br />
-<pre>
-$xc = function_exists('xcache_isset');
-$number = 0;
-if ((api_get_setting('showonline', 'world') == 'true' AND !$user_id) OR (api_get_setting('showonline', 'users') == 'true' AND $user_id) OR (api_get_setting('showonline', 'course') == 'true' AND $user_id AND $course_id)) {
-  if ($xc &amp;&amp; xcache_isset('campus_chamilo_org_whoisonline_count_simple')) {
-    $number = xcache_get('campus_chamilo_org_whoisonline_count_simple');
-  } else {
-    $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-    xcache_set('campus_chamilo_org_whoisonline_count_simple',$number);
-  }
-}
-$number_online_in_course = 0;
-if(!empty($_course['id'])) {
-  if ($xc &amp;&amp; xcache_isset('campus_chamilo_org_whoisonline_count_simple_'.$_course['id'])) {
-    $number_online_in_course = xcache_get('campus_chamilo_org_whoisonline_count_simple_'.$_course['id']);
-  } else {
-    $number_online_in_course = who_is_online_in_this_course_count(api_get_user_id(), api_get_setting('time_limit_whosonline'), $_course['id']);
-    xcache_set('campus_chamilo_org_whoisonline_count_simple_'.$_course['id'],$number_online_in_course);
-  }
-}
-</pre>
-Note that, as xCache is a shared caching system, it is very important to prefix
-    your variables with a domain name or some kind of identifier, otherwise it
-    would end up in disaster if you use a shared server for several portals.<br />
-If you use php5-memcache, then this piece of code would look like this
-    (you need to adjust depending on your settings):
-<pre>
-    global $_configuration;
-    $_course    = api_get_course_info();
-    $course_id  = api_get_course_id();
-    $user_id    = api_get_user_id();
-
-    $html = '';
-    $xc = method_exists('Memcache','add');
-    if ($xc) {
-        // Make sure the server is available
-        $xm = new Memcache;
-        $xm->addServer('localhost', 11211);
-        $xc = $xc && ($xm->getServerStatus('localhost',11211)!=0);
-        // The following concatenates the name of the database + the id of the
-        // access url to make it a unique variable prefix for the variables to
-        // be stored
-        $xs = $_configuration['main_database'].'_'.$_configuration['access_url'].'_';
-    }
-    $number = 0;
-    if ((api_get_setting('showonline', 'world') == 'true' AND !$user_id) OR (api_get_setting('showonline', 'users') == 'true' AND $user_id) OR (api_get_setting('showonline', 'course') == 'true' AND $user_id AND $course_id)) {
-        if ($xc && $xm->get($xs.'wio_count_simple')) {
-            $number = $xm->get($xs.'wio_count_simple');
-        } else {
-            $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-            $xm->set($xs.'wio_count_simple',$number,0,30);
-        }
-
-        $number_online_in_course = 0;
-        if(!empty($_course['id'])) {
-            if ($xc && $xm->get($xs.'wio_count_simple_'.$_course['id'])) {
-                $number_online_in_course = $xm->get($xs.'wio_count_simple_'.$_course['id']);
-            } else {
-                $number_online_in_course = who_is_online_in_this_course_count($user_id, api_get_setting('time_limit_whosonline'), $_course['id']);
-                $xm->set($xs.'wio_count_simple_'.$_course['id'],$number_online_in_course,0,30);
-            }
-        }
-</pre>
-<br />
-An optional additional caching mechanism you may use is the realpath_cache_size
-    and realpath_cache_ttl php.ini parameters.
-    See <a href="http://php.net/manual/en/ini.core.php">the PHP documentation</a>
-    for more details.
-<br />
-    <br />
-    <h3>APC</h3>
-    If you prefer using <a href="http://php.net/manual/en/book.apc.php">APC</a>,
-    you can use the same kind of trick as above, just changing the code a little:
-<pre>
-    $xc = function_exists('apc_exists');
-    $number = 0;
-    if ((api_get_setting('showonline', 'world') == 'true' AND !$user_id) OR (api_get_setting('showonline', 'users') == 'true' AND $user_id) OR (api_get_setting('showonline', 'course') == 'true' AND $user_id AND $course_id)) {
-        if ($xc) {
-            $apc = apc_cache_info(null,true);
-            $apc_end = $apc['start_time']+$apc['ttl'];
-            if (apc_exists('my_campus_whoisonline_count_simple') AND (time() < $apc_end) AND apc_fetch('my_campus_whoisonline_count_simple') > 0 ) {
-                $number = apc_fetch('my_campus_whoisonline_count_simple');
-            } else {
-                $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-                apc_clear_cache();
-                apc_store('my_campus_whoisonline_count_simple',$number,15);
-            }
-        } else {
-                $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-        }
-        $number_online_in_course = 0;
-        if (!empty($_course['id'])) {
-            if ($xc) {
-                $apc = apc_cache_info(null,true);
-                $apc_end = $apc['start_time']+$apc['ttl'];
-                if (apc_exists('my_campus_whoisonline_count_simple_'.$_course['id']) AND (time() < $apc_end) AND apc_fetch('my_campus_whoisonline_count_simple_'.$_course['id']) > 0) {
-                    $number_online_in_course = apc_fetch('my_campus_whoisonline_count_simple_'.$_course['id']);
-                } else {
-                    $number_online_in_course = who_is_online_in_this_course_count($user_id, api_get_setting('time_limit_whosonline'), $_course['id']);
-                    apc_store('my_campus_whoisonline_count_simple_'.$_course['id'],$number_online_in_course,15);
-                }
-            } else {
-                $number_online_in_course = who_is_online_in_this_course_count($user_id, api_get_setting('time_limit_whosonline'), $_course['id']);
-            }
-        }
-     ...
-</pre>
-<br />
-<br />
     <h3>APCu</h3>
-In PHP 5.5 and above, APC is rendered practically obsolete by the presence of ZendOPCache by default.
-    However, APC does not cover the "user cache", like the caching of specific variables in memory.
-    Considering this, you can <a href="http://php.net/manual/en/book.apcu.php">APCu</a> to add the same level of variable caching as described above, just changing the code a little:
-    On a local computer, this lead to an increase of RAM consumption and a decrease of 20% of CPU time (for just one user). This has been included in 1.11.x, so this section is only there for historical purposes.
-<pre>
-function return_notification_menu()
-{
-    $_course = api_get_course_info();
-    $course_id = 0;
-    if (!empty($_course)) {
-        $course_id  = $_course['code'];
-    }
-
-    $user_id = api_get_user_id();
-
-    $html = '';
-    $cacheEnabled = function_exists('apcu_exists');
-
-    if ((api_get_setting('showonline', 'world') == 'true' && !$user_id) ||
-        (api_get_setting('showonline', 'users') == 'true' && $user_id) ||
-        (api_get_setting('showonline', 'course') == 'true' && $user_id && $course_id)
-    ) {
-
-        if ($cacheEnabled) {
-            $apc = apcu_cache_info(null,true);
-            $apc_end = $apc['start_time']+$apc['ttl'];
-            if (apcu_exists('my_campus_whoisonline_count_simple') AND (time() < $apc_end) AND apcu_fetch('my_campus_whoisonline_count_simple') > 0 ) {
-                $number = apcu_fetch('my_campus_whoisonline_count_simple');
-            } else {
-                $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-                apcu_clear_cache();
-                apcu_store('my_campus_whoisonline_count_simple',$number,15);
-            }
-        } else {
-            $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-        }
-
-        $number_online_in_course = 0;
-        if (!empty($_course['id'])) {
-            if ($cacheEnabled) {
-                $apc = apcu_cache_info(null,true);
-                $apc_end = $apc['start_time']+$apc['ttl'];
-                if (apcu_exists('my_campus_whoisonline_count_simple_'.$_course['id']) AND (time() < $apc_end) AND apcu_fetch('my_campus_whoisonline_count_simple_'.$_course['id']) > 0) {
-                    $number_online_in_course = apcu_fetch('my_campus_whoisonline_count_simple_'.$_course['id']);
-                } else {
-                    $number_online_in_course = who_is_online_in_this_course_count($user_id, api_get_setting('time_limit_whosonline'), $_course['id']);
-                    apcu_store('my_campus_whoisonline_count_simple_'.$_course['id'],$number_online_in_course,15);
-                }
-            } else {
-                $number_online_in_course = who_is_online_in_this_course_count(
-                    $user_id,
-                    api_get_setting('time_limit_whosonline'),
-                    $_course['id']
-                );
-            }
-        }
-
-        // Display the who's online of the platform
-        if ($number) {
-            if ((api_get_setting('showonline', 'world') == 'true' && !$user_id) ||
-                (api_get_setting('showonline', 'users') == 'true' && $user_id)
-            ) {
-                $html .= '<li><a href="'.api_get_path(WEB_PATH).'whoisonline.php" target="_self" title="'.get_lang('UsersOnline').'" >'.
-                            Display::return_icon('user.png', get_lang('UsersOnline'), array(), ICON_SIZE_TINY).' '.$number.'</a></li>';
-            }
-        }
-     ...
-</pre>
-<br />
-    <h3>Memcached</h3>
-If you use php5-memcached (different set of functions than php5-memcache!),
-    then this piece of code would look like this (you need to adjust
-    depending on your settings):
-<pre>
-    global $_configuration;
-    $_course    = api_get_course_info();
-    $course_id  = api_get_course_id();
-    $user_id    = api_get_user_id();
-
-    $html = '';
-    $xc = method_exists('Memcached', 'add');
-    if ($xc) {
-        // Make sure the server is available
-        $xm = new Memcached;
-        $xm->addServer('localhost', 11211);
-        // The following concatenates the name of the database + the id of the
-        // access url to make it a unique variable prefix for the variables to
-        // be stored
-        $xs = $_configuration['main_database'].'_'.$_configuration['access_url'].'_';
-    }
-    $number = 0;
-    if ((api_get_setting('showonline', 'world') == 'true' AND !$user_id) OR (api_get_setting('showonline', 'users') == 'true' AND $user_id) OR (api_get_setting('showonline', 'course') == 'true' AND $user_id AND $course_id)) {
-        if ($xc) {
-            if ($xm->get($xs.'wio_count_simple')) {
-                $number = $xm->get($xs.'wio_count_simple');
-            } else {
-                $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-                $xm->set($xs.'wio_count_simple',$number,120);
-            }
-        } else {
-              $number = who_is_online_count(api_get_setting('time_limit_whosonline'));
-        }
-        $number_online_in_course = 0;
-        if (!empty($_course['id'])) {
-            if ($xc) {
-                if ($xm->get($xs.'wio_count_simple_'.$_course['id'])) {
-                    $number_online_in_course = $xm->get($xs.'wio_count_simple_'.$_course['id']);
-                } else {
-                    $number_online_in_course = who_is_online_in_this_course_count($user_id, api_get_setting('time_limit_whosonline'), $_course['id']);
-                    $xm->set($xs.'wio_count_simple_'.$_course['id'],$number_online_in_course,120);
-                }
-            } else {
-                $number_online_in_course = who_is_online_in_this_course_count(api_get_user_id(), api_get_setting('time_limit_whosonline'), $_course['id']);
-            }
-        }
-        // ...
-</pre>
+    You can also check whether APCu is working or not from the systems status page. Check
+    <a href="http://php.net/manual/en/apcu.configuration.php">the official APCu config page</a>
+    for configuration options.
 
+    In previous versions, this optimization guide contained information about how to use xCache, APC or Memcache to
+    boost the number of online users. However, starting from version 1.11, code has been added to Chamilo to use
+    APCu by default from the banner.lib.php library, so as long as APCu is installed and running, you'll benefit from
+    this optimization naturally.
 
+    <h3>Other items</h3>
 
-<p>It is also worth noting that the Université de Genève, Switzerland, observed
+    <p>It is also worth noting that the Université de Genève, Switzerland, observed
     that the calculation of the total size used by course documents is one of
     the heaviest queries in Chamilo, so you might want to cache the results of
     this one as well, using the same technique.</p>
-<p>Finally, if your portal is highly public *and* you are showing the popular
+
+    <p>Finally, if your portal is highly public *and* you are showing the popular
     courses on the homepage, you might want to also reduce the amount of
     queries this generates, using the same technique as above, but for the
     main/inc/lib/auth.lib.php library, looking for the
     "Tracking::get_course_connections_count()" call:</p>
-<pre>
+    <pre>
         while ($row = Database::fetch_array($result)) {
             $row['registration_code'] = !empty($row['registration_code']);
             $count_users = CourseManager::get_users_count_in_course($row['code']);
@@ -360,18 +120,19 @@ If you use php5-memcached (different set of functions than php5-memcache!),
             }
             ...
         }
-</pre>
-Finally, the Free Campus of Chamilo has a very specific case of slow query:
+    </pre>
+
+    Finally, the Free Campus of Chamilo has a very specific case of slow query:
     the courses catalog! Because there might be more than 32,000 courses in
     there, getting the number of "Connections last month" can be a disastrous
     query in terms of performances. This is why you should try to cache the
     results as well.<br />
-Obviously, as we are speaking about showing the number of visits this month,
+    Obviously, as we are speaking about showing the number of visits this month,
     it doesn't really matter if the number doesn't refresh for an hour or so...<br />
-Locate the main/inc/lib/course_category.lib.php file, open it and go to the
+    Locate the main/inc/lib/course_category.lib.php file, open it and go to the
     browseCoursesInCategory() function.<br />
-Locate the $count_connections_last_month = Tracking::get_course_connections_count(...)
-    call, and wrap in into something like this:
+    Locate the $count_connections_last_month = Tracking::get_course_connections_count(...)
+    call, and wrap in into something like this (you'll have to update this to use APCu):
 <pre>
     $xc = method_exists('Memcached', 'add');
     if ($xc) {
@@ -401,6 +162,7 @@ Locate the $count_connections_last_month = Tracking::get_course_connections_coun
    ...
 </pre>
 <hr />
+
 <h2><a name="2.Slow-queries"></a>2. Slow queries</h2>
 Enable slow_queries in /etc/mysqld/my.cnf, restart MySQL then follow using sudo tail -f /var/log/mysql/mysql-slow.log
 <br /><br />
@@ -427,21 +189,42 @@ In Chamilo 1.10.6, two additional queries were confirmed to still have effect a
 ALTER TABLE c_quiz_question_rel_category ADD INDEX idx_qqrc_qid (question_id);
 ALTER TABLE c_lp_item_view ADD INDEX idx_clpiv_c_i_v (c_id, id, view_count);
 </pre>
+
+    Note that, because these situations only occur when a portal is under real-world high-load stress, we only get to
+    find out about these possible bottlenecks after we release stable versions of Chamilo. This is why we list those
+    queries here. However, as soon as we confirm them with a few real life scenarios, we add them into the core of
+    Chamilo so you can benefit from them immediately by installing a new version.
+
 <hr />
 <h2><a name="3.Indexes-caching"></a>3. Indexes caching</h2>
 One good reference: <a href="http://dev.mysql.com/doc/refman/5.1/en/multiple-key-caches.html">MySQL documentation on multiple key caches</a><br />
 <hr />
 
 <h2><a name="4.Sessions-directories"></a>4. Sessions directories</h2>
-php_admin_value session.save_path 1;/var/www/test.chamilo.org/sessions/
+
+    <p>On large implementations, the users sessions might be stored in numbers too large (hundreds of thousands) to be
+    efficiently managed by the filesystem is stored in one single folder. In order to avoid that, you can either store
+    your sessions in another key-value storage (memcache, redis, etc) or you can instruct PHP to store your session
+    files in a directory with a certain level of subdirectories (so sessions are spread across multiple directories
+    instead of inside just one.</p>
+
+    <p>This is done by adding the following setting to your php.ini or your Apache's Virtual Host</p>
+    <pre>php_admin_value session.save_path 1;/var/www/test.chamilo.org/sessions/</pre>
+    <p>Please note that, by defining a different directory than your system's default, you will need to reconfigure
+    your system's session cleaning procedure, which is usually defined under /etc/cron.d/php, so that it cleans
+    this specific directory as well.</p>
 <hr />
 <h2><a name="5.Users-upload-directories"></a>5. Users upload directories</h2>
-Create 10 directories inside the app/upload/users directory (from 0 to 9) and update your admin settings. This has to be done at install &amp; configuration time, otherwise you might loose user data (or have to write a script for data distribution).
+The default in Chamilo is now to spread user accounts in 10 different directories inside app/upload/users/ to avoid
+    overloading that specific directory. Nothing to be done here. Please move on.
 <hr />
 <h2><a name="6.Zlib-compression"></a>6. Zlib compressed output</h2>
-Although this will not make your server faster, compressing the pages you are sending to the users will definitely make them feel like your website's responses are a lot faster, and thus increase their well-being when using Chamilo.<br /><br />
+Although this will not make your server faster, compressing the pages you are sending to the users will definitely
+    make them feel like your website's responses are a lot faster, and thus increase their well-being when using Chamilo.<br /><br />
 Zlib output compression has to be set at two levels: PHP configuration for PHP pages and Apache for images and CSS.<br /><br />
-To update the PHP configuration (either in php.ini or in your VirtualHost), use the <a href="http://php.net/manual/en/zlib.configuration.php">zlib.output_compression</a>. If you set this inside your Apache's VirtualHost, you should use the following syntax.
+To update the PHP configuration (either in php.ini or in your VirtualHost), use the
+    <a href="http://php.net/manual/en/zlib.configuration.php">zlib.output_compression</a>. If you set this inside your
+    Apache's VirtualHost, you should use the following syntax.
 <pre>
 php_value zlib.output_compression 1
 </pre>
@@ -705,7 +488,7 @@ This should have an immediate effect on the load average on your server.
 <hr />
 <h2>Authors</h2>
 <ul>
-<li>Yannick Warnier, Zend Certified PHP Engineer, BeezNest Belgium SPRL, <a href="mailto:ywarnier@beeznest.net">ywarnier@beeznest.net</a></li>
+<li>Document redacted and maintained by Yannick Warnier, Zend Certified PHP Engineer, BeezNest Belgium SPRL, <a href="mailto:yannick.warnier@beeznest.com">yannick.warnier@beeznest.com</a>.</li>
 </ul>
 <hr />
 Don't have time or resources to optimize your Chamilo installation

+ 1 - 1
main/admin/course_add.php

@@ -168,7 +168,7 @@ $(function() {
 });
 </script>';
 
-$form->add_progress_bar();
+$form->addProgress();
 $form->addButtonCreate(get_lang('CreateCourse'));
 
 // Set some default values.

+ 9 - 7
main/admin/filler.php

@@ -61,13 +61,15 @@ if (count($output)>0) {
     Display::display_normal_message($result,false);
 }
 ?>
-<div id="datafiller" class="actions">
-  <h4><?php echo Display::return_icon('bug.png',get_lang('DataFiller'),null,ICON_SIZE_MEDIUM).' '.get_lang('DataFiller')?></h4>
-  <div class="description"><?php echo get_lang('ThisSectionIsOnlyVisibleOnSourceInstalls');?></div>
-  <ul class="fillers">
-    <li><a href="filler.php?fill=users"><?php echo Display::return_icon('user.png',get_lang('FillUsers'),null,ICON_SIZE_SMALL).' '.get_lang('FillUsers');?></a></li>
-    <li><a href="filler.php?fill=courses"><?php echo Display::return_icon('new-course.png',get_lang('FillCourses'),null,ICON_SIZE_SMALL).' '.get_lang('FillCourses');?></a></li>
-  </ul>
+<div id="datafiller" class="panel panel-default">
+    <div class="panel-body">
+    <h4><?php echo Display::return_icon('bug.png',get_lang('DataFiller'),null,ICON_SIZE_MEDIUM).' '.get_lang('DataFiller')?></h4>
+    <div class="description"><?php echo get_lang('ThisSectionIsOnlyVisibleOnSourceInstalls');?></div>
+    <ul class="fillers">
+      <li><a href="filler.php?fill=users"><?php echo Display::return_icon('user.png',get_lang('FillUsers'),null,ICON_SIZE_SMALL).' '.get_lang('FillUsers');?></a></li>
+      <li><a href="filler.php?fill=courses"><?php echo Display::return_icon('new-course.png',get_lang('FillCourses'),null,ICON_SIZE_SMALL).' '.get_lang('FillCourses');?></a></li>
+    </ul>
+    </div>
 </div>
 <?php
 /* FOOTER */

+ 1 - 1
main/admin/special_exports.php

@@ -173,7 +173,7 @@ function form_special_export() {
     $form->addElement('radio', 'backup_option', '',  get_lang('SpecialLetMeSelectItems'), 'select_items');
     $form->addElement('html','<br />');
     $form->addButtonExport(get_lang('CreateBackup'));
-    $form->add_progress_bar();
+    $form->addProgress();
     $values['backup_option'] = 'full_backup';
     $form->setDefaults($values);
     $form->display();

+ 1 - 1
main/auth/profile.php

@@ -334,7 +334,7 @@ if (is_profile_editable() && api_get_setting('profile', 'picture') == 'true') {
         array('id' => 'picture', 'class' => 'picture-form', 'crop_image' => true, 'crop_ratio' => '1 / 1')
     );
 
-    $form->add_progress_bar();
+    $form->addProgress();
     if (!empty($user_data['picture_uri'])) {
         $form->addElement('checkbox', 'remove_picture', null, get_lang('DelImage'));
     }

+ 2 - 2
main/course_info/infocours.php

@@ -665,13 +665,13 @@ $form->addHtml('
 ');
 $form->addHtml('</div>');
 
-$form->addHtml('</div>');
-
 
 // Plugin course settings
 $appPlugin = new AppPlugin();
 $appPlugin->add_course_settings_form($form);
 
+$form->addHtml('</div>');
+
 // Get all the course information
 $all_course_information = CourseManager::get_course_information($_course['sysCode']);
 

+ 2 - 6
main/course_progress/index.php

@@ -64,14 +64,10 @@ if ($action == 'thematic_details' || $action == 'thematic_list') {
 }
 
 // get thematic id
-if (isset($_GET['thematic_id'])) {
-    $thematic_id = intval($_GET['thematic_id']);
-}
+$thematic_id = isset($_GET['thematic_id']) ? (int) $_GET['thematic_id'] : 0;
 
 // get thematic plan description type
-if (isset($_GET['description_type'])) {
-    $description_type = intval($_GET['description_type']);
-}
+$description_type = isset($_GET['description_type']) ? (int) $_GET['description_type'] : 0;
 
 // instance thematic object for using like library here
 $thematic = new Thematic();

+ 1 - 1
main/coursecopy/copy_course.php

@@ -122,7 +122,7 @@ if (Security::check_token('post') && (
         $group[] = $form->createElement('radio', 'same_file_name_option', null, get_lang('SameFilenameRename'), FILE_RENAME);
         $group[] = $form->createElement('radio', 'same_file_name_option', null, get_lang('SameFilenameOverwrite'), FILE_OVERWRITE);
         $form->addGroup($group, '', get_lang('SameFilename'));
-        $form->add_progress_bar();
+        $form->addProgress();
         $form->addButtonSave(get_lang('CopyCourse'));
         $form->setDefaults(array('copy_option' =>'select_items','same_file_name_option' => FILE_OVERWRITE));
 

+ 1 - 1
main/coursecopy/create_backup.php

@@ -102,7 +102,7 @@ if (Security::check_token('post') && (
         $form->addElement('radio', 'backup_option', '', get_lang('CreateFullBackup'), 'full_backup');
         $form->addElement('radio', 'backup_option', '', get_lang('LetMeSelectItems'), 'select_items');
         $form->addButtonSave(get_lang('CreateBackup'));
-        $form->add_progress_bar();
+        $form->addProgress();
         // When progress bar appears we have to hide the title "Please select a backup-option".
         $form->updateAttributes(
             array(

+ 1 - 1
main/coursecopy/import_backup.php

@@ -268,7 +268,7 @@ if (Security::check_token('post') && (
     $values['same_file_name_option'] = FILE_OVERWRITE;
     $form->setDefaults($values);
 
-    $form->add_progress_bar();
+    $form->addProgress();
     // When progress bar appears we have to hide the title "Select backup file".
     $form->updateAttributes(array(
         'onsubmit' => str_replace(

+ 5 - 3
main/coursecopy/import_moodle.php

@@ -1,5 +1,6 @@
 <?php
 /* For licensing terms, see /license.txt */
+
 use ChamiloSession as Session;
 
 /**
@@ -10,7 +11,6 @@ use ChamiloSession as Session;
  */
 
 require_once '../inc/global.inc.php';
-require_once '../inc/lib/MoodleImport.class.php';
 
 $current_course_tool = TOOL_COURSE_MAINTENANCE;
 api_protect_course_script(true);
@@ -31,7 +31,7 @@ $this_section = SECTION_COURSES;
 
 // Breadcrumbs
 $interbreadcrumb[] = array(
-    'url' => '../course_info/maintenance.php',
+    'url' => api_get_path(WEB_CODE_PATH).'course_info/maintenance.php?'.api_get_cidreq(),
     'name' => get_lang('Maintenance')
 );
 
@@ -43,7 +43,9 @@ if ($form->validate()) {
     $file = $_FILES['moodle_file'];
     $moodleImport = new MoodleImport();
     $responseImport = $moodleImport->readMoodleFile($file);
-    Session::erase('flash_messages');
+
+    Display::cleanFlashMessages();
+
     if ($responseImport) {
         Display::addFlash(Display::return_message(get_lang('MoodleFileImportedSuccessfully'), 'success'));
     } else {

+ 1 - 1
main/create_course/add_course.php

@@ -242,7 +242,7 @@ $form->addElement('html', '</div>');
 $form->addButtonCreate($course_validation_feature ? get_lang('CreateThisCourseRequest') : get_lang('CreateCourseArea'));
 
 // The progress bar of this form.
-$form->add_progress_bar();
+$form->addProgress();
 
 // Set default values.
 if (isset($_user['language']) && $_user['language'] != '') {

+ 1 - 1
main/document/upload.php

@@ -274,7 +274,7 @@ $form->addElement('html', '</div>');
 
 // Button upload document
 $form->addButtonSend(get_lang('SendDocument'), 'submitDocument');
-$form->add_real_progress_bar('DocumentUpload', 'file');
+$form->addProgress('DocumentUpload', 'file');
 
 $fileExistsOption = api_get_setting('document_if_file_exists_option');
 

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 520 - 517
main/exercise/TestCategory.php


+ 3 - 1
main/exercise/exercise.class.php

@@ -1019,7 +1019,9 @@ class Exercise
             $newCategoryList = array();
 
             foreach ($questions_by_category as $categoryId => $questionList) {
-                $cat = new TestCategory($categoryId);
+                $cat = new TestCategory();
+                $cat = $cat->getCategory($categoryId);
+
                 $cat = (array)$cat;
                 $cat['iid'] = $cat['id'];
                 //*$cat['name'] = $cat['name'];

+ 8 - 2
main/exercise/exercise_result.php

@@ -124,6 +124,7 @@ if ($origin == 'learnpath') {
 }
 
 $i = $total_score = $max_score = 0;
+$remainingMessage = '';
 
 //We check if the user attempts before sending to the exercise_result.php
 if ($objExercise->selectAttempts() > 0) {
@@ -152,15 +153,18 @@ if ($objExercise->selectAttempts() > 0) {
             $attemptButton = Display::toolbarButton(
                 get_lang('AnotherAttempt'),
                 api_get_path(WEB_CODE_PATH) . 'exercise/overview.php?' . api_get_cidreq() . '&' . http_build_query([
-                    'exerciseId' => $objExercise->id
+                    'exerciseId' => $objExercise->id,
+                    'learnpath_id' => $learnpath_id,
+                    'learnpath_item_id' => $learnpath_item_id
                 ]),
                 'pencil-square-o',
                 'info'
             );
             $attemptMessage = sprintf(get_lang('RemainingXAttempts'), $remainingAttempts);
+            $remainingMessage = sprintf("<p>%s</p> %s", $attemptMessage, $attemptButton);
 
             Display::display_normal_message(
-                sprintf("<p>%s</p> %s", $attemptMessage, $attemptButton),
+                $remainingMessage,
                 false
             );
         }
@@ -212,6 +216,8 @@ if ($origin != 'learnpath') {
         Session::erase('exe_id');
     }
 
+    Session::write('attempt_remaining', $remainingMessage);
+
 	// Record the results in the learning path, using the SCORM interface (API)
 	echo "<script>window.parent.API.void_save_asset('$total_score', '$max_score', 0, 'completed');</script>";
     echo '<script type="text/javascript">'.$href.'</script>';

+ 2 - 2
main/exercise/overview.php

@@ -33,7 +33,7 @@ if (!$result) {
 $gradebook = isset($_GET['gradebook']) ? Security :: remove_XSS($_GET['gradebook']) : null;
 $learnpath_id = isset($_REQUEST['learnpath_id']) ? intval($_REQUEST['learnpath_id']) : null;
 $learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? intval($_REQUEST['learnpath_item_id']) : null;
-$origin = isset($_REQUEST['origin']) ? Security::remove_XSS($_REQUEST['origin']) : null;
+$origin = api_get_origin();
 
 $interbreadcrumb[] = array("url" => "exercise.php?gradebook=$gradebook", "name" => get_lang('Exercises'));
 $interbreadcrumb[] = array("url" => "#", "name" => $objExercise->name);
@@ -302,7 +302,7 @@ if ($objExercise->selectAttempts()) {
         $attempt_message = Display::return_message($attempt_message, 'info');
     }
     if ($visible_return['value'] == true) {
-        $message .=   $attempt_message;
+        $message .= $attempt_message;
     }
 }
 

+ 21 - 12
main/exercise/result.php

@@ -1,6 +1,8 @@
 <?php
 /* For licensing terms, see /license.txt */
 
+use ChamiloSession as Session;
+
 /**
  * Shows the exercise results
  *
@@ -17,13 +19,13 @@ $id = isset($_REQUEST['id']) ? intval($_GET['id']) : null; //exe id
 $show_headers = isset($_REQUEST['show_headers']) ? intval($_REQUEST['show_headers']) : null; //exe id
 
 if ($origin == 'learnpath') {
-	$show_headers = false;
+    $show_headers = false;
 }
 
 api_protect_course_script($show_headers);
 
 if (empty($id)) {
-	api_not_allowed($show_headers);
+    api_not_allowed($show_headers);
 }
 
 $is_allowedToEdit = api_is_allowed_to_edit(null,true) || $is_courseTutor;
@@ -49,7 +51,7 @@ if (!empty($exercise_id)) {
 // Only users can see their own results
 if (!$is_allowedToEdit) {
     if ($student_id != $current_user_id) {
-    	api_not_allowed($show_headers);
+        api_not_allowed($show_headers);
     }
 }
 
@@ -59,22 +61,29 @@ $htmlHeadXtra[] = '<script src="' . api_get_path(WEB_LIBRARY_JS_PATH) . 'hotspot
 if ($show_headers) {
     $interbreadcrumb[] = array(
         "url" => "exercise.php?".api_get_cidreq(),
-        "name" => get_lang('Exercises'),
+        "name" => get_lang('Exercises')
     );
     $interbreadcrumb[] = array("url" => "#", "name" => get_lang('Result'));
-	$this_section = SECTION_COURSES;
-	Display::display_header();
+    $this_section = SECTION_COURSES;
+    Display::display_header();
 } else {
-    $htmlHeadXtra[] = "
-    <style>
-    body { background: none;}
-    </style>
-    ";
+    $htmlHeadXtra[] = '<style>
+        body { background: none;}
+    </style>';
 	Display::display_reduced_header();
 }
 
+$message = Session::read('attempt_remaining');
+if (!empty($message)) {
+    Display::display_normal_message(
+        $message,
+        false
+    );
+}
+Session::erase('attempt_remaining');
+
 ExerciseLib::display_question_list_by_attempt($objExercise, $id, false);
 
 if ($show_headers) {
-	Display::display_footer();
+    Display::display_footer();
 }

+ 2 - 5
main/exercise/showinframes.php

@@ -78,11 +78,8 @@ $noPHP_SELF = true;
 $htmlHeadXtra[] = '
 <script>
     $(document).ready( function(){
-        var height = $(this).innerHeight( - 20;
-        if (height < 0) {
-            height  = "95%";
-        }
-        $("#hotpotatoe").css("height", height);
+        var height = $(this).innerHeight() - 20;
+        $("#hotpotatoe").css("height", height)
     });
 </script>';
 

+ 28 - 38
main/exercise/tests_category.php

@@ -19,7 +19,7 @@ $htmlHeadXtra[] = '
 	}
 </script>';
 
-$nameTools = "";
+$nameTools = '';
 
 require_once '../inc/global.inc.php';
 
@@ -49,7 +49,7 @@ switch ($action) {
         $content = edit_category_form('editcategory');
         break;
     case 'deletecategory':
-        delete_category_form('deletecategory');
+        delete_category_form();
         break;
     case 'export_category':
         $archiveFile = 'export_exercise_categoroes_'.api_get_course_id().'_'.api_get_local_time();
@@ -72,7 +72,9 @@ switch ($action) {
             $categories = Import::csv_reader($_FILES['file']['tmp_name']);
             if (!empty($categories)) {
                 foreach ($categories as $item) {
-                    $cat = new TestCategory(0, $item['title'], $item['description']);
+                    $cat = new TestCategory();
+                    $cat->name = $item['title'];
+                    $cat->description = $item['description'];
                     $cat->addCategoryInBDD();
                 }
                 Display::addFlash(Display::return_message(get_lang('Imported')));
@@ -94,10 +96,8 @@ Display::display_footer();
 function importCategoryForm()
 {
     $form = new FormValidator('import', 'post', api_get_self().'?action=import_category&'.api_get_cidreq());
-    //$form->addElement('header', get_lang('ImportGroups'));
     $form->addElement('file', 'file', get_lang('ImportCSVFileLocation'));
     $form->addRule('file', get_lang('ThisFieldIsRequired'), 'required');
-    //$form->addElement('label', null, Display::url(get_lang('ExampleCSVFile'), api_get_path(WEB_CODE_PATH).'group/example.csv'));
     $form->addButtonImport(get_lang('Import'));
 
     return $form;
@@ -113,8 +113,8 @@ function edit_category_form($action)
     $action = Security::remove_XSS($action);
     if (isset($_GET['category_id']) && is_numeric($_GET['category_id'])) {
         $category_id = intval($_GET['category_id']);
-        $objcat = new TestCategory($category_id);
-
+        $objcat = new TestCategory();
+        $objcat = $objcat->getCategory($category_id);
         $form = new FormValidator(
             'note',
             'post',
@@ -149,19 +149,20 @@ function edit_category_form($action)
             $check = Security::check_token('post');
             if ($check) {
                 $values = $form->exportValues();
-                $v_id = Security::remove_XSS($values['category_id']);
-                $v_name = Security::remove_XSS($values['category_name'], COURSEMANAGER);
-                $v_description = Security::remove_XSS($values['category_description'], COURSEMANAGER);
-                $objcat = new TestCategory($v_id, $v_name, $v_description);
-                if ($objcat->modifyCategory()) {
-                    Display::addFlash(Display::return_message(get_lang('MofidfyCategoryDone')));
+                $category = new TestCategory();
+                $category = $category->getCategory($values['category_id']);
+
+                if ($category) {
+                    $category->name = $values['category_name'];
+                    $category->description = $values['category_description'];
+                    $category->modifyCategory();
+                    Display::addFlash(Display::return_message(get_lang('Updated')));
                 } else {
-                    Display::addFlash(Display::return_message(get_lang('ModifyCategoryError')));
+                    Display::addFlash(Display::return_message(get_lang('ModifyCategoryError'), 'error'));
                 }
             }
             Security::clear_token();
         } else {
-            display_goback();
             $token = Security::get_token();
             $form->addElement('hidden', 'sec_token');
             $form->setConstants(array('sec_token' => $token));
@@ -176,18 +177,17 @@ function edit_category_form($action)
 }
 
 // process to delete a category
-function delete_category_form($action)
+function delete_category_form()
 {
     if (isset($_GET['category_id']) && is_numeric($_GET['category_id'])) {
-        $category_id = Security::remove_XSS($_GET['category_id']);
-        $catobject = new TestCategory($category_id);
-        if ($catobject->removeCategory()) {
-            Display::display_confirmation_message(get_lang('DeleteCategoryDone'));
+        $category = new TestCategory();
+        if ($category->removeCategory($_GET['category_id'])) {
+            Display::addFlash(Display::return_message(get_lang('DeleteCategoryDone')));
         } else {
-            Display::display_error_message(get_lang('CannotDeleteCategoryError'));
+            Display::addFlash(Display::return_message(get_lang('CannotDeleteCategoryError'), 'error'));
         }
     } else {
-        Display::display_error_message(get_lang('CannotDeleteCategoryError'));
+        Display::addFlash(Display::return_message(get_lang('CannotDeleteCategoryError'), 'error'));
     }
 }
 
@@ -219,18 +219,17 @@ function add_category_form($action)
         $check = Security::check_token('post');
         if ($check) {
             $values = $form->exportValues();
-            $v_name = Security::remove_XSS($values['category_name'], COURSEMANAGER);
-            $v_description = Security::remove_XSS($values['category_description'], COURSEMANAGER);
-            $objcat = new TestCategory(0, $v_name, $v_description);
-            if ($objcat->addCategoryInBDD()) {
-                Display::display_confirmation_message(get_lang('AddCategoryDone'));
+            $category = new TestCategory();
+            $category->name = $values['category_name'];
+            $category->description = $values['category_description'];
+            if ($category->addCategoryInBDD()) {
+                Display::addFlash(Display::return_message(get_lang('AddCategoryDone')));
             } else {
-                Display::display_confirmation_message(get_lang('AddCategoryNameAlreadyExists'));
+                Display::addFlash(Display::return_message(get_lang('AddCategoryNameAlreadyExists'), 'warning'));
             }
         }
         Security::clear_token();
     } else {
-        //display_goback();
         $token = Security::get_token();
         $form->addElement('hidden', 'sec_token');
         $form->setConstants(array('sec_token' => $token));
@@ -263,12 +262,3 @@ function displayActionBar()
     echo "<br/>";
     echo "<fieldset><legend>" . get_lang('QuestionCategory') . "</legend></fieldset>";
 }
-
-// display goback to category list page link
-function display_goback()
-{
-    echo '<div class="actions">';
-    echo '<a href="' . api_get_self() . '?'.api_get_cidreq().'">' .
-        Display::return_icon('back.png', get_lang('BackToCategoryList'), array(), 32) . '</a>';
-    echo '</div>';
-}

+ 3 - 2
main/exercise/upload_exercise.php

@@ -127,7 +127,7 @@ function lp_upload_quiz_main()
 
     $form->addRule('user_upload_quiz', get_lang('ThisFieldIsRequired'), 'required');
 
-    $form->add_progress_bar();
+    $form->addProgress();
     $form->addButtonUpload(get_lang('Upload'), 'submit_upload_quiz');
 
     // Display the upload field
@@ -353,7 +353,8 @@ function lp_upload_quiz_action_handling()
                     $categoryName = $categoryList[$i];
                     $categoryId = TestCategory::get_category_id_for_title($categoryName, $courseId);
                     if (empty($categoryId)) {
-                        $category = new TestCategory(null, $categoryName, '');
+                        $category = new TestCategory();
+                        $category->name = $categoryName;
                         $categoryId = $category->addCategoryInBDD();
                     }
                 }

+ 1 - 1
main/forum/forumfunction.inc.php

@@ -345,7 +345,7 @@ function show_add_forum_form($inputvalues = array(), $lp_id)
     $form->addGroup($group, 'public_private_group_forum_group', get_lang('PublicPrivateGroupForum'));
 
     // Forum image
-    $form->add_progress_bar();
+    $form->addProgress();
     if (!empty($inputvalues['forum_image'])) {
         $baseImagePath = api_get_course_path() . '/upload/forum/images/' . $inputvalues['forum_image'];
         $image_path = api_get_path(WEB_COURSE_PATH) . $baseImagePath;

+ 86 - 79
main/gradebook/lib/fe/dataform.class.php

@@ -21,89 +21,96 @@ class DataForm extends FormValidator
 	 * @param method
 	 * @param action
 	 */
-	public function __construct($form_type, $form_name, $method = 'post', $action = null, $target='', $locked_status)
-	{
-		parent :: __construct($form_name, $method, $action,$target);
-		$this->form_type = $form_type;
-		if ($this->form_type == self :: TYPE_IMPORT) {
-			$this->build_import_form();
-		} elseif ($this->form_type == self :: TYPE_EXPORT) {
-			if ($locked_status == 0) {
-				$this->build_export_form_option(false);
-			} else {
-				$this->build_export_form();
-			}
-		} elseif ($this->form_type == self :: TYPE_EXPORT_PDF) {
-			$this->build_pdf_export_form();
-		}
-		$this->setDefaults();
-	}
+    public function __construct($form_type, $form_name, $method = 'post', $action = null, $target = '', $locked_status)
+    {
+        parent:: __construct($form_name, $method, $action, $target);
+        $this->form_type = $form_type;
+        if ($this->form_type == self :: TYPE_IMPORT) {
+            $this->build_import_form();
+        } elseif ($this->form_type == self :: TYPE_EXPORT) {
+            if ($locked_status == 0) {
+                $this->build_export_form_option(false);
+            } else {
+                $this->build_export_form();
+            }
+        } elseif ($this->form_type == self :: TYPE_EXPORT_PDF) {
+            $this->build_pdf_export_form();
+        }
+        $this->setDefaults();
+    }
 
-	protected function build_pdf_export_form()
-	{
-		$renderer =& $this->defaultRenderer();
-		$renderer->setCustomElementTemplate('<span>{element}</span>');
-		$this->addElement('header', get_lang('ChooseOrientation'));
-		$this->addElement('radio', 'orientation', null, get_lang('Portrait'), 'portrait');
-		$this->addElement('radio', 'orientation', null, get_lang('Landscape'), 'landscape');
-		$this->addButtonExport(get_lang('Export'));
-		$this->setDefaults(array (
-			'orientation' => 'portrait'
-		));
-	}
+    protected function build_pdf_export_form()
+    {
+        $renderer =& $this->defaultRenderer();
+        $renderer->setCustomElementTemplate('<span>{element}</span>');
+        $this->addElement('header', get_lang('ChooseOrientation'));
+        $this->addElement('radio', 'orientation', null, get_lang('Portrait'), 'portrait');
+        $this->addElement('radio', 'orientation', null, get_lang('Landscape'), 'landscape');
+        $this->addButtonExport(get_lang('Export'));
+        $this->setDefaults(array (
+            'orientation' => 'portrait'
+        ));
+    }
 
-	protected function build_export_form()
-	{
-		$this->addElement('header', get_lang('ChooseFormat'));
-		$this->addElement('radio', 'file_type', get_lang('OutputFileType'), 'CSV (Comma-Separated Values)', 'csv');
-		$this->addElement('radio', 'file_type', null, 'XML (Extensible Markup Language)', 'xml');
-		$this->addElement('radio', 'file_type', null, 'PDF (Portable Document Format)', 'pdf');
-		$this->addButtonExport(get_lang('Export'));
-		$this->setDefaults(array (
-			'file_type' => 'csv'
-		));
-	}
+    protected function build_export_form()
+    {
+        $this->addElement('header', get_lang('ChooseFormat'));
+        $this->addElement('radio', 'file_type', get_lang('OutputFileType'), 'CSV (Comma-Separated Values)', 'csv');
+        $this->addElement('radio', 'file_type', null, 'XML (Extensible Markup Language)', 'xml');
+        $this->addElement('radio', 'file_type', null, 'PDF (Portable Document Format)', 'pdf');
+        $this->addButtonExport(get_lang('Export'));
+        $this->setDefaults(array (
+            'file_type' => 'csv'
+        ));
+    }
 
-	protected function build_export_form_option($show_pdf=true)
-	{
-		$this->addElement('header', get_lang('ChooseFormat'));
-		$this->addElement('radio', 'file_type', get_lang('OutputFileType'), 'CSV (Comma-Separated Values)', 'csv');
-		$this->addElement('radio', 'file_type', null, 'XML (Extensible Markup Language)', 'xml');
-		$this->addElement('radio', 'file_type', Display::return_icon('info3.gif',get_lang('ToExportMustLockEvaluation')), 'PDF (Portable Document Format)', 'pdf', array('disabled'));
-		$this->addButtonExport(get_lang('Export'));
-		$this->setDefaults(array (
-			'file_type' => 'csv'
-		));
-	}
+    protected function build_export_form_option($show_pdf=true)
+    {
+        $this->addElement('header', get_lang('ChooseFormat'));
+        $this->addElement('radio', 'file_type', get_lang('OutputFileType'), 'CSV (Comma-Separated Values)', 'csv');
+        $this->addElement('radio', 'file_type', null, 'XML (Extensible Markup Language)', 'xml');
+        $this->addElement(
+            'radio',
+            'file_type',
+            Display::return_icon('info3.gif', get_lang('ToExportMustLockEvaluation')),
+            'PDF (Portable Document Format)',
+            'pdf',
+            array('disabled')
+        );
+        $this->addButtonExport(get_lang('Export'));
+        $this->setDefaults(array (
+            'file_type' => 'csv'
+        ));
+    }
 
-	protected function build_import_form()
-	{
-		$this->addElement('hidden', 'formSent');
-		$this->addElement('header', get_lang('ImportFileLocation'));
-		$this->addElement('file', 'import_file',get_lang('Location'));
-		$allowed_file_types = array (
-			'xml',
-			'csv'
-		);
-		//$this->addRule('file', get_lang('InvalidExtension') . ' (' . implode(',', $allowed_file_types) . ')', 'filetype', $allowed_file_types);
-		$this->addElement('radio', 'file_type', get_lang('FileType'), 'CSV (<a href="docs/example_csv.html" target="_blank">' . get_lang('ExampleCSVFile') . '</a>)', 'csv');
-		$this->addElement('radio', 'file_type', null, 'XML (<a href="docs/example_xml.html" target="_blank">' . get_lang('ExampleXMLFile') . '</a>)', 'xml');
-		$this->addElement('checkbox','overwrite', null,get_lang('OverwriteScores'));
-		$this->addElement('checkbox','ignoreerrors',null,get_lang('IgnoreErrors'));
-		$this->addButtonImport(get_lang('Ok'));
-		$this->setDefaults(array(
-			'formSent' => '1',
-			'file_type' => 'csv'
-		));
-	}
+    protected function build_import_form()
+    {
+        $this->addElement('hidden', 'formSent');
+        $this->addElement('header', get_lang('ImportFileLocation'));
+        $this->addElement('file', 'import_file',get_lang('Location'));
+        $allowed_file_types = array (
+            'xml',
+            'csv'
+        );
+        //$this->addRule('file', get_lang('InvalidExtension') . ' (' . implode(',', $allowed_file_types) . ')', 'filetype', $allowed_file_types);
+        $this->addElement('radio', 'file_type', get_lang('FileType'), 'CSV (<a href="docs/example_csv.html" target="_blank">' . get_lang('ExampleCSVFile') . '</a>)', 'csv');
+        $this->addElement('radio', 'file_type', null, 'XML (<a href="docs/example_xml.html" target="_blank">' . get_lang('ExampleXMLFile') . '</a>)', 'xml');
+        $this->addElement('checkbox', 'overwrite', null, get_lang('OverwriteScores'));
+        $this->addElement('checkbox', 'ignoreerrors', null, get_lang('IgnoreErrors'));
+        $this->addButtonImport(get_lang('Ok'));
+        $this->setDefaults(array(
+            'formSent' => '1',
+            'file_type' => 'csv'
+        ));
+    }
 
-	public function display()
-	{
-		parent :: display();
-	}
+    public function display()
+    {
+        parent :: display();
+    }
 
-	public function setDefaults($defaults = array(), $filter = null)
-	{
-		parent :: setDefaults($defaults, $filter);
-	}
+    public function setDefaults($defaults = array(), $filter = null)
+    {
+        parent :: setDefaults($defaults, $filter);
+    }
 }

+ 121 - 63
main/gradebook/lib/fe/evalform.class.php

@@ -24,12 +24,12 @@ class EvalForm extends FormValidator
 
     /**
      * Builds a form containing form items based on a given parameter
-     * @param int form_type 1=add, 2=edit,3=move,4=result_add
-     * @param obj cat_obj the category object
-     * @param obj res_obj the result object
-     * @param string form name
-     * @param method
-     * @param action
+     * @param int $form_type 1=add, 2=edit,3=move,4=result_add
+     * @param obj $evaluation_object the category object
+     * @param obj $result_object the result object
+     * @param string $form_name
+     * @param string $method
+     * @param string $action
      */
     public function __construct(
         $form_type,
@@ -97,11 +97,17 @@ class EvalForm extends FormValidator
                 $select->addOption($letter, $letter);
             }
         }
-        $select = $this->addElement('select', 'add_users', null, null, array(
-            'multiple' => 'multiple',
-            'size' => '15',
-            'style' => 'width:250px'
-        ));
+        $select = $this->addElement(
+            'select',
+            'add_users',
+            null,
+            null,
+            array(
+                'multiple' => 'multiple',
+                'size' => '15',
+                'style' => 'width:250px',
+            )
+        );
         foreach ($this->evaluation_object->get_not_subscribed_students() as $user) {
             if ((!isset($this->extra)) || empty($this->extra) || api_strtoupper(api_substr($user[1], 0, 1)) == $this->extra) {
                 $select->addoption($user[1] . ' ' . $user[2] . ' (' . $user[3] . ')', $user[0]);
@@ -131,8 +137,8 @@ class EvalForm extends FormValidator
 
         if (api_is_western_name_order()) {
             $renderer->setHeaderTemplate(
-                    '<tr>
-    		       <th>' . get_lang('OfficialCode') . '</th>
+                '<tr>
+    		      <th>' . get_lang('OfficialCode') . '</th>
     		      <th>' . get_lang('UserName') . '</th>
     		      <th>' . get_lang('FirstName') . '</th>
     		      <th>' . get_lang('LastName') . '</th>
@@ -141,8 +147,8 @@ class EvalForm extends FormValidator
             );
         } else {
             $renderer->setHeaderTemplate(
-                    '<tr>
-                   <th>' . get_lang('OfficialCode') . '</th>
+                '<tr>
+                  <th>' . get_lang('OfficialCode') . '</th>
                   <th>' . get_lang('UserName') . '</th>
                   <th>' . get_lang('LastName') . '</th>
                   <th>' . get_lang('FirstName') . '</th>
@@ -151,12 +157,12 @@ class EvalForm extends FormValidator
             );
         }
         $template_submit = '<tr>
-			       <td colspan="4" ></td>
-			      <td >
-			       {element}
-			         <!-- BEGIN error --><br /><span style="color: #ff0000;font-size:10px">{error}</span><!-- END error -->
-			      </td>
-			   </tr>';
+            <td colspan="4" ></td>
+            <td>
+            {element}
+            <!-- BEGIN error --><br /><span style="color: #ff0000;font-size:10px">{error}</span><!-- END error -->
+            </td>
+            </tr>';
 
         $results_and_users = array();
         foreach ($this->result_object as $result) {
@@ -172,14 +178,35 @@ class EvalForm extends FormValidator
             $result = $result_and_user['result'];
 
             $renderer = &$this->defaultRenderer();
-            $this->addText('score[' . $result->get_id() . ']', $this->build_stud_label($user['user_id'], $user['username'], $user['lastname'], $user['firstname']), false, array('class' => "span2",
-                'maxlength' => 5));
+            $this->addText(
+                'score['.$result->get_id().']',
+                $this->build_stud_label($user['user_id'], $user['username'], $user['lastname'], $user['firstname']),
+                false,
+                array(
+                    'class' => "span2",
+                    'maxlength' => 5
+                )
+            );
 
             $this->addRule('score[' . $result->get_id() . ']', get_lang('OnlyNumbers'), 'numeric');
-            $this->addRule(array(
-                'score[' . $result->get_id() . ']', 'maxvalue'), get_lang('OverMax'), 'compare', '<=');
-            $this->addRule(array(
-                'score[' . $result->get_id() . ']', 'minvalue'), get_lang('UnderMin'), 'compare', '>=');
+            $this->addRule(
+                array(
+                    'score['.$result->get_id().']',
+                    'maxvalue',
+                ),
+                get_lang('OverMax'),
+                'compare',
+                '<='
+            );
+            $this->addRule(
+                array(
+                    'score['.$result->get_id().']',
+                    'minvalue',
+                ),
+                get_lang('UnderMin'),
+                'compare',
+                '>='
+            );
             $defaults['score[' . $result->get_id() . ']'] = $result->get_score();
 
             if (api_is_western_name_order()) {
@@ -250,8 +277,8 @@ class EvalForm extends FormValidator
 
         if (api_is_western_name_order()) {
             $renderer->setHeaderTemplate(
-                    '<tr>
-                   <th>' . get_lang('OfficialCode') . '</th>
+                '<tr>
+                  <th>' . get_lang('OfficialCode') . '</th>
                   <th>' . get_lang('UserName') . '</th>
                   <th>' . get_lang('FirstName') . '</th>
                   <th>' . get_lang('LastName') . '</th>
@@ -260,8 +287,8 @@ class EvalForm extends FormValidator
             );
         } else {
             $renderer->setHeaderTemplate(
-                    '<tr>
-                   <th>' . get_lang('OfficialCode') . '</th>
+                '<tr>
+                  <th>' . get_lang('OfficialCode') . '</th>
                   <th>' . get_lang('UserName') . '</th>
                   <th>' . get_lang('LastName') . '</th>
                   <th>' . get_lang('FirstName') . '</th>
@@ -274,14 +301,18 @@ class EvalForm extends FormValidator
         foreach ($tblusers as $user) {
 
             $element_name = 'score[' . $user[0] . ']';
-
             $scoreColumnProperties = array('maxlength' => 5);
             if ($firstUser) {
                 $scoreColumnProperties['autofocus'] = '';
                 $firstUser = false;
             }
             //user_id, user.username, lastname, firstname
-            $this->addText($element_name, $this->build_stud_label($user[0], $user[1], $user[2], $user[3]), false, $scoreColumnProperties);
+            $this->addText(
+                $element_name,
+                $this->build_stud_label($user[0], $user[1], $user[2], $user[3]),
+                false,
+                $scoreColumnProperties
+            );
 
             $this->addRule($element_name, get_lang('OnlyNumbers'), 'numeric');
             $this->addRule(array($element_name, 'maxvalue'), get_lang('OverMax'), 'compare', '<=');
@@ -340,25 +371,31 @@ class EvalForm extends FormValidator
             'maxlength' => '5'
         ));
 
-        /* 		$this->addText('maximum', null, false, array (
-          'size' => '4',
-          'maxlength' => '5',
-          'disabled' => 'disabled'
-          )); */
-
         $this->addButtonSave(get_lang('Edit'), 'submit');
         $this->addElement('hidden', 'minvalue', 0);
         $this->addElement('hidden', 'hid_user_id', $this->result_object->get_user_id());
         $this->addElement('hidden', 'maxvalue', $this->evaluation_object->get_max());
         $this->addRule('score', get_lang('OnlyNumbers'), 'numeric', null, 'client');
-        $this->addRule(array(
-            'score',
-            'maxvalue'
-                ), get_lang('OverMax'), 'compare', '<=', 'client');
-        $this->addRule(array(
-            'score',
-            'minvalue'
-                ), get_lang('UnderMin'), 'compare', '>=', 'client');
+        $this->addRule(
+            array(
+                'score',
+                'maxvalue',
+            ),
+            get_lang('OverMax'),
+            'compare',
+            '<=',
+            'client'
+        );
+        $this->addRule(
+            array(
+                'score',
+                'minvalue',
+            ),
+            get_lang('UnderMin'),
+            'compare',
+            '>=',
+            'client'
+        );
     }
 
     /**
@@ -441,7 +478,13 @@ class EvalForm extends FormValidator
         if (count($all_categories) == 1) {
             $this->addElement('hidden', 'hid_category_id', $cat_id);
         } else {
-            $select_gradebook = $this->addElement('select', 'hid_category_id', get_lang('SelectGradebook'), array(), array('id' => 'hid_category_id'));
+            $select_gradebook = $this->addElement(
+                'select',
+                'hid_category_id',
+                get_lang('SelectGradebook'),
+                array(),
+                array('id' => 'hid_category_id')
+            );
             $this->addRule('hid_category_id', get_lang('ThisFieldIsRequired'), 'nonzero');
 
             $default_weight = 0;
@@ -469,11 +512,19 @@ class EvalForm extends FormValidator
             }
         }
 
-        $this->addText('weight_mask', array(get_lang('Weight'), null, ' [0 .. <span id="max_weight">' . $all_categories[0]->get_weight() . '</span>] '), true, array(
-            'size' => '4',
-            'maxlength' => '5',
-            'class' => 'span1'
-        ));
+        $this->addText(
+            'weight_mask',
+            array(
+                get_lang('Weight'),
+                null,
+                ' [0 .. <span id="max_weight">'.$all_categories[0]->get_weight().'</span>] ',
+            ),
+            true,
+            array(
+                'size' => '4',
+                'maxlength' => '5'
+            )
+        );
 
         /* $this->addText('weight', array(null, null, '/ <span id="max_weight">'.$default_weight.'</span>'), true, array (
           'size' => '4',
@@ -484,16 +535,24 @@ class EvalForm extends FormValidator
 
         if ($edit) {
             if (!$this->evaluation_object->has_results()) {
-                $this->addText('max', get_lang('QualificationNumeric'), true, array(
-                    'class' => 'span1',
-                    'maxlength' => '5'
-                ));
+                $this->addText(
+                    'max',
+                    get_lang('QualificationNumeric'),
+                    true,
+                    array(
+                        'maxlength' => '5'
+                    )
+                );
             } else {
-                $this->addText('max', array(get_lang('QualificationNumeric'), get_lang('CannotChangeTheMaxNote')), false, array(
-                    'class' => 'span1',
-                    'maxlength' => '5',
-                    'disabled' => 'disabled'
-                ));
+                $this->addText(
+                    'max',
+                    array(get_lang('QualificationNumeric'), get_lang('CannotChangeTheMaxNote')),
+                    false,
+                    array(
+                        'maxlength' => '5',
+                        'disabled' => 'disabled'
+                    )
+                );
             }
         } else {
             $this->addText('max', get_lang('QualificationNumeric'), true, array(
@@ -506,7 +565,6 @@ class EvalForm extends FormValidator
         }
 
         $this->addElement('textarea', 'description', get_lang('Description'));
-
         $this->addRule('hid_category_id', get_lang('ThisFieldIsRequired'), 'required');
         $this->addElement('checkbox', 'visible', null, get_lang('Visible'));
         $this->addRule('weight_mask', get_lang('OnlyNumbers'), 'numeric');

BIN
main/img/icons/64/file_upload.png


+ 5 - 2
main/img/icons/svg/file_upload.svg

@@ -33,7 +33,7 @@
      inkscape:cx="107.85434"
      inkscape:cy="-12.45216"
      inkscape:window-x="41"
-     inkscape:window-y="21"
+     inkscape:window-y="333"
      inkscape:window-maximized="1"
      inkscape:current-layer="g4175" />
   <svg:metadata
@@ -131,7 +131,10 @@
      transform="translate(0,290.13333)">
     <svg:g
        id="g4188"
-       transform="matrix(0.48735366,0,0,0.48735366,2.1440667,-288.72099)">
+       transform="matrix(0.48735366,0,0,0.48735366,2.1440667,-288.72099)"
+       inkscape:export-filename="/var/www/chamilo11/main/img/icons/64/file_upload.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90">
       <svg:g
          id="back"
          style="font-size:12px;stroke:#000000">

+ 2 - 2
main/inc/ajax/install.ajax.php

@@ -38,7 +38,7 @@ switch ($action) {
 
                 // save contact information with web service
                 // create a client
-                $client = new nusoap_client('http://version.chamilo.org/contact.php?wsdl', true);
+                $client = new SoapClient('https://version.chamilo.org/contact.php?wsdl');
 
                 // call method ws_add_contact_information
                 $contact_params = array(
@@ -53,7 +53,7 @@ switch ($action) {
                                         'company_city' => $company_city
                                     );
 
-                $result = $client->call('ws_add_contact_information', array('contact_params' => $contact_params));
+                $result = $client->__soapCall('ws_add_contact_information', array('contact_params' => $contact_params));
 
                 echo $result;
             }

+ 22 - 10
main/inc/ajax/lp.ajax.php

@@ -297,40 +297,50 @@ exit;
  * Classes to create a special data structure to manipulate LP Items
  * used only in this file
  * @todo move in a file
+ * @todo use PSR
  */
-class LP_item_order_list {
+
+class LP_item_order_list
+{
     public $list = array();
 
-    public function __construct() {
+    public function __construct()
+    {
         $this->list = array();
     }
 
-    public function add($in_LP_item_order_item) {
+    public function add($in_LP_item_order_item)
+    {
         $this->list[] = $in_LP_item_order_item;
     }
 
-    public function get_item_with_same_parent($in_parent_id) {
+    public function get_item_with_same_parent($in_parent_id)
+    {
         $out_res = new LP_item_order_list();
-        for ($i=0; $i < count($this->list); $i++) {
+        for ($i = 0; $i < count($this->list); $i++) {
             if ($this->list[$i]->parent_item_id == $in_parent_id) {
                 $out_res->add($this->list[$i]);
             }
         }
+
         return $out_res;
     }
 
-    public function get_list_of_parents() {
+    public function get_list_of_parents()
+    {
         $tab_out_res = array();
         foreach ($this->list as $LP_item) {
             if (!in_array($LP_item->parent_item_id, $tab_out_res)) {
                 $tab_out_res[] = $LP_item->parent_item_id;
             }
         }
+
         return $tab_out_res;
     }
 
-    public function set_parameters_for_id($in_id, $in_value, $in_parameters) {
-        for ($i=0; $i < count($this->list); $i++) {
+    public function set_parameters_for_id($in_id, $in_value, $in_parameters)
+    {
+        for ($i = 0; $i < count($this->list); $i++) {
             if ($this->list[$i]->id == $in_id) {
                 $this->list[$i]->$in_parameters = $in_value;
                 break;
@@ -340,14 +350,16 @@ class LP_item_order_list {
 
 }
 
-class LP_item_order_item {
+class LP_item_order_item
+{
     public $id = 0;
     public $parent_item_id = 0;
     public $previous_item_id = 0;
     public $next_item_id = 0;
     public $display_order = 0;
 
-    public function __construct($in_id=0, $in_parent_id=0) {
+    public function __construct($in_id = 0, $in_parent_id = 0)
+    {
         $this->id = $in_id;
         $this->parent_item_id = $in_parent_id;
     }

+ 18 - 15
main/inc/ajax/message.ajax.php

@@ -29,29 +29,29 @@ switch ($action) {
         $subject = isset($_REQUEST['subject']) ? trim($_REQUEST['subject']) : null;
         $invitationContent = isset($_REQUEST['content']) ? trim($_REQUEST['content']) : null;
 
-        SocialManager::send_invitation_friend_user($_REQUEST['user_id'], $subject, $invitationContent);
+        SocialManager::sendInvitationToUser($_REQUEST['user_id'], $subject, $invitationContent);
         break;
     case 'find_users':
         if (api_is_anonymous()) {
             echo '';
             break;
         }
-        $track_online_table      = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ONLINE);
-        $tbl_my_user		     = Database::get_main_table(TABLE_MAIN_USER);
-        $tbl_my_user_friend      = Database::get_main_table(TABLE_MAIN_USER_REL_USER);
-        $tbl_user 			     = Database::get_main_table(TABLE_MAIN_USER);
-        $tbl_access_url_rel_user = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
-        $search				     = Database::escape_string($_REQUEST['q']);
+        $track_online_table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ONLINE);
+        $tbl_my_user = Database::get_main_table(TABLE_MAIN_USER);
+        $tbl_my_user_friend = Database::get_main_table(TABLE_MAIN_USER_REL_USER);
+        $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
+        $tbl_access_url_rel_user = Database:: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+        $search = Database::escape_string($_REQUEST['q']);
 
-        $access_url_id           = api_get_multiple_access_url() == 'true' ? api_get_current_access_url_id() : 1;
-        $user_id                 = api_get_user_id();
-        $is_western_name_order   = api_is_western_name_order();
+        $access_url_id = api_get_multiple_access_url() == 'true' ? api_get_current_access_url_id() : 1;
+        $user_id = api_get_user_id();
+        $is_western_name_order = api_is_western_name_order();
 
         $likeCondition = " AND (firstname LIKE '%$search%' OR lastname LIKE '%$search%' OR email LIKE '%$search%') ";
 
-        if (api_get_setting('allow_social_tool')=='true' && api_get_setting('allow_message_tool') == 'true') {
+        if (api_get_setting('allow_social_tool') === 'true' && api_get_setting('allow_message_tool') === 'true') {
             // All users
-            if (api_get_setting('allow_send_message_to_all_platform_users') == 'true' || api_is_platform_admin() ) {
+            if (api_get_setting('allow_send_message_to_all_platform_users') === 'true' || api_is_platform_admin() ) {
                 if ($access_url_id != 0) {
                     $sql = "SELECT DISTINCT u.user_id as id, u.firstname, u.lastname, u.email
                             FROM $tbl_user u LEFT JOIN $tbl_access_url_rel_user r ON u.user_id = r.user_id
@@ -97,8 +97,11 @@ switch ($action) {
                                 $likeCondition";
                 }
             }
-        } elseif (api_get_setting('allow_social_tool')=='false' && api_get_setting('allow_message_tool')=='true') {
-            if (api_get_setting('allow_send_message_to_all_platform_users') == 'true') {
+        } elseif (
+            api_get_setting('allow_social_tool') === 'false' &&
+            api_get_setting('allow_message_tool') === 'true'
+        ) {
+            if (api_get_setting('allow_send_message_to_all_platform_users') === 'true') {
                 $sql = "SELECT DISTINCT u.user_id as id, u.firstname, u.lastname, u.email
                         FROM $tbl_user u LEFT JOIN $tbl_access_url_rel_user r ON u.user_id = r.user_id
                         WHERE
@@ -109,7 +112,7 @@ switch ($action) {
             } else {
                 $time_limit = api_get_setting('time_limit_whosonline');
                 $online_time = time() - $time_limit*60;
-                $limit_date	 = api_get_utc_datetime($online_time);
+                $limit_date	= api_get_utc_datetime($online_time);
                 $sql = "SELECT SELECT DISTINCT u.user_id as id, u.firstname, u.lastname, u.email
                         FROM $tbl_my_user u INNER JOIN $track_online_table t
                         ON u.user_id=t.login_user_id

+ 2 - 2
main/inc/ajax/myspace.ajax.php

@@ -20,7 +20,7 @@ switch ($action) {
         if ($range == 1) {
             $start_date = Security::remove_XSS($_REQUEST['sd']);
             $end_date = Security::remove_XSS($_REQUEST['ed']);
-            $sql_result = get_connections_to_course_by_date(
+            $sql_result = MySpace::get_connections_to_course_by_date(
                 $user_id,
                 $courseId,
                 $start_date,
@@ -47,7 +47,7 @@ switch ($action) {
         $courseInfo = api_get_course_info($course_code);
         $courseId = $courseInfo['real_id'];
 
-        $sql_result = get_connections_to_course_by_date(
+        $sql_result = MySpace::get_connections_to_course_by_date(
             $user_id,
             $courseId,
             $start_date,

+ 28 - 52
main/inc/global_error_message.inc.php

@@ -55,56 +55,28 @@ if (is_int($global_error_code) && $global_error_code > 0) {
     } else {
         $theme = 'chamilo';
     }
+
+    $root_rel = '';
+    $installation_guide_url = $root_rel.'documentation/installation_guide.html';
     
     $css_path = 'app/Resources/public/css/';
     $css_web_assets = 'web/assets/';
     $css_web_path = 'web/css/';
     $themePath = $css_path.'themes/'.$theme.'/default.css';
-    $css_web_fontawesome = $css_web_assets.'fontawesome/css/font-awesome.css';
     $bootstrap_file = $css_web_assets.'bootstrap/dist/css/bootstrap.min.css';
     $css_base_file = $css_web_path.'base.css';
 
-    $css_list = array($bootstrap_file,$css_web_fontawesome, $css_base_file, $themePath);
+    $css_list = array($bootstrap_file, $css_base_file, $themePath);
 
     $web_img = 'main/img';
-    $root_sys = str_replace('\\', '/', realpath(dirname(__FILE__).'/../../')).'/';
-    
-    $root_rel = htmlentities($_SERVER['PHP_SELF']);
-    if (!empty($root_rel)) {
-        // If we could obtain a relative path for the chamilo dir from the $_SERVER array
-        $pos = strrpos($root_rel, '/'); //search for last "/" in path
-        $root_rel = substr($root_rel, 0, $pos - strlen($root_rel) + 1);
-        if (strpos($root_rel, '/main/') !== false) {
-            // If the current path contains '/main/', then
-            $pos = 0;
-            while (($test_pos = strpos(substr($root_rel, $pos, strlen($root_rel)), '/main/')) !== false) {
-                $pos = $test_pos + 1;
-            }
-            $root_rel = substr($root_rel, 0, $pos);
-        } elseif (strpos($root_rel, '/courses/') !== false && function_exists('api_get_path') && strpos($root_rel, api_get_path(REL_COURSE_PATH)) !== false) {
-            $pos = 0;
-            while (($test_pos = strpos(substr($root_rel, $pos, strlen($root_rel)), api_get_path(REL_COURSE_PATH))) !== false) {
-                $pos = $test_pos + 1;
-            }
-            $root_rel = substr($root_rel, 0, $pos);
-        } elseif (!function_exists('api_get_path')) {
-            // Sometimes the api_get_path() function might be unavailable (system not installed, for example)
-            // In this case, we assume the root folder, although this might trigger issues with Chamilo installed in a subfolder
-            $root_rel = '/';
-        }
-    }
-
-    $installation_guide_url = $root_rel.'documentation/installation_guide.html';
+    $root_sys = str_replace('\\', '/', realpath(__DIR__.'/../../')).'/';
 
     $css_def = '';
-    foreach ($css_list as $css_item) {
-        $css_base_chamilo_file = $css_item;
-        
-        if (file_exists($css_base_chamilo_file)) {
-            $css_def .= '<link rel="stylesheet" href="'.$css_base_chamilo_file.'">'.PHP_EOL;
-            //$css_def .= @file_get_contents($css_base_chamilo_file);
+    foreach ($css_list as $cssFile) {
+        $cssFile = $root_sys.$cssFile;
+        if (file_exists($cssFile)) {
+            $css_def .= file_get_contents($cssFile);
         }
-        
     }
 
     $global_error_message = array();
@@ -142,7 +114,7 @@ if (is_int($global_error_code) && $global_error_code > 0) {
                     <p class="text">Let\'s start hunting skills down with Chamilo LMS! This wizard will guide you through the Chamilo installation and configuration process.</p>
                           <p class="download-info">
                               <button class="btn btn-primary btn-lg" type="submit" value="INSTALL Chamilo" ><i class="fa fa-download" aria-hidden="true"></i> Install Chamilo</button>
-                              <a class="btn btn-success btn-lg" href="'.$installation_guide_url.'" target="_blank"> <em class="fa fa-file-text-o"></em> '.$read_installation_guide.'</a>
+                              <a class="btn btn-success btn-lg" href="'.$installation_guide_url.'" target="_blank"> '.$read_installation_guide.'</a>
                           </p>
                     </div>
                 </div>
@@ -180,19 +152,17 @@ if (is_int($global_error_code) && $global_error_code > 0) {
     $bgMoon = base64_encode(file_get_contents("$root_sys/main/img/bg_moon_two.png"));
     $installChamiloImage = "data:image/png;base64,".base64_encode(file_get_contents("$root_sys/main/img/mr_chamilo_install.png"));
     $global_error_message['mr_chamilo'] = $installChamiloImage;
-    
+
     $global_error_message_page =
 <<<EOM
 <!DOCTYPE html>
 <html>
 		<head>
 			<title>{TITLE}</title>
-            <meta charset="{ENCODING}" />
-            
-            $css_def
-            
-
-            <style type="text/css">
+            <meta charset="{ENCODING}" />            
+                        
+            <style>
+                $css_def                
                 html, body {min-height:100%; padding:0; margin:0;}
             
                 #wrapper {padding:0; position:absolute; top:0; bottom:0; left:0; right:0;}
@@ -220,8 +190,6 @@ if (is_int($global_error_code) && $global_error_code > 0) {
                     -ms-animation: animatedBackground 40s linear infinite;
                     -moz-animation: animatedBackground 40s linear infinite;
                     -webkit-animation: animatedBackground 40s linear infinite;
-                    
-                    
                 }
                 .installer{
                     background: url("data:image/png;base64,$bgMoon") no-repeat center 390px;
@@ -260,13 +228,21 @@ if (is_int($global_error_code) && $global_error_code > 0) {
             </header>
             <div id="content">
                 <div class="container">
-                <div class="welcome-install">
-                    <div class="avatar">
+                    <div class="welcome-install">
+                        <div class="avatar">
                             <img class="img-responsive" src="{MR_CHAMILO}"/>
+                        </div>
+                        <div class="row">
+                            <div class="col-md-12">
+                                <div class="office">
+                                    <p class="text">
+                                    {DESCRIPTION}
+                                    {CODE}
+                                    </p>
+                                </div>
+                            </div>
+                        </div>
                     </div>
-                    {DESCRIPTION}
-                    {CODE}
-                </div>
                 </div>
             </div>
         </div>

+ 3 - 8
main/inc/lib/MoodleImport.class.php → main/inc/lib/MoodleImport.php

@@ -267,6 +267,7 @@ class MoodleImport
         }
 
         removeDir($destinationDir);
+
         return $packageContent[$mainFileKey];
     }
 
@@ -563,7 +564,6 @@ class MoodleImport
             case 'match':
                 return FILL_IN_BLANKS;
                 break;
-            case 'match':
             case 'essay':
                 return FREE_ANSWER;
                 break;
@@ -625,9 +625,7 @@ class MoodleImport
 
                 $answerOptionsWeight = substr($answerOptionsWeight, 0, -1);
                 $answerOptionsSize = substr($answerOptionsSize, 0, -1);
-
                 $answerOptions = $answerOptionsWeight.':'.$answerOptionsSize.':0@';
-
                 $placeholder = $placeholder.PHP_EOL.$answerOptions;
 
                 // This is a minor trick to clean the question description that in a multianswer is the main placeholder
@@ -657,9 +655,7 @@ class MoodleImport
 
                 $answerOptionsWeight = substr($answerOptionsWeight, 0, -1);
                 $answerOptionsSize = substr($answerOptionsSize, 0, -1);
-
                 $answerOptions = $answerOptionsWeight.':'.$answerOptionsSize.':0@';
-
                 $placeholder = $placeholder.PHP_EOL.$answerOptions;
 
                 // sets the total weighting of the question
@@ -884,11 +880,10 @@ class MoodleImport
             foreach ($activities as $activity) {
 
                 $currentItem = [];
-
                 $thisIsAnInvalidItem = false;
 
                 if ($activity->childNodes->length) {
-                    foreach ($activity->childNodes as $item ) {
+                    foreach ($activity->childNodes as $item) {
                         if ($item->nodeName == 'component' && $item->nodeValue == 'mod_resource') {
                             $thisIsAnInvalidItem = true;
                         }
@@ -937,7 +932,7 @@ class MoodleImport
             if (is_array($value)) {
                 $this->traverseArray($value, $keys);
             } else {
-                if (in_array($key, $keys)){
+                if (in_array($key, $keys)) {
                     unset($array[$key]);
                 }
             }

+ 32 - 30
main/inc/lib/TicketManager.php

@@ -251,13 +251,14 @@ class TicketManager
 
     /**
      * Inserts a new ticket in the corresponding tables
-     * @param $category_id
-     * @param $course_id
-     * @param $project_id
-     * @param $other_area
-     * @param $email
-     * @param $subject
-     * @param $content
+     * @param int $category_id
+     * @param int $course_id
+     * @param int $sessionId
+     * @param int $project_id
+     * @param string $other_area
+     * @param string $email
+     * @param string $subject
+     * @param string $content
      * @param string $personalEmail
      * @param $file_attachments
      * @param string $source
@@ -433,8 +434,7 @@ class TicketManager
                     </table>';
 
             if (empty($category_id)) {
-
-                if (api_get_setting('ticket_send_warning_to_all_admins') == 'true') {
+                if (api_get_setting('ticket_send_warning_to_all_admins') === 'true') {
                     $warningSubject = sprintf(
                         get_lang('TicketXCreatedWithNoCategory'),
                         $ticket_code
@@ -458,7 +458,7 @@ class TicketManager
 
                 $message = '<h2>'.get_lang('TicketInformation').'</h2><br />'.$helpDeskMessage;
 
-                if (api_get_setting('ticket_warn_admin_no_user_in_category') == 'true') {
+                if (api_get_setting('ticket_warn_admin_no_user_in_category') === 'true') {
                     $usersInCategory = TicketManager::getUsersInCategory($category_id);
                     if (empty($usersInCategory)) {
                         $subject = sprintf(
@@ -466,7 +466,7 @@ class TicketManager
                             $categoryInfo['name']
                         );
 
-                        if (api_get_setting('ticket_send_warning_to_all_admins') == 'true') {
+                        if (api_get_setting('ticket_send_warning_to_all_admins') === 'true') {
                             Display::addFlash(Display::return_message(
                                 sprintf(
                                     get_lang('CategoryWithNoUserNotificationSentToAdmins'),
@@ -535,7 +535,11 @@ class TicketManager
                 $studentMessage = sprintf(get_lang('YourQuestionWasSentToTheResponableAreaX'), $email, $email);
                 $studentMessage .= sprintf(get_lang('YourAnswerToTheQuestionWillBeSentToX'), $personalEmail);
                 self::insert_message(
-                    $ticket_id, get_lang('MessageResent'), $studentMessage, null, 1
+                    $ticket_id,
+                    get_lang('MessageResent'),
+                    $studentMessage,
+                    null,
+                    1
                 );
             }
 
@@ -565,8 +569,7 @@ class TicketManager
         $table_support_tickets = Database::get_main_table(TABLE_TICKET_TICKET);
         $table_support_assigned_log = Database::get_main_table(TABLE_TICKET_ASSIGNED_LOG);
         $now = api_get_utc_datetime();
-
-        $ticket = self::get_ticket_detail_by_id($ticket_id, $user_id);
+        $ticket = self::get_ticket_detail_by_id($ticket_id);
 
         if ($ticket) {
             $ticket = $ticket['ticket'];
@@ -656,7 +659,7 @@ class TicketManager
         $status = 'NOL',
         $sendConfirmation = false
     ) {
-        global $data_files, $plugin;
+        global $data_files;
         $ticket_id = intval($ticket_id);
         $user_id = intval($user_id);
         $table_support_messages = Database::get_main_table(TABLE_TICKET_MESSAGE);
@@ -829,9 +832,6 @@ class TicketManager
         $table_support_tickets = Database::get_main_table(TABLE_TICKET_TICKET);
         $table_support_priority = Database::get_main_table(TABLE_TICKET_PRIORITY);
         $table_support_status = Database::get_main_table(TABLE_TICKET_STATUS);
-        $table_support_messages = Database::get_main_table(TABLE_TICKET_MESSAGE);
-        $table_main_user = Database::get_main_table(TABLE_MAIN_USER);
-        $table_main_admin = Database::get_main_table(TABLE_MAIN_ADMIN);
         $direction = !empty($direction) ? $direction : 'DESC';
         $user_id = !empty($user_id) ? $user_id : api_get_user_id();
         $isAdmin = UserManager::is_admin($user_id);
@@ -1047,8 +1047,10 @@ class TicketManager
                     $actions .= '<img src="' . $webCodePath . 'img/exclamation.png" border="0" />';
                 }
                 $row['col0'] = Display::return_icon(
-                                $img_source, get_lang('Info')
-                        ) . '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . $row['code'] . '</a>';
+                        $img_source,
+                        get_lang('Info')
+                        ).
+                    '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . $row['code'] . '</a>';
                 // @todo fix
                 /*if ($row['col7'] == 'PENDIENTE') {
                     $row['col7'] = '<span style="color: #f00; font-weight:bold;">' . $row['col7'] . '</span>';
@@ -1062,14 +1064,14 @@ class TicketManager
                     $name,
                     $row['assigned_last_user'],
                     $row['col7'],
-                    $row['col8'],
+                    $row['col8']
                 );
             } else {
                 $actions = '';
                 $row['col0'] = Display::return_icon(
-                        $img_source,
-                        get_lang('Info')
-                    ) . '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . $row['code'] . '</a>';
+                    $img_source,
+                    get_lang('Info')
+                ) . '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . $row['code'] . '</a>';
                 $now = api_strtotime(api_get_utc_datetime());
                 $last_edit_date = api_strtotime($row['sys_lastedit_datetime']);
                 $dif = $now - $last_edit_date;
@@ -1267,14 +1269,11 @@ class TicketManager
 
     /**
      * @param int $ticket_id
-     * @param int $user_id
      * @return array
      */
-    public static function get_ticket_detail_by_id($ticket_id, $user_id)
+    public static function get_ticket_detail_by_id($ticket_id)
     {
         $ticket_id = intval($ticket_id);
-        $user_id = intval($user_id);
-
         $table_support_category = Database::get_main_table(
             TABLE_TICKET_CATEGORY
         );
@@ -1296,7 +1295,7 @@ class TicketManager
                     cat.name,
                     status.name as status, 
                     priority.name priority
-                    FROM $table_support_tickets ticket,
+                FROM $table_support_tickets ticket,
                     $table_support_category cat ,
                     $table_support_priority priority,
                     $table_support_status status
@@ -1431,7 +1430,7 @@ class TicketManager
     public static function sendNotification($ticketId, $userId, $title, $message)
     {
         $userInfo = api_get_user_info($userId);
-        $ticketInfo = self::get_ticket_detail_by_id($ticketId, $userId);
+        $ticketInfo = self::get_ticket_detail_by_id($ticketId);
         $requestUserInfo = $ticketInfo['usuario'];
         $ticketCode = $ticketInfo['ticket']['code'];
         $status = $ticketInfo['ticket']['status'];
@@ -2296,6 +2295,9 @@ class TicketManager
         return $form;
     }
 
+    /**
+     * @return string
+     */
     public static function getSettingsMenu()
     {
         $items = [

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

@@ -201,14 +201,13 @@ class AddCourse
     public static function get_course_tables()
     {
         $tables = array();
-
+        $tables[] = 'item_property';
         $tables[] = 'tool';
         $tables[] = 'tool_intro';
         $tables[] = 'group_info';
         $tables[] = 'group_category';
         $tables[] = 'group_rel_user';
         $tables[] = 'group_rel_tutor';
-        $tables[] = 'item_property';
         $tables[] = 'userinfo_content';
         $tables[] = 'userinfo_def';
         $tables[] = 'course_description';

+ 11 - 3
main/inc/lib/api.lib.php

@@ -1329,6 +1329,12 @@ function _api_format_user($user, $add_password = false)
         'last_login',
         'profile_completed'
     );
+    if (api_get_setting('extended_profile') === 'true') {
+        $attributes[] = 'competences';
+        $attributes[] = 'diplomas';
+        $attributes[] = 'teach';
+        $attributes[] = 'openarea';
+    }
 
     foreach ($attributes as $attribute) {
         $result[$attribute] = isset($user[$attribute]) ? $user[$attribute] : null;
@@ -1623,14 +1629,16 @@ function api_get_cidreq_params($courseCode, $sessionId = 0, $groupId = 0)
  *
  * @param bool $addSessionId
  * @param bool $addGroupId
+ * @param string $origin
+ *
  * @return  string  Course & session references to add to a URL
  *
  */
-function api_get_cidreq($addSessionId = true, $addGroupId = true)
+function api_get_cidreq($addSessionId = true, $addGroupId = true, $origin = '')
 {
     $courseCode = api_get_course_id();
     $url = empty($courseCode) ? '' : 'cidReq='.htmlspecialchars($courseCode);
-    $origin = api_get_origin();
+    $origin = empty($origin) ? api_get_origin() : Security::remove_XSS($origin);
 
     if ($addSessionId) {
         if (!empty($url)) {
@@ -7500,7 +7508,7 @@ function convert_double_quote_to_single($in_text) {
 function api_get_origin()
 {
     if (isset($_REQUEST['origin'])) {
-        return $_REQUEST['origin'] == 'learnpath' ? 'learnpath' : null;
+        return $_REQUEST['origin'] === 'learnpath' ? 'learnpath' : '';
     }
 
     return null;

+ 7 - 3
main/inc/lib/banner.lib.php

@@ -597,8 +597,9 @@ function return_breadcrumb($interbreadcrumb, $language_file, $nameTools)
                 continue;
             }
             if ($breadcrumb_step['url'] != '#') {
-                $sep = (strrchr($breadcrumb_step['url'], '?') ? '&amp;' : '?');
-                $navigation_item['url'] = $breadcrumb_step['url'].$sep.api_get_cidreq();
+                $sep = strrchr($breadcrumb_step['url'], '?') ? '&' : '?';
+                $courseParams = strpos($breadcrumb_step['url'], 'cidReq') === false ? api_get_cidreq() : '';
+                $navigation_item['url'] = $breadcrumb_step['url'].$sep.$courseParams;
             } else {
                 $navigation_item['url'] = '#';
             }
@@ -628,6 +629,7 @@ function return_breadcrumb($interbreadcrumb, $language_file, $nameTools)
             // we cut the string depending of the MAX_LENGTH_BREADCRUMB value
             $navigation_item['title'] = cut($navigation_item['title'], MAX_LENGTH_BREADCRUMB);
             $navigation_item['title'] = Security::remove_XSS($navigation_item['title']);
+
             $navigation[] = $navigation_item;
         }
     }
@@ -650,6 +652,7 @@ function return_breadcrumb($interbreadcrumb, $language_file, $nameTools)
         }
     }
 
+
     // part 3: The tool itself. If we are on the course homepage we do not want
     // to display the title of the course because this
     // is the same as the first part of the breadcrumbs (see part 1)
@@ -672,6 +675,7 @@ function return_breadcrumb($interbreadcrumb, $language_file, $nameTools)
         }
     }
 
+
     $html = '';
 
     /* Part 4 . Show the teacher view/student view button at the right of the breadcrumb */
@@ -724,8 +728,8 @@ function return_breadcrumb($interbreadcrumb, $language_file, $nameTools)
             $html .= $view;
             $html .= Display::tag('ul', $lis, array('class'=>'breadcrumb'));
         }
-    }
 
+    }
     return $html;
 }
 

+ 2 - 2
main/inc/lib/course.lib.php

@@ -2238,10 +2238,10 @@ class CourseManager
             }
 
             // Cleaning groups
-            $groups = GroupManager::get_groups();
+            $groups = GroupManager::get_groups($courseId);
             if (!empty($groups)) {
                 $groupList = array_column($groups, 'id');
-                GroupManager::delete_groups($groupList);
+                GroupManager::delete_groups($groupList, $course['code']);
             }
 
             // Cleaning c_x tables

+ 24 - 13
main/inc/lib/course_home.lib.php

@@ -1171,14 +1171,24 @@ class CourseHome
         $navigation_items = self::get_navigation_items(true);
         $course_id = api_get_course_id();
 
-        $html = '<div id="toolnav">'
-                . '<div class="btn-tool">'
-                . '<a class="btn btn-default" href="javascript: void(0);" id="swap_menu_link" onclick="javascript: swap_menu();">'.Display::returnFontAwesomeIcon('bars').'</a></div>';
+        $html = '<div id="toolnav">';
         if (api_get_setting('show_navigation_menu') == 'icons') {
             $html .= self::show_navigation_tool_shortcuts($orientation = SHORTCUTS_VERTICAL);
         } else {
-            $html .= '<div id="toolnavbox">';
-            $html .= '<ul>';
+            $html .= '<script>$(function() {
+                $("#toolnavbox a").stop().animate({"margin-left":"-160px"},1000);
+                $("#toolnavbox > li").hover(
+                    function () {
+                        $("a",$(this)).stop().animate({"margin-left":"-2px"},200);
+                        $("span",$(this)).css("display","block");
+                    },
+                    function () {
+                        $("a",$(this)).stop().animate({"margin-left":"-160px"},200);
+                        $("span",$(this)).css("display","initial");
+                    }
+                );
+            });</script>';
+            $html .= '<ul id="toolnavbox">';
             $count = 0;
             foreach ($navigation_items as $key => $navigation_item) {
                 //students can't see the course settings option
@@ -1193,9 +1203,9 @@ class CourseHome
                 if (strpos($navigation_item['link'], 'chat') !== false &&
                     api_get_course_setting('allow_open_chat_window', $course_id)
                 ) {
-                    $html .= '<a class="btn btn-default" href="javascript: void(0);" onclick="javascript: window.open(\''.$navigation_item['link'].'\',\'window_chat'.$_SESSION['_cid'].'\',config=\'height=\'+600+\', width=\'+825+\', left=2, top=2, toolbar=no, menubar=no, scrollbars=yes, resizable=yes, location=no, directories=no, status=no\')" target="'.$navigation_item['target'].'"';
+                    $html .= '<a class="btn btn-default text-left" href="javascript: void(0);" onclick="javascript: window.open(\''.$navigation_item['link'].'\',\'window_chat'.$_SESSION['_cid'].'\',config=\'height=\'+600+\', width=\'+825+\', left=2, top=2, toolbar=no, menubar=no, scrollbars=yes, resizable=yes, location=no, directories=no, status=no\')" target="'.$navigation_item['target'].'"';
                 } else {
-                    $html .= '<a class="btn btn-default" href="'.$navigation_item['link'].'" target="_top" ';
+                    $html .= '<a class="btn btn-default text-left" href="'.$navigation_item['link'].'" target="_top" ';
                 }
 
                 if (stristr($url_item['path'], $url_current['path'])) {
@@ -1204,18 +1214,19 @@ class CourseHome
                     }
                 }
                 $html .= ' title="'.$navigation_item['name'].'">';
-                if (api_get_setting('show_navigation_menu') != 'text') {
-                    $html .= '<div class="pull-left">'.Display::return_icon(substr($navigation_item['image'],0,-3)."png", $navigation_item['name'], array('class'=>'tool-img'), ICON_SIZE_SMALL).'</div>';
-                }
                 if (api_get_setting('show_navigation_menu') != 'icons') {
-                    $html .= '<span class="tool-text-'.$count.'">'.$navigation_item['name'].'</span>';
+                    $html .= $navigation_item['name'];
+                }
+                if (api_get_setting('show_navigation_menu') != 'text') {
+                    $html .= Display::return_icon(substr($navigation_item['image'],0,-3)."png", $navigation_item['name'], array('class'=>'tool-img'), ICON_SIZE_SMALL);
                 }
                 $html .= '</a>';
                 $html .= '</li>';
             }
-            $html .= '</ul></div>';
+            $html .= '</ul>';
         }
-        $html .= '</div><!-- end "#toolnav" -->';
+        $html .= '</div>';
+        
 
         return $html;
     }

+ 10 - 0
main/inc/lib/diagnoser.lib.php

@@ -326,6 +326,16 @@ class Diagnoser
                 'expected' => 2,
                 'comment' => get_lang('ExtensionShouldBeLoaded'),
             ),
+            'Zend OPcache' => array(
+                'link' => 'http://www.php.net/opcache',
+                'expected' => 2,
+                'comment' => get_lang('ExtensionShouldBeLoaded'),
+            ),
+            'apcu' => array(
+                'link' => 'http://www.php.net/apcu',
+                'expected' => 2,
+                'comment' => get_lang('ExtensionShouldBeLoaded'),
+            ),
         );
 
         foreach ($extensions as $extension => $data) {

+ 29 - 13
main/inc/lib/document.lib.php

@@ -747,7 +747,8 @@ class DocumentManager
     public static function get_all_document_folders(
         $_course,
         $to_group_id = 0,
-        $can_see_invisible = false
+        $can_see_invisible = false,
+        $getInvisibleList = false
     ) {
         $TABLE_ITEMPROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
         $TABLE_DOCUMENT = Database::get_course_table(TABLE_DOCUMENT);
@@ -778,7 +779,7 @@ class DocumentManager
             $session_id = api_get_session_id();
             $condition_session = api_get_session_condition($session_id, true, false, 'docs.session_id');
             $show_users_condition = "";
-            if (api_get_setting('show_users_folders') == 'false') {
+            if (api_get_setting('show_users_folders') === 'false') {
                 $show_users_condition = " AND docs.path NOT LIKE '%shared_folder%'";
             }
 
@@ -797,7 +798,7 @@ class DocumentManager
                             $groupCondition AND
                             docs.path NOT LIKE '%shared_folder%' AND
                             docs.path NOT LIKE '%_DELETED_%' AND
-                            last.visibility 	<> 2
+                            last.visibility <> 2
                             $condition_session ";
             } else {
                 $sql = "SELECT DISTINCT docs.id, path
@@ -810,10 +811,10 @@ class DocumentManager
                             docs.c_id = {$_course['real_id']}
                         )
                         WHERE
-                            docs.filetype 		= 'folder' AND
+                            docs.filetype = 'folder' AND
                             docs.path NOT LIKE '%_DELETED_%' AND
                             $groupCondition AND
-                            last.visibility 	<> 2
+                            last.visibility <> 2
                             $show_users_condition $condition_session ";
             }
             $result = Database::query($sql);
@@ -841,29 +842,44 @@ class DocumentManager
                 return false;
             }
         } else {
+
             // No invisible folders
             // Condition for the session
             $session_id = api_get_session_id();
             $condition_session = api_get_session_condition($session_id, true, false, 'docs.session_id');
+
+            $visibilityCondition = 'last.visibility = 1';
+            $fileType = "docs.filetype = 'folder' AND";
+            if ($getInvisibleList) {
+                $visibilityCondition = 'last.visibility = 0';
+                $fileType = '';
+            }
+
             //get visible folders
             $sql = "SELECT DISTINCT docs.id, path
                     FROM
                         $TABLE_ITEMPROPERTY AS last, $TABLE_DOCUMENT AS docs
                     WHERE
                         docs.id = last.ref AND
-                        docs.filetype = 'folder' AND
+                        $fileType
                         last.tool = '" . TOOL_DOCUMENT . "' AND
                         $groupCondition AND
-                        last.visibility = 1
+                        $visibilityCondition
                         $condition_session AND
                         last.c_id = {$_course['real_id']}  AND
                         docs.c_id = {$_course['real_id']} ";
             $result = Database::query($sql);
+
             $visibleFolders = array();
             while ($row = Database::fetch_array($result, 'ASSOC')) {
                 $visibleFolders[$row['id']] = $row['path'];
             }
 
+            if ($getInvisibleList) {
+
+                return $visibleFolders;
+            }
+
             // Condition for the session
             $session_id = api_get_session_id();
             $condition_session = api_get_session_condition($session_id, true, false, 'docs.session_id');
@@ -902,6 +918,7 @@ class DocumentManager
                 }
             }
 
+
             //if both results are arrays -> //calculate the difference between the 2 arrays -> only visible folders are left :)
             if (is_array($visibleFolders) && is_array($invisibleFolders)) {
                 $document_folders = array_diff($visibleFolders, $invisibleFolders);
@@ -2828,12 +2845,6 @@ class DocumentManager
             $upload_ok = process_uploaded_file($files[$fileKey], $show_output);
 
             if ($upload_ok) {
-                // File got on the server without problems, now process it
-                if ($title) {
-                    $titleAndExt = explode('.', $files[$fileKey]['name']);
-                    $ext = end($titleAndExt);
-                    $files[$fileKey]['name'] = $title.'.'.$ext;
-                }
                 $new_path = handle_uploaded_document(
                     $course_info,
                     $files[$fileKey],
@@ -2896,6 +2907,10 @@ class DocumentManager
                             }
                         }*/
 
+                        if (!empty($title)) {
+                            $params['title'] = $title;
+                        }
+
                         if (!empty($comment)) {
                             $params['comment'] = trim($comment);
                         }
@@ -4534,6 +4549,7 @@ class DocumentManager
             file_exists($documentData['absolute_path'])
         ) {
             $mp3FilePath = self::convertWavToMp3($documentData['absolute_path']);
+            error_log($mp3FilePath);
 
             if (!empty($mp3FilePath) && file_exists($mp3FilePath)) {
 

+ 17 - 79
main/inc/lib/formvalidator/FormValidator.class.php

@@ -1,8 +1,6 @@
 <?php
 /* For licensing terms, see /license.txt */
 
-use ChamiloSession as Session;
-
 /**
  * Class FormValidator
  * create/manipulate/validate user input.
@@ -893,88 +891,19 @@ EOT;
     }
 
     /**
-     * Adds a progress bar to the form.
-     *
-     * Once the user submits the form, a progress bar (animated gif) is
-     * displayed. The progress bar will disappear once the page has been
-     * reloaded.
+     * Adds a progress loading image to the form.
      *
-     * @param int $delay (optional)	 The number of seconds between the moment the user
-     * @param string $label (optional)	Custom label to be shown
-     *
-     * submits the form and the start of the progress bar.
-     * @deprecated ?
      */
-    public function add_progress_bar($delay = 2, $label = '')
+    public function addProgress($delay = 2, $label = '')
     {
         if (empty($label)) {
             $label = get_lang('PleaseStandBy');
         }
         $this->with_progress_bar = true;
-        $this->updateAttributes("onsubmit=\"javascript: myUpload.start('dynamic_div','".Display::returnIconPath('progress_bar.gif')."','" . $label . "','" . $this->getAttribute('id') . "')\"");
-        $this->addElement('html', '<script language="javascript" src="' . api_get_path(WEB_LIBRARY_PATH) . 'javascript/upload.js" type="text/javascript"></script>');
-        $this->addElement('html', '<script type="text/javascript">var myUpload = new upload(' . (abs(intval($delay)) * 1000) . ');</script>');
-    }
+        $id = $this->getAttribute('id');
 
-    /**
-     * Uses new functions (php 5.2) for displaying real upload progress.
-     * @param string $upload_id							The value of the field UPLOAD_IDENTIFIER, the second parameter (XXX) of the $form->addElement('file', XXX) sentence
-     * @param string $element_after						The first element of the form (to place at first UPLOAD_IDENTIFIER)
-     * @param int $delay (optional)						The frequency of the xajax call
-     * @param bool $wait_after_upload (optional)
-     */
-    public function add_real_progress_bar($upload_id, $element_after, $delay = 2, $wait_after_upload = false)
-    {
-        if (!function_exists('uploadprogress_get_info')) {
-            $this->add_progress_bar($delay);
-            return;
-        }
-
-        $xajax_upload = new xajax(api_get_path(WEB_LIBRARY_PATH) . 'upload.xajax.php');
-
-        $xajax_upload->registerFunction('updateProgress');
-        // IMPORTANT : must be the first element of the form
-        $el = $this->insertElementBefore(FormValidator::createElement('html', '<input type="hidden" name="UPLOAD_IDENTIFIER" value="' . $upload_id . '" />'), $element_after);
-
-        $this->addElement('html', '<br />');
-
-        // Add div-element where the progress bar is to be displayed
-        $this->addElement(
-            'html',
-            '<div id="dynamic_div_container" style="display:none">
-                <div id="dynamic_div_label">' . get_lang('UploadFile') . '</div>
-                <div id="dynamic_div_frame" style="width:214px; height:12px; border:1px solid grey; background-image:url(' . Display::returnIconPath('real_upload_frame.gif').');">
-                    <div id="dynamic_div_filled" style="width:0%;height:100%;background-image:url(' . Display::returnIconPath('real_upload_step.gif').');background-repeat:repeat-x;background-position:center;"></div>
-                </div>
-            </div>'
-        );
-
-        if ($wait_after_upload) {
-            $this->addElement('html', '
-			<div id="dynamic_div_waiter_container" style="display:none">
-				<div id="dynamic_div_waiter_label">
-					' . get_lang('SlideshowConversion') . '
-				</div>
-				<div id="dynamic_div_waiter_frame">
-					'.Display::return_icon('real_upload_frame.gif').'
-				</div>
-			</div>
-		');
-        }
-
-        // Get the xajax code
-        $this->addElement('html', $xajax_upload->getJavascript(api_get_path(WEB_LIBRARY_PATH) . 'xajax'));
-
-        // Get the upload code
-        $this->addElement('html', '<script language="javascript" src="' . api_get_path(WEB_LIBRARY_PATH) . 'javascript/upload.js" type="text/javascript"></script>');
-        $this->addElement('html', '<script type="text/javascript">var myUpload = new upload(' . (abs(intval($delay)) * 1000) . ');</script>');
-
-        if (!$wait_after_upload) {
-            $wait_after_upload = 0;
-        }
-
-        // Add the upload event
-        $this->updateAttributes("onsubmit=\"javascript: myUpload.startRealUpload('dynamic_div','" . $upload_id . "','" . $this->getAttribute('id') . "'," . $wait_after_upload . ")\"");
+        $this->updateAttributes("onsubmit=\"javascript: addProgress('" . $id . "')\"");
+        $this->addHtml('<script language="javascript" src="' . api_get_path(WEB_LIBRARY_PATH) . 'javascript/upload.js" type="text/javascript"></script>');
     }
 
     /**
@@ -1018,8 +947,17 @@ EOT;
 
         $returnValue .= parent::toHtml();
         // Add div-element which is to hold the progress bar
+        $id = $this->getAttribute('id');
         if (isset($this->with_progress_bar) && $this->with_progress_bar) {
-            $returnValue .= '<div id="dynamic_div" style="display:block; margin-left:40%; margin-top:10px; height:50px;"></div>';
+            $icon = Display::return_icon('progress_bar.gif');
+
+            // @todo improve UI
+            $returnValue .= '<br />
+
+            <div id="loading_div_'.$id.'" class="loading_div" style="display:none;margin-left:40%; margin-top:10px; height:50px;">
+                '.$icon.'
+            </div>
+            ';
         }
 
         return $returnValue;
@@ -1446,7 +1384,7 @@ EOT;
                         .prepend(file.preview);
                     node
                         .append('<br>')
-                        .append($('<span class=\"text-success\"/>').text('" . get_lang('UplUploadSucceeded') . "'));
+                        .append($('<span class=\"text-success\"/>').text('" . addslashes(get_lang('UplUploadSucceeded')) . "'));
                 }
                 if (file.error) {
                     node
@@ -1481,7 +1419,7 @@ EOT;
                 });
             }).on('fileuploadfail', function (e, data) {
                 $.each(data.files, function (index) {
-                    var failedMessage = '" . get_lang('UplUploadFailed') . "';
+                    var failedMessage = '" . addslashes(get_lang('UplUploadFailed')) . "';
                     var error = $('<span class=\"text-danger\"/>').text(failedMessage);
                     $(data.context.children()[index])
                         .append('<br>')

+ 4 - 4
main/inc/lib/groupmanager.lib.php

@@ -61,12 +61,12 @@ class GroupManager
     /**
      * @return array
      */
-    public static function get_groups()
+    public static function get_groups($courseId = null)
     {
         $table_group = Database :: get_course_table(TABLE_GROUP);
-        $course_id = api_get_course_int_id();
+        $courseId = !empty($courseId) ? (int) $courseId : api_get_course_int_id();
 
-        $sql = "SELECT * FROM $table_group WHERE c_id = $course_id ";
+        $sql = "SELECT * FROM $table_group WHERE c_id = $courseId  ";
         $result = Database::query($sql);
         return Database::store_result($result, 'ASSOC');
     }
@@ -775,7 +775,7 @@ class GroupManager
             while ($group = Database::fetch_object($res)) {
                 $groups_to_delete[] = $group->id;
             }
-            self :: delete_groups($groups_to_delete);
+            self::delete_groups($groups_to_delete, $course_code);
         }
         $sql = "DELETE FROM $table_group_cat
                 WHERE c_id = $course_id  AND id='".$cat_id."'";

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 55 - 197
main/inc/lib/javascript/badge-studio/media/images/templates/template-2.svg


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 58 - 207
main/inc/lib/javascript/badge-studio/media/images/templates/template-3.svg


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 363 - 366
main/inc/lib/javascript/badge-studio/media/js/studio.js


+ 9 - 66
main/inc/lib/javascript/upload.js

@@ -1,66 +1,9 @@
-/**
- * JavaScript library to deal with file uploads
- * @author	Yannick Warnier <yannick.warnier@dokeos.com>
- */
-/**
- * Upload class. Used to pack functions into one practical object.
- * Call like this: var myUpload = new upload(5);
- */
-function upload(latency){
-	/**
-	 * Starts the timer
-	 * Call like this:
-	 * @param	string	Name of the DOM element we need to update
-	 * @param	string	Loading image to display
-	 * @return	true
-	 */
-	function start(domid,img,text,formid){
-		__progress_bar_domid = domid;
-		__progress_bar_img   = img;
-		__progress_bar_text  = text;
-		__progress_bar_interval = setTimeout(__display_progress_bar,latency,__progress_bar_text);
-		__upload_form_domid  = formid;
-	}
-
-	/**
-	 * Starts the timer of the real upload progress
-	 */
-	function startRealUpload(domid, upload_id, formid, waitAfterUpload){
-		__progress_bar_domid = domid;
-		__progress_bar_uploadid = upload_id;
-		__progress_bar_waitAfterUpload = waitAfterUpload;
-		__upload_form_domid  = formid;
-		__progress_bar_interval = setInterval(__refreshUpload,latency);
-		document.getElementById(domid+'_container').style.display = 'block';
-		if(waitAfterUpload){
-			document.getElementById(domid+'_waiter_container').style.display = 'block';
-		}
-
-
-	}
-
-	/**
-	 * Function called by a timer to update every x seconds the progress bar
-	 */
-	function __refreshUpload(){
-		xajax_updateProgress(__progress_bar_domid, __progress_bar_uploadid, __progress_bar_waitAfterUpload);
-	}
-
-	/**
-	 * Displays the progress bar in the given DOM element
-	 */
-	function __display_progress_bar(){
-		var my_html ='<span style="font-style:italic;">'+ __progress_bar_text+'</span><br/><img src="'+__progress_bar_img+'" alt="'+__progress_bar_text+'"  title="'+__progress_bar_text+'"/>';
-		document.getElementById(__progress_bar_domid).innerHTML = my_html;
-		if(__upload_form_domid != ''){
-			document.getElementById(__upload_form_domid).style.display = 'none';
-		}
-	}
-	this.start = start;
-	this.startRealUpload = startRealUpload;
-	var __progress_bar_domid = '';
-	var __progress_bar_img = '../img/progress_bar.gif';
-	var __progress_bar_text = 'Uploading... Please wait';
-	var __progress_bar_interval = 1;
-	var __upload_form_domid = '';
-}
+$(document).ready(function() {
+    $('.loading_div').hide();
+})
+
+function addProgress(id)
+{
+    $('#loading_div_'+id).show();
+    $('#'+id).hide();
+}

+ 45 - 46
main/inc/lib/myspace.lib.php

@@ -2998,6 +2998,51 @@ class MySpace
 
         return $return;
     }
+
+    /**
+     * Gets the connections to a course as an array of login and logout time
+     *
+     * @param   int       $user_id
+     * @param   int    $courseId
+     * @author  Jorge Frisancho Jibaja
+     * @author  Julio Montoya <gugli100@gmail.com> fixing the function
+     * @version OCT-22- 2010
+     * @return  array
+     */
+    public static function get_connections_to_course_by_date($user_id, $courseId, $start_date, $end_date)
+    {
+        // Database table definitions
+        $tbl_track_course = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
+        $course_info = api_get_course_info_by_id($courseId);
+        $user_id = intval($user_id);
+        $courseId = intval($courseId);
+        $connections = array();
+
+        if (!empty($course_info)) {
+            $end_date = add_day_to($end_date);
+            $sql = "SELECT login_course_date, logout_course_date
+                FROM $tbl_track_course
+                WHERE
+                    user_id = $user_id AND
+                    c_id = $courseId AND
+                    login_course_date BETWEEN '$start_date' AND '$end_date' AND
+                    logout_course_date BETWEEN '$start_date' AND '$end_date'
+                ORDER BY login_course_date ASC";
+            $rs = Database::query($sql);
+
+            while ($row = Database::fetch_array($rs)) {
+                $login_date = $row['login_course_date'];
+                $logout_date = $row['logout_course_date'];
+                $timestamp_login_date = strtotime($login_date);
+                $timestamp_logout_date = strtotime($logout_date);
+                $connections[] = array(
+                    'login' => $timestamp_login_date,
+                    'logout' => $timestamp_logout_date
+                );
+            }
+        }
+        return $connections;
+    }
 }
 
 /**
@@ -3052,52 +3097,6 @@ function add_day_to($end_date) {
     return $foo_date;
 }
 
-
-/**
- * Gets the connections to a course as an array of login and logout time
- *
- * @param   int       $user_id
- * @param   int    $courseId
- * @author  Jorge Frisancho Jibaja
- * @author  Julio Montoya <gugli100@gmail.com> fixing the function
- * @version OCT-22- 2010
- * @return  array
- */
-function get_connections_to_course_by_date($user_id, $courseId, $start_date, $end_date)
-{
-    // Database table definitions
-    $tbl_track_course = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
-    $course_info = api_get_course_info_by_id($courseId);
-    $user_id = intval($user_id);
-    $courseId = intval($courseId);
-    $connections = array();
-
-    if (!empty($course_info)) {
-        $end_date = add_day_to($end_date);
-        $sql = "SELECT login_course_date, logout_course_date
-                FROM $tbl_track_course
-                WHERE
-                    user_id = $user_id AND
-                    c_id = $courseId AND
-                    login_course_date BETWEEN '$start_date' AND '$end_date' AND
-                    logout_course_date BETWEEN '$start_date' AND '$end_date'
-                ORDER BY login_course_date ASC";
-        $rs = Database::query($sql);
-
-        while ($row = Database::fetch_array($rs)) {
-            $login_date = $row['login_course_date'];
-            $logout_date = $row['logout_course_date'];
-            $timestamp_login_date = strtotime($login_date);
-            $timestamp_logout_date = strtotime($logout_date);
-            $connections[] = array(
-                'login' => $timestamp_login_date,
-                'logout' => $timestamp_logout_date
-            );
-        }
-    }
-    return $connections;
-}
-
 /**
  *
  *

+ 1 - 1
main/inc/lib/online.inc.php

@@ -117,7 +117,7 @@ function online_logout($user_id = null, $logout_redirect = false)
     		LIMIT 0,1";
     $q_last_connection = Database::query($sql);
     if (Database::num_rows($q_last_connection)>0) {
-        $i_id_last_connection = Database::result($q_last_connection,0,"login_id");
+        $i_id_last_connection = Database::result($q_last_connection, 0, "login_id");
     }
 
     if (!isset($_SESSION['login_as'])) {

+ 5 - 7
main/inc/lib/pdf.lib.php

@@ -251,8 +251,7 @@ class PDF
                 //this is a chapter, print title & skip the rest
                 if ($print_title) {
                     $this->pdf->WriteHTML(
-                        '<html><body><h3>'.$html_title.'</h3></body></html>'.$page_break,
-                        2
+                        '<html><body><h3>'.$html_title.'</h3></body></html>'.$page_break
                     );
                 }
                 continue;
@@ -273,8 +272,7 @@ class PDF
             //it's not a chapter but the file exists, print its title
             if ($print_title) {
                 $this->pdf->WriteHTML(
-                    '<html><body><h3>' . $html_title . '</h3></body></html>',
-                    2
+                    '<html><body><h3>' . $html_title . '</h3></body></html>'
                 );
             }
 
@@ -376,12 +374,12 @@ class PDF
                     $title = $filename; // Here file name is expected to contain ASCII symbols only.
                 }
                 if (!empty($document_html)) {
-                    $this->pdf->WriteHTML($document_html.$page_break, 2);
+                    $this->pdf->WriteHTML($document_html.$page_break);
                 }
             } elseif (in_array($extension, array('jpg','jpeg','png','gif'))) {
                 //Images
                 $image = Display::img($file);
-                $this->pdf->WriteHTML('<html><body>'.$image.'</body></html>'.$page_break, 2);
+                $this->pdf->WriteHTML('<html><body>'.$image.'</body></html>'.$page_break);
             }
         }
 
@@ -495,7 +493,7 @@ class PDF
         if (!empty($css)) {
             $this->pdf->WriteHTML($css, 1);
         }
-        $this->pdf->WriteHTML($document_html, 2);
+        $this->pdf->WriteHTML($document_html);
 
         if (empty($pdf_name)) {
             $output_file = 'pdf_'.date('Y-m-d-his').'.pdf';

+ 21 - 2
main/inc/lib/plugin.lib.php

@@ -546,7 +546,22 @@ class AppPlugin
                     );
                 }
 
-                $form->addElement('html', '<div><h3>'.$icon.' '.Security::remove_XSS($pluginTitle).'</h3><div>');
+                $form->addHtml('<div class="panel panel-default">');
+                $form->addHtml('
+                    <div class="panel-heading" role="tab" id="heading-' . $plugin_name . '-settings">
+                        <h4 class="panel-title">
+                            <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse-' . $plugin_name . '-settings" aria-expanded="false" aria-controls="collapse-' . $plugin_name . '-settings">
+                ');
+                $form->addHtml($icon . ' ' . $pluginTitle);
+                $form->addHtml('
+                            </a>
+                        </h4>
+                    </div>
+                ');
+                $form->addHtml('
+                    <div id="collapse-' . $plugin_name . '-settings" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-' . $plugin_name . '-settings">
+                        <div class="panel-body">
+                ');
 
                 $groups = array();
                 foreach ($obj->course_settings as $setting) {
@@ -576,7 +591,11 @@ class AppPlugin
                     $form->addGroup($groups[$k], $k, array($obj->get_lang($k)));
                 }
                 $form->addButtonSave(get_lang('SaveSettings'));
-                $form->addElement('html', '</div></div>');
+                $form->addHtml('
+                        </div>
+                    </div>
+                ');
+                $form->addHtml('</div>');
             }
         }
     }

+ 61 - 56
main/inc/lib/social.lib.php

@@ -56,6 +56,7 @@ class SocialManager extends UserManager
         $list_type_friend = self::show_list_type_friends();
         foreach ($list_type_friend as $value_type_friend) {
             if (strtolower($value_type_friend['title']) == $relation_type_name) {
+
                 return $value_type_friend['id'];
             }
         }
@@ -194,7 +195,7 @@ class SocialManager extends UserManager
                 WHERE
                     user_sender_id='.$user_id.' AND
                     user_receiver_id='.$friend_id.' AND
-                    msg_status IN(5,6,7);
+                    msg_status IN('.MESSAGE_STATUS_INVITATION_PENDING.', '.MESSAGE_STATUS_INVITATION_ACCEPTED.', '.MESSAGE_STATUS_INVITATION_DENIED.');
                 ';
         $res_exist = Database::query($sql);
         $row_exist = Database::fetch_array($res_exist, 'ASSOC');
@@ -361,61 +362,6 @@ class SocialManager extends UserManager
         Database::query($sql);
     }
 
-    /**
-     * Sends invitations to friends
-     * @author Isaac Flores Paz <isaac.flores.paz@gmail.com>
-     * @author Julio Montoya <gugli100@gmail.com> Cleaning code
-     * @param void
-     * @return string message invitation
-     */
-    public static function send_invitation_friend_user($userfriend_id, $subject_message = '', $content_message = '')
-    {
-        global $charset;
-
-        $user_info = api_get_user_info($userfriend_id);
-        $succes = get_lang('MessageSentTo');
-        $succes.= ' : '.api_get_person_name($user_info['firstName'], $user_info['lastName']);
-
-        if (isset($subject_message) && isset($content_message) && isset($userfriend_id)) {
-            $send_message = MessageManager::send_message($userfriend_id, $subject_message, $content_message);
-
-            if ($send_message) {
-                Display::addFlash(
-                    Display::display_confirmation_message($succes, true, true)
-                );
-            } else {
-                Display::addFlash(
-                    Display::display_error_message(get_lang('ErrorSendingMessage'), true, true)
-                );
-            }
-            return false;
-        } elseif (isset($userfriend_id) && !isset($subject_message)) {
-            $count_is_true = false;
-            if (isset($userfriend_id) && $userfriend_id > 0) {
-                $message_title = get_lang('Invitation');
-                $count_is_true = self::send_invitation_friend(api_get_user_id(), $userfriend_id, $message_title, $content_message);
-
-                if ($count_is_true) {
-                    Display::addFlash(
-                        Display::display_confirmation_message(
-                            api_htmlentities(get_lang('InvitationHasBeenSent'), ENT_QUOTES, $charset),
-                            false,
-                            true
-                        )
-                    );
-                } else {
-                    Display::addFlash(
-                        Display::display_warning_message(
-                            api_htmlentities(get_lang('YouAlreadySentAnInvitation'), ENT_QUOTES, $charset),
-                            false,
-                            true
-                        )
-                    );
-                }
-            }
-        }
-    }
-
     /**
      * Get user's feeds
      * @param   int User ID
@@ -473,6 +419,65 @@ class SocialManager extends UserManager
         return $res;
     }
 
+    /**
+     * Sends invitations to friends
+     *
+     * @param int  $userId
+     * @param string $subject
+     * @param string $content
+     *
+     * @return string message invitation
+     */
+    public static function sendInvitationToUser($userId, $subject = '', $content = '')
+    {
+        $user_info = api_get_user_info($userId);
+        $success = get_lang('MessageSentTo');
+        $success.= ' : '.api_get_person_name($user_info['firstName'], $user_info['lastName']);
+
+        if (isset($subject) && isset($content) && isset($userId)) {
+            $result = MessageManager::send_message($userId, $subject, $content);
+
+            if ($result) {
+                Display::addFlash(
+                    Display::return_message($success, 'normal', false)
+                );
+            } else {
+                Display::addFlash(
+                    Display::return_message(get_lang('ErrorSendingMessage'), 'error', false)
+                );
+            }
+            return false;
+        } elseif (isset($userId) && !isset($subject)) {
+            if (isset($userId) && $userId > 0) {
+
+                $count = self::send_invitation_friend(
+                    api_get_user_id(),
+                    $userId,
+                    get_lang('Invitation'),
+                    $content
+                );
+
+                if ($count) {
+                    Display::addFlash(
+                        Display::return_message(
+                            api_htmlentities(get_lang('InvitationHasBeenSent')),
+                            'normal',
+                            false
+                        )
+                    );
+                } else {
+                    Display::addFlash(
+                        Display::return_message(
+                            api_htmlentities(get_lang('YouAlreadySentAnInvitation')),
+                            'warning',
+                            false
+                        )
+                    );
+                }
+            }
+        }
+    }
+
     /**
      * Helper functions definition
      */

+ 3 - 2
main/inc/lib/template.lib.php

@@ -68,7 +68,7 @@ class Template
 
         if (empty($this->show_learnpath)) {
             $origin = api_get_origin();
-            if ($origin == 'learnpath') {
+            if ($origin === 'learnpath') {
                 $this->show_learnpath = true;
                 $show_footer = false;
                 $show_header = false;
@@ -910,7 +910,7 @@ class Template
         $iconBug = Display::return_icon('bug.png', get_lang('ReportABug'), null, ICON_SIZE_LARGE);
         if (api_get_setting('show_link_bug_notification') == 'true' && $this->user_is_logged_in) {
             $rightFloatMenu = '<div class="report">
-		<a href="http://support.chamilo.org/projects/chamilo-18/wiki/How_to_report_bugs" target="_blank">
+		<a href="https://github.com/chamilo/chamilo-lms/wiki/How-to-report-issues" target="_blank">
                     '. $iconBug . '
                 </a>
 		</div>';
@@ -1025,6 +1025,7 @@ class Template
 
         $this->assign('user_notifications', $total_invitations);
 
+
         // Block Breadcrumb
         $breadcrumb = return_breadcrumb($interbreadcrumb, $language_file, $nameTools);
         $this->assign('breadcrumb', $breadcrumb);

+ 0 - 33
main/inc/lib/upload.xajax.php

@@ -1,33 +0,0 @@
-<?php
-/**
- * @package chamilo.library
- */
-/**
- * Code
- */
-include(dirname(__FILE__).'/../global.inc.php');
-$xajax_upload = new Xajax();
-$xajax_upload -> registerFunction ('updateProgress');
-$xajax_upload -> processRequests();
-
-/**
- * This function updates the progress bar
- * @param div_id where the progress bar is displayed
- * @param upload_id the identifier given in the field UPLOAD_IDENTIFIER
- */
-function updateProgress($div_id, $upload_id, $waitAfterupload = false) {
-
-	$objResponse = new xajaxResponse();
-	$ul_info = uploadprogress_get_info($upload_id);
-	$percent = intval($ul_info['bytes_uploaded']*100/$ul_info['bytes_total']);
-	if($waitAfterupload && $ul_info['est_sec']<2) {
-		$percent = 100;
-		$objResponse->addAssign($div_id.'_label' , 'innerHTML', get_lang('UploadFile').' : '.$percent.' %');
-		$objResponse->addAssign($div_id.'_waiter_frame','innerHTML', Display::return_icon('progress_bar.gif'));
-		$objResponse->addScript('clearInterval("myUpload.__progress_bar_interval")');
-	}
-	$objResponse->addAssign($div_id.'_label', 'innerHTML', get_lang('UploadFile').' : '.$percent.' %');
-	$objResponse->addAssign($div_id.'_filled', 'style.width', $percent.'%');
-
-	return $objResponse;
-}

+ 1 - 14
main/inc/lib/usermanager.lib.php

@@ -102,21 +102,8 @@ class UserManager
     private static function getEncoderFactory()
     {
         $encryption = self::getPasswordEncryption();
-        switch ($encryption) {
-            case 'none':
-                $defaultEncoder = new PlaintextPasswordEncoder();
-                break;
-            case 'sha1':
-            case 'md5':
-                $defaultEncoder = new MessageDigestPasswordEncoder($encryption, false, 1);
-                break;
-            case 'bcrypt':
-                $defaultEncoder = new BCryptPasswordEncoder(4);
-                break;
-        }
-
         $encoders = array(
-            'Chamilo\\UserBundle\\Entity\\User' => $defaultEncoder
+            'Chamilo\\UserBundle\\Entity\\User' => new \Chamilo\UserBundle\Security\Encoder($encryption)
         );
 
         $encoderFactory = new EncoderFactory($encoders);

+ 4 - 4
main/inc/lib/webservices/WebService.class.php

@@ -44,15 +44,15 @@ abstract class WebService
             return false;
         }
 
-        $user = UserManager::getRepository()->findOneBy([
-            'username' => $username
-        ]);
+        /** @var \Chamilo\UserBundle\Entity\User $user */
+        $user = UserManager::getRepository()
+            ->findOneBy(['username' => $username]);
 
         if (empty($user)) {
             return false;
         }
 
-        return UserManager::isPasswordValid($password, $user);
+        return UserManager::isPasswordValid($user->getPassword(), $password, $user->getSalt());
     }
 
 }

+ 5 - 13
main/inc/local.inc.php

@@ -334,19 +334,11 @@ if (!empty($_SESSION['_user']['user_id']) && !($login || $logout)) {
             if ($uData['auth_source'] == PLATFORM_AUTH_SOURCE ||
                 $uData['auth_source'] == CAS_AUTH_SOURCE
             ) {
-                $validPassword = false;
-                //$user = $userManager->findUserByUsername($login);
-
-
-                    $validPassword = UserManager::isPasswordValid(
-                        $uData['password'],
-                        $password,
-                        $uData['salt']
-                    );
-
-
-                // The authentication of this user is managed by Chamilo itself
-                //$password = api_get_encrypted_password(trim(stripslashes($password)));
+                $validPassword = UserManager::isPasswordValid(
+                    $uData['password'],
+                    $password,
+                    $uData['salt']
+                );
 
                 // Check the user's password
                 if (($validPassword || $cas_login) &&

+ 0 - 6
main/install/configuration.dist.php

@@ -234,12 +234,6 @@ $_configuration['system_stable'] = NEW_VERSION_STABLE;
 //$_configuration['session_hide_tab_list'] = array();
 // Show invisible exercise in LP list
 //$_configuration['show_invisible_exercise_in_lp_list'] = false;
-//Allow send a push notification when an email are sent
-//$_configuration['messaging_allow_send_push_notification'] = 'true';
-//Project number in the Google Developer Console
-//$_configuration['messaging_gdc_project_number'] = '';
-//Api Key in the Google Developer Console
-//$_configuration['messaging_gdc_api_key'] = '';
 // New grid view the list of courses
 //$_configuration['view_grid_courses'] = true;
 // Chamilo is installed/downloaded. Packagers can change this

+ 75 - 61
main/install/index.php

@@ -15,7 +15,10 @@
  * @package chamilo.install
  */
 
-use ChamiloSession as Session;
+use ChamiloSession as Session,
+    Chamilo\TicketBundle\Entity\Project as TicketProject,
+    Chamilo\TicketBundle\Entity\Category as TicketCategory,
+    Chamilo\TicketBundle\Entity\Priority as TicketPriority;
 
 ini_set('display_errors', '1');
 ini_set('log_errors', '1');
@@ -367,34 +370,44 @@ if ($encryptPassForm == '1') {
         });
 
         function send_contact_information() {
-            var data_post = "";
-            data_post += "person_name="+$("#person_name").val()+"&";
-            data_post += "person_email="+$("#person_email").val()+"&";
-            data_post += "company_name="+$("#company_name").val()+"&";
-            data_post += "company_activity="+$("#company_activity option:selected").val()+"&";
-            data_post += "person_role="+$("#person_role option:selected").val()+"&";
-            data_post += "company_country="+$("#country option:selected").val()+"&";
-            data_post += "company_city="+$("#company_city").val()+"&";
-            data_post += "language="+$("#language option:selected").val()+"&";
-            data_post += "financial_decision="+$("input[@name='financial_decision']:checked").val();
-
-            $.ajax({
-                contentType: "application/x-www-form-urlencoded",
-                beforeSend: function(objeto) {},
-                type: "POST",
-                url: "<?php echo api_get_path(WEB_AJAX_PATH) ?>install.ajax.php?a=send_contact_information",
-                data: data_post,
-                success: function(datos) {
-                    if (datos == 'required_field_error') {
-                        message = "<?php echo get_lang('FormHasErrorsPleaseComplete') ?>";
-                    } else if (datos == '1') {
-                        message = "<?php echo get_lang('ContactInformationHasBeenSent') ?>";
-                    } else {
-                        message = "<?php echo get_lang('Error').': '.get_lang('ContactInformationHasNotBeenSent') ?>";
+            if (!document.getElementById('accept_licence').checked) {
+                alert('<?php echo get_lang('YouMustAcceptLicence'); ?>')
+                ;return false;
+            } else {
+                var data_post = "";
+                data_post += "person_name="+$("#person_name").val()+"&";
+                data_post += "person_email="+$("#person_email").val()+"&";
+                data_post += "company_name="+$("#company_name").val()+"&";
+                data_post += "company_activity="+$("#company_activity option:selected").val()+"&";
+                data_post += "person_role="+$("#person_role option:selected").val()+"&";
+                data_post += "company_country="+$("#country option:selected").val()+"&";
+                data_post += "company_city="+$("#company_city").val()+"&";
+                data_post += "language="+$("#language option:selected").val()+"&";
+                data_post += "financial_decision="+$("input[name='financial_decision']:checked").val();
+
+                $.ajax({
+                    contentType: "application/x-www-form-urlencoded",
+                    beforeSend: function(objeto) {},
+                    type: "POST",
+                    url: "<?php echo api_get_path(WEB_AJAX_PATH) ?>install.ajax.php?a=send_contact_information",
+                    beforeSend : function() {
+                        $('#loader-button').append('  <em class="fa fa-spinner fa-pulse fa-fw"></em>');
+                    },
+                    data: data_post,
+                    success: function(datos) {
+                        if (datos == 'required_field_error') {
+                            message = "<?php echo get_lang('FormHasErrorsPleaseComplete') ?>";
+                        } else if (datos == '1') {
+                            message = "<?php echo get_lang('ContactInformationHasBeenSent') ?>";
+                        } else {
+                            message = "<?php echo get_lang('Error').': '.get_lang('ContactInformationHasNotBeenSent') ?>";
+                        }
+                        alert(message);
+                        $('#license-next').trigger('click');
+                        $('#loader-button').html('');
                     }
-                    alert(message);
-                }
-            });
+                });
+            }
         }
     </script>
     <meta http-equiv="Content-Type" content="text/html; charset=<?php echo api_get_system_encoding(); ?>" />
@@ -818,17 +831,17 @@ if (@$_POST['step2']) {
         $connection->executeQuery("ALTER TABLE faq_question ADD CONSTRAINT FK_4A55B05912469DE2 FOREIGN KEY (category_id) REFERENCES faq_category (id);");
         */
         // Add version table
-        $connection->executeQuery('CREATE TABLE version (id int unsigned NOT NULL AUTO_INCREMENT, version varchar(255), PRIMARY KEY(id), UNIQUE(version))');
+        $connection->executeQuery('CREATE TABLE version (id int unsigned NOT NULL AUTO_INCREMENT, version varchar(20), PRIMARY KEY(id), UNIQUE(version))');
 
         // Tickets
-        $table = Database::get_main_table(TABLE_TICKET_PROJECT);
+        $ticketProject = new TicketProject();
+        $ticketProject
+            ->setId(1)
+            ->setName('Ticket System')
+            ->setInsertUserId(1);
 
-        // Default Project Table Ticket
-        $attributes = array(
-            'id' => 1,
-            'name' => 'Ticket System'
-        );
-        Database::insert($table, $attributes);
+        $manager->persist($ticketProject);
+        $manager->flush();
 
         $categories = array(
             get_lang('TicketEnrollment') => get_lang('TicketsAboutEnrollment'),
@@ -840,29 +853,27 @@ if (@$_POST['step2']) {
         );
 
         $i = 1;
-        $table = Database::get_main_table(TABLE_TICKET_CATEGORY);
 
+        /**
+         * @var string $category
+         * @var string $description
+         */
         foreach ($categories as $category => $description) {
             // Online evaluation requires a course
-            if ($i == 6) {
-                $attributes = array(
-                    'id' => $i,
-                    'name' => $category,
-                    'description' => $description,
-                    'project_id' => 1,
-                    'course_required' => 1
-                );
-            } else {
-                $attributes = array(
-                    'id' => $i,
-                    'project_id' => 1,
-                    'description' => $description,
-                    'name' => $category,
-                    'course_required' => 0
-                );
-            }
+            $ticketCategory = new TicketCategory();
+            $ticketCategory
+                ->setId($i)
+                ->setName($category)
+                ->setDescription($description)
+                ->setProject($ticketProject)
+                ->setInsertUserId(1);
+
+            $isRequired = $i == 6;
+            $ticketCategory->setCourseRequired($isRequired);
+
+            $manager->persist($ticketCategory);
+            $manager->flush();
 
-            Database::insert($table, $attributes);
             $i++;
         }
 
@@ -876,12 +887,15 @@ if (@$_POST['step2']) {
         $table = Database::get_main_table(TABLE_TICKET_PRIORITY);
         $i = 1;
         foreach ($defaultPriorities as $code => $priority) {
-            $attributes = array(
-                'id' => $i,
-                'name' => $priority,
-                'code' => $code
-            );
-            Database::insert($table, $attributes);
+            $ticketPriority = new TicketPriority();
+            $ticketPriority
+                ->setId($i)
+                ->setName($priority)
+                ->setCode($code)
+                ->setInsertUserId(1);
+
+            $manager->persist($ticketPriority);
+            $manager->flush();
             $i++;
         }
 

+ 52 - 27
main/install/install.lib.php

@@ -55,15 +55,29 @@ function isAlreadyInstalledSystem()
  * @param   string  $returnSuccess Text to show when extension is available (defaults to 'Yes')
  * @param   string  $returnFailure Text to show when extension is available (defaults to 'No')
  * @param   boolean $optional Whether this extension is optional (then show unavailable text in orange rather than red)
+ * @param   string  $enabledTerm If this string is not null, then use to check if the corresponding parameter is = 1. If not, mention it's present but not enabled. For example, for opcache, this should be 'opcache.enable'
  * @return  string  HTML string reporting the status of this extension. Language-aware.
  * @author  Christophe Gesch??
  * @author  Patrick Cool <patrick.cool@UGent.be>, Ghent University
  * @author  Yannick Warnier <yannick.warnier@dokeos.com>
  */
-function checkExtension($extensionName, $returnSuccess = 'Yes', $returnFailure = 'No', $optional = false)
+function checkExtension($extensionName, $returnSuccess = 'Yes', $returnFailure = 'No', $optional = false, $enabledTerm = '')
 {
     if (extension_loaded($extensionName)) {
-        return Display::label($returnSuccess, 'success');
+        if (!empty($enabledTerm)) {
+            $isEnabled = ini_get($enabledTerm);
+            if ($isEnabled == '1') {
+                return Display::label($returnSuccess, 'success');
+            } else {
+                if ($optional) {
+                    return Display::label(get_lang('ExtensionInstalledButNotEnabled'), 'warning');
+                } else {
+                    return Display::label(get_lang('ExtensionInstalledButNotEnabled'), 'important');
+                }
+            }
+        } else {
+            return Display::label($returnSuccess, 'success');
+        }
     } else {
         if ($optional) {
             return Display::label($returnFailure, 'warning');
@@ -460,6 +474,8 @@ function get_config_param($param, $updatePath = '')
         // try to recover config file from Chamilo 1.9.x
         if (file_exists($updatePath.'main/inc/conf/configuration.php')) {
             $updateFromConfigFile = 'main/inc/conf/configuration.php';
+        } elseif (file_exists($updatePath . 'app/config/configuration.php')) {
+            $updateFromConfigFile = 'app/config/configuration.php';
         } else {
             // Give up recovering.
             //error_log('Chamilo Notice: Could not find previous config file at '.$updatePath.'main/inc/conf/configuration.php nor at '.$updatePath.'claroline/inc/conf/claro_main.conf.php in get_config_param(). Will start new config (in '.__FILE__.', line '.__LINE__.')', 0);
@@ -697,60 +713,68 @@ function display_requirements(
     echo '</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.session.php" target="_blank">Session</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.session.php" target="_blank">Session</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('session', get_lang('Yes'), get_lang('ExtensionSessionsNotAvailable')).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.mysql.php" target="_blank">pdo_mysql</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.mysql.php" target="_blank">pdo_mysql</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('pdo_mysql', get_lang('Yes'), get_lang('ExtensionMySQLNotAvailable')).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.zip.php" target="_blank">Zip</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.zip.php" target="_blank">Zip</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('zip', get_lang('Yes'), get_lang('ExtensionNotAvailable')).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.zlib.php" target="_blank">Zlib</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.zlib.php" target="_blank">Zlib</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('zlib', get_lang('Yes'), get_lang('ExtensionZlibNotAvailable')).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.pcre.php" target="_blank">Perl-compatible regular expressions</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.pcre.php" target="_blank">Perl-compatible regular expressions</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('pcre', get_lang('Yes'), get_lang('ExtensionPCRENotAvailable')).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.xml.php" target="_blank">XML</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.xml.php" target="_blank">XML</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('xml', get_lang('Yes'), get_lang('No')).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.intl.php" target="_blank">Internationalization</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.intl.php" target="_blank">Internationalization</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('intl', get_lang('Yes'), get_lang('No')).'</td>
             </tr>
                <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.json.php" target="_blank">JSON</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.json.php" target="_blank">JSON</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('json', get_lang('Yes'), get_lang('No')).'</td>
             </tr>
              <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.image.php" target="_blank">GD</a> '.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.image.php" target="_blank">GD</a> '.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('gd', get_lang('Yes'), get_lang('ExtensionGDNotAvailable')).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.curl.php" target="_blank">cURL</a>'.get_lang('support').'</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.curl.php" target="_blank">cURL</a>'.get_lang('Support').'</td>
                 <td class="requirements-value">'.checkExtension('curl', get_lang('Yes'), get_lang('No')).'</td>
             </tr>
 
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.mbstring.php" target="_blank">Multibyte string</a> '.get_lang('support').' ('.get_lang('Optional').')</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.mbstring.php" target="_blank">Multibyte string</a> '.get_lang('Support').' ('.get_lang('Optional').')</td>
                 <td class="requirements-value">'.checkExtension('mbstring', get_lang('Yes'), get_lang('ExtensionMBStringNotAvailable'), true).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.iconv.php" target="_blank">Iconv</a> '.get_lang('support').' ('.get_lang('Optional').')</td>
+                <td class="requirements-item"><a href="http://php.net/opcache" target="_blank">Zend OpCache</a> '.get_lang('Support').' ('.get_lang('Optional').')</td>
+                <td class="requirements-value">'.checkExtension('Zend OPcache', get_lang('Yes'), get_lang('No'), true, 'opcache.enable').'</td>
+            </tr>
+            <tr>
+                <td class="requirements-item"><a href="http://php.net/apcu" target="_blank">APCu</a> '.get_lang('Support').' ('.get_lang('Optional').')</td>
+                <td class="requirements-value">'.checkExtension('apcu', get_lang('Yes'), get_lang('No'), true, 'apc.enabled').'</td>
+            </tr>
+            <tr>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.iconv.php" target="_blank">Iconv</a> '.get_lang('Support').' ('.get_lang('Optional').')</td>
                 <td class="requirements-value">'.checkExtension('iconv', get_lang('Yes'), get_lang('No'), true).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://php.net/manual/en/book.ldap.php" target="_blank">LDAP</a> '.get_lang('support').' ('.get_lang('Optional').')</td>
+                <td class="requirements-item"><a href="http://php.net/manual/en/book.ldap.php" target="_blank">LDAP</a> '.get_lang('Support').' ('.get_lang('Optional').')</td>
                 <td class="requirements-value">'.checkExtension('ldap', get_lang('Yes'), get_lang('ExtensionLDAPNotAvailable'), true).'</td>
             </tr>
             <tr>
-                <td class="requirements-item"><a href="http://xapian.org/" target="_blank">Xapian</a> '.get_lang('support').' ('.get_lang('Optional').')</td>
+                <td class="requirements-item"><a href="http://xapian.org/" target="_blank">Xapian</a> '.get_lang('Support').' ('.get_lang('Optional').')</td>
                 <td class="requirements-value">'.checkExtension('xapian', get_lang('Yes'), get_lang('No'), true).'</td>
             </tr>
         </table>';
@@ -1112,14 +1136,6 @@ function display_license_agreement()
                     <?php echo get_lang('IAccept'); ?>
                 </label>
             </div>
-            <button type="submit" class="btn btn-default" name="step1" value="&lt; <?php echo get_lang('Previous'); ?>" >
-                <em class="fa fa-backward"> </em> <?php echo get_lang('Previous'); ?>
-            </button>
-            <input type="hidden" name="is_executable" id="is_executable" value="-" />
-            <button type="submit" class="btn btn-success" name="step3" onclick="javascript: if(!document.getElementById('accept_licence').checked) { alert('<?php echo get_lang('YouMustAcceptLicence')?>');return false;}" value="<?php echo get_lang('Next'); ?> &gt;" >
-                <em class="fa fa-forward"> </em> <?php echo get_lang('Next'); ?>
-            </button>
-
         </div>
     </div>
     <div class="row">
@@ -1141,6 +1157,15 @@ function display_license_agreement()
             <p><?php echo get_contact_registration_form() ?></p><br />
         </div>
     </div>
+
+    <button type="submit" class="btn btn-default" name="step1" value="&lt; <?php echo get_lang('Previous'); ?>" >
+        <em class="fa fa-backward"> </em> <?php echo get_lang('Previous'); ?>
+    </button>
+    <input type="hidden" name="is_executable" id="is_executable" value="-" />
+    <button type="submit" id="license-next" class="btn btn-success" name="step3" onclick="javascript: if(!document.getElementById('accept_licence').checked) { alert('<?php echo get_lang('YouMustAcceptLicence')?>');return false;}" value="<?php echo get_lang('Next'); ?> &gt;" >
+        <em class="fa fa-forward"> </em> <?php echo get_lang('Next'); ?>
+    </button>
+
     <?php
 }
 
@@ -1152,7 +1177,7 @@ function get_contact_registration_form()
 {
 
     $html ='
-   <form class="form-horizontal">
+   <div class="form-horizontal">
     <div class="panel panel-default">
     <div class="panel-body">
     <div id="div_sent_information"></div>
@@ -1261,13 +1286,13 @@ function get_contact_registration_form()
     <div class="clear"></div>
     <div class="form-group">
             <div class="col-sm-3">&nbsp;</div>
-            <div class="col-sm-9"><button type="button" class="btn btn-default" onclick="javascript:send_contact_information();" value="'.get_lang('SendInformation').'" ><em class="fa fa-floppy-o"></em> '.get_lang('SendInformation').'</button></div>
+            <div class="col-sm-9"><button type="button" class="btn btn-default" onclick="javascript:send_contact_information();" value="'.get_lang('SendInformation').'" ><em class="fa fa-floppy-o"></em> '.get_lang('SendInformation').'</button> <span id="loader-button"></span></div>
     </div>
     <div class="form-group">
             <div class="col-sm-3">&nbsp;</div>
             <div class="col-sm-9"><span class="form_required">*</span><small>'.get_lang('FieldRequired').'</small></div>
     </div></div></div>
-    </form>';
+    </div>';
 
     return $html;
 }

+ 1 - 1
main/lang/arabic/trad4all.inc.php

@@ -3409,7 +3409,7 @@ $MoreDetails = "For more details";
 $ServerRequirements = "Server requirements";
 $ServerRequirementsInfo = "Libraries and features the server must provide to use Chamilo to its full extent";
 $PHPVersion = "PHP version";
-$support = "support";
+$Support = "support";
 $PHPVersionOK = "PHP version is OK";
 $RecommendedSettings = "Recommended settings";
 $RecommendedSettingsInfo = "Recommended settings for your server configuration. These settings are set in the php.ini configuration file on your server.";

+ 1 - 1
main/lang/asturian/trad4all.inc.php

@@ -4647,7 +4647,7 @@ $MoreDetails = "Pa más detalles";
 $ServerRequirements = "Necesidaes del servidor";
 $ServerRequirementsInfo = "Biblioteques y funciones que'l servidor tien de tener pa poder usar Chamilo con toles sos posibilidaes.";
 $PHPVersion = "Versión PHP";
-$support = "disponible";
+$Support = "disponible";
 $PHPVersionOK = "La versión PHP ye correuta";
 $RecommendedSettings = "Parámetros recomendaos";
 $RecommendedSettingsInfo = "Parámetros recomendaos na configuración del so servidor. Estos parámetros puen establecese nel ficheru de configuración php.ini del so servidor.";

+ 2 - 2
main/lang/basque/trad4all.inc.php

@@ -5345,7 +5345,7 @@ $MoreDetails = "Xehetasun gehiago ikusteko";
 $ServerRequirements = "Zerbitzariaren eskakizunak";
 $ServerRequirementsInfo = "Chamiloren gaitasun guztiak erabili ahal izateko, zure zerbitzariak hurrengo liburutegiak eta eginkizunak eman behar ditu. Hizki laranjaz azalduta falta diren liburutegiak aukerakoak dira, baina, hauek ez instalatzekotan, Chamiloren gaitasun batzuk desgaituko dira. Geroago artean instalatu ahal izango dituzu liburutegiak, falta diren gaitasunak erabiltzeko.";
 $PHPVersion = "PHP bertsioa";
-$support = "eskuragarri";
+$Support = "eskuragarri";
 $PHPVersionOK = "Zure PHP bertsioak eskakizun guztiak betetzen ditu:";
 $RecommendedSettings = "Gomendatutako ezarpenak";
 $RecommendedSettingsInfo = "Gomendatutako ezarpenak zure zerbitzaria konfiguratzeko. Ezarpen hauek zure zerbitzariaren php.ini konfigurazio fitxategian ezarri beharko dira.";
@@ -6915,7 +6915,7 @@ $AddCategoryDone = "Kategoria ondo gehitu da";
 $NbCategory = "Kategoria kopurua";
 $DeleteCategoryAreYouSure = "Ziur al zaude kategoria hau ezabatu nahi duzula?";
 $DeleteCategoryDone = "Kategoria ezabatu da";
-$MofidfyCategoryDone = "Kategoria aldatu da";
+$ModifyCategoryDone = "Kategoria aldatu da";
 $NotInAGroup = "Ez dago talde batean ere";
 $DoFilter = "Iragazi";
 $ByCategory = "Kategoriaren arabera";

+ 4 - 2
main/lang/brazilian/trad4all.inc.php

@@ -5204,7 +5204,7 @@ $MoreDetails = "Para obter mais detalhes";
 $ServerRequirements = "Requisitos do servidor";
 $ServerRequirementsInfo = "O servidor deve fornecer as seguintes bibliotecas para permitir que todos os recursos do Chamilo. As bibliotecas ausentes mostrados em letras alaranjadas são opcionais, mas algumas características do Chamilo pode ser desativado se eles não estiverem instalados. Você ainda pode instalar as bibliotecas mais tarde para habilitar os recursos que faltam.";
 $PHPVersion = "Versão PHP";
-$support = "Suporte";
+$Support = "Suporte";
 $PHPVersionOK = "Sua versão do PHP corresponde ao requisito mínimo:";
 $RecommendedSettings = "Configurações recomendadas";
 $RecommendedSettingsInfo = "configurações recomendadas para a configuração do servidor Essas configurações são definidas no arquivo de configuração php.ini no seu servidor..";
@@ -6715,7 +6715,7 @@ $AddCategoryDone = "Categoria adicionada";
 $NbCategory = "Categorias Nb";
 $DeleteCategoryAreYouSure = "Está certo de querer eliminar esta categoria?";
 $DeleteCategoryDone = "Categoria eliminada";
-$MofidfyCategoryDone = "Categoria atualizada";
+$ModifyCategoryDone = "Categoria atualizada";
 $NotInAGroup = "Não está num grupo";
 $DoFilter = "Filtrar";
 $ByCategory = "Por categoria";
@@ -7750,4 +7750,6 @@ $TicketWarnAdminNoUserInCategoryComment = "Advirta via ticket administrador Sem
 $TicketAllowCategoryEditionTitle = "Permitir ticket de edição da Categoria de Título";
 $TicketAllowCategoryEditionComment = "Permitir ticket de Categoria Edição de Comentário";
 $TicketSystem = "Sistema de ticket";
+$MoodleFileImportedSuccessfully = "O arquivo do curso Moodle foi importado com êxito.";
+$ExtensionInstalledButNotEnabled = "Extensão instalada, mas não habilitada";
 ?>

+ 1 - 1
main/lang/bulgarian/trad4all.inc.php

@@ -4613,7 +4613,7 @@ $MoreDetails = "За повече информация,";
 $ServerRequirements = "Изисквания към сървъра";
 $ServerRequirementsInfo = "Библиотеки и модули, които трябва да са инсталирани на сървъра, за да се използват напълно възможностите на системата Chamilo.";
 $PHPVersion = "Версия на PHP";
-$support = "поддръжка";
+$Support = "поддръжка";
 $PHPVersionOK = "Версията на PHP е подходяща";
 $RecommendedSettings = "Препоръчителни настройки";
 $RecommendedSettingsInfo = "Препоръчителни настройки за вашия сървър. Те се задават в кофигурационния файл php.ini.";

+ 2 - 2
main/lang/catalan/trad4all.inc.php

@@ -5560,7 +5560,7 @@ $MoreDetails = "Per a més detalls";
 $ServerRequirements = "Requeriments del servidor";
 $ServerRequirementsInfo = "Llibreries i funcionalitats que el servidor ha de proporcionar per poder utilitzar Chamilo amb totes les seves possibilitats. Les llibreries perdudes que es mostren de color taronja són opcionals, però algunes característiques de Chamilo poden ser deshabilitades si aquestes no s'instal·len. Més endavant encara podreu instal·lar aquestes llibreres per poder habilitar les característiques perdudes.";
 $PHPVersion = "Versió PHP";
-$support = "Suport";
+$Support = "Suport";
 $PHPVersionOK = "La seva versió de PHP és suficient:";
 $RecommendedSettings = "Paràmetres recomanats";
 $RecommendedSettingsInfo = "Paràmetres recomanats per a la configuració del seu servidor. Aquests paràmetres s'han de configurar en el fitxer de configuració php.ini del seu servidor.";
@@ -7138,7 +7138,7 @@ $AddCategoryDone = "Categoria afegida";
 $NbCategory = "Nombre de categories";
 $DeleteCategoryAreYouSure = "Esteu segur de voler eliminar aquesta categoria?";
 $DeleteCategoryDone = "Categoria eliminada";
-$MofidfyCategoryDone = "Categoria modificada";
+$ModifyCategoryDone = "Categoria modificada";
 $NotInAGroup = "No està a cap grup";
 $DoFilter = "Filtra";
 $ByCategory = "Per categoria";

+ 1 - 1
main/lang/croatian/trad4all.inc.php

@@ -3430,7 +3430,7 @@ $MoreDetails = "Za više pojedinosti";
 $ServerRequirements = "Karakteristike poslužitelja";
 $ServerRequirementsInfo = "Programske knjižnice i značajke koje poslužitelj mora sadržavati da bi se Chamilo sustav mogao upotrijebiti u potpunosti";
 $PHPVersion = "PHP verzija";
-$support = "podrška";
+$Support = "podrška";
 $PHPVersionOK = "PHP verzija je u redu";
 $RecommendedSettings = "Preporučene postavke";
 $RecommendedSettingsInfo = "Preporučene postavke za vaš poslužitelj. Ove postavke su postavljene u php.ini konfiguracijskoj datoteci vašeg poslužitelja.";

+ 2 - 2
main/lang/dutch/trad4all.inc.php

@@ -4728,7 +4728,7 @@ $MoreDetails = "Voor meer details";
 $ServerRequirements = "Server vereisten";
 $ServerRequirementsInfo = "Functiebibliotheken en functionaliteiten die de server moet voorzien om Chamilo ten volle te kunnen benutten";
 $PHPVersion = "PHP versie";
-$support = "ondersteuning";
+$Support = "ondersteuning";
 $PHPVersionOK = "PHP versie is oké";
 $RecommendedSettings = "Aanbevolen instellingen";
 $RecommendedSettingsInfo = "Aanbevolen instellingen voor uw server configuratie. Deze instellingen kunnen aangepast worden in het php.ini configuratiebestand op uw server.";
@@ -5768,7 +5768,7 @@ $AddCategoryDone = "Categorie toegevoegd";
 $NbCategory = "Nb categories";
 $DeleteCategoryAreYouSure = "Bent u zeker dat u deze categorie wenst te verwijderen?";
 $DeleteCategoryDone = "Categorie verwijderd";
-$MofidfyCategoryDone = "Categorie gewijzigd";
+$ModifyCategoryDone = "Categorie gewijzigd";
 $NotInAGroup = "Niet in een groep";
 $DoFilter = "Filteren";
 $ByCategory = "Per categorie";

+ 15 - 3
main/lang/english/trad4all.inc.php

@@ -1717,7 +1717,7 @@ $AccountValidDurationTitle = "Account validity";
 $AccountValidDurationComment = "A user account is valid for this number of days after creation";
 $UseSessionModeTitle = "Use training sessions";
 $UseSessionModeComment = "Training sessions give a different way of dealing with training, where courses have an author, a coach and learners. Each coach gives a course for a set period of time, called a *training session*, to a set of learners who do not mix with other learner groups attached to another training session.";
-$HomepageViewActivity = "Activity view (default)";
+$HomepageViewActivity = "Activity view";
 $HomepageView2column = "Two columns view";
 $HomepageView3column = "Three columns view";
 $AllowUserHeadings = "Allow users profiling inside courses";
@@ -5241,7 +5241,7 @@ $MoreDetails = "For more details";
 $ServerRequirements = "Server requirements";
 $ServerRequirementsInfo = "Your server must provide the following libraries to enable all features of Chamilo. The missing libraries shown in orange letters are optional, but some features of Chamilo might be disabled if they are not installed. You can still install those libraries later on to enable the missing features.";
 $PHPVersion = "PHP version";
-$support = "support";
+$Support = "support";
 $PHPVersionOK = "Your PHP version matches the minimum requirement:";
 $RecommendedSettings = "Recommended settings";
 $RecommendedSettingsInfo = "Recommended settings for your server configuration. These settings are set in the php.ini configuration file on your server.";
@@ -6770,7 +6770,7 @@ $AddCategoryDone = "Category added";
 $NbCategory = "Nb categories";
 $DeleteCategoryAreYouSure = "Are you sure you want to delete this category?";
 $DeleteCategoryDone = "Category deleted";
-$MofidfyCategoryDone = "Category updated";
+$ModifyCategoryDone = "Category updated";
 $NotInAGroup = "Not in a group";
 $DoFilter = "Filter";
 $ByCategory = "By category";
@@ -7851,5 +7851,17 @@ $Palettes = "Palettes";
 $DesignWithBadgeStudioComment = "Usa Badge Studio para crear tu propia insignia dentro de tu plataforma";
 $YouAlreadySentThisFile = "You have already sent this file or another file with the same name. Please make sure you only upload each file once.";
 $DocumentsDefaultVisibility = "Default visibility of new documents";
+$TicketAllowStudentAddTitle = "Allow users to add tickets";
+$TicketAllowStudentAddComment = "Allows all users to add tickets not only the administrators.";
+$TicketSendWarningToAllAdminsTitle = "Send ticket warning messages to administrators";
+$TicketSendWarningToAllAdminsComment = "Send a message if a ticket was created without a category or if a category doesn't have any administrator assigned.";
+$TicketWarnAdminNoUserInCategoryTitle = "Send alert to administrators if tickets category has no one in charge";
+$TicketWarnAdminNoUserInCategoryComment = "Send a warning message (email and chamilo message) to all administrators if there's not a user assigned to a category.";
+$TicketAllowCategoryEditionTitle = "Allow tickets categories edition";
+$TicketAllowCategoryEditionComment = "Allow category edition by administrators.";
+$TicketSystem = "Tickets";
 $MoodleFileImportedSuccessfully = "The Moodle course file has been imported successfully.";
+$ExtensionInstalledButNotEnabled = "Extension installed but not enabled";
+$MailingTestSent = "E-mail sent. This procedure works in all aspects similarly to the normal e-mail sending of Chamilo, but allows for more flexibility in terms of destination e-mail and message body.";
+$EMailTester = "E-mail tester";
 ?>

+ 1 - 1
main/lang/esperanto/trad4all.inc.php

@@ -2424,7 +2424,7 @@ $MoreDetails = "Por pliaj detaloj";
 $ServerRequirements = "Servilaj bezonoj";
 $ServerRequirementsInfo = "Funkciaj bibliotekoj kaj funkciaroj provizendaj de la servilo por igi Chamilo-on plene uzebla";
 $PHPVersion = "PHP-versio";
-$support = "subteno";
+$Support = "subteno";
 $PHPVersionOK = "PHP-versio estas en ordo";
 $RecommendedSettings = "Rekomenditaj aranĝoj";
 $RecommendedSettingsInfo = "Rekomendindaj aranĝoj por via servilo. Eblas ŝanĝi tiujn aranĝojn en la php.ini konfigura dosiero en via servilo.";

+ 12 - 0
main/lang/french/trad4all.inc.php

@@ -7798,7 +7798,19 @@ $Palettes = "Palettes";
 $DesignWithBadgeStudioComment = "Utilisez le designer de badges intégré pour créer votre propre badge.";
 $YouAlreadySentThisFile = "Vous avez déjà envoyé ce fichier ou un autre fichier du même nom. Veuillez vous assurer de n'envoyer qu'une seule fois chaque fichier.";
 $DocumentsDefaultVisibility = "Visibilité par défaut des nouveaux documents";
+$TicketAllowStudentAddTitle = "Autoriser les utilisateurs à ajouter des tickets";
+$TicketAllowStudentAddComment = "Autoriser les utilisateurs à enregistrer de nouveaux tickets (sinon seuls les administrateurs peuvent le faire).";
+$TicketSendWarningToAllAdminsTitle = "Envoyer alertes de tickets aux admins";
+$TicketSendWarningToAllAdminsComment = "Envoyer un message si un ticket a été créé sans catégorie, ou si aucun administrateur n'a été assigné à la catégorie de ticket sélectionnée.";
+$TicketWarnAdminNoUserInCategoryTitle = "Alerter les admins si pas d'utilisateur pour une catégorie de tickets";
+$TicketWarnAdminNoUserInCategoryComment = "Envoyer un message d'avertissement (e-mail et message interne de Chamilo) à tous les administrateurs s'il existe une catégorie de tickets qui n'est assignée à aucun utilisateur (ce qui pourrait causer des oublis de tickets).";
+$TicketAllowCategoryEditionTitle = "Édition des catégories de tickets";
+$TicketAllowCategoryEditionComment = "Permettre l'édition de catégories de tickets par les administrateurs.";
+$TicketSystem = "Tickets";
 $MoodleFileImportedSuccessfully = "Le fichier de cours Moodle a été importé avec succès.";
+$ExtensionInstalledButNotEnabled = "Extension installée mais pas activée";
+$MailingTestSent = "Le courriel a été envoyé. Cette page se comporte en tous points comme l'envoi normal de courriels depuis Chamilo, ce qui permet de faire des tests un peu plus poussés en alternant les destinataires et corps du courriel.";
+$EMailTester = "Testeur de courriel";
 
 
 $TCCConnection = 'Connexion à TCC';

+ 2 - 2
main/lang/galician/trad4all.inc.php

@@ -5197,7 +5197,7 @@ $MoreDetails = "Para máis detalles";
 $ServerRequirements = "Requisitos do servidor";
 $ServerRequirementsInfo = "As librarías e funcións que o servidor debe fornecer para poder utilizar Chamilo con todas as súas capacidades";
 $PHPVersion = "Versión do PHP";
-$support = "soporte";
+$Support = "soporte";
 $PHPVersionOK = "A versión do PHP está ben";
 $RecommendedSettings = "Configuración recomendada";
 $RecommendedSettingsInfo = "Configuración recomendada para a configuración do seu servidor. Esta configuración faise constar no ficheiro de configuración php.ini do seu servidor.";
@@ -6752,7 +6752,7 @@ $AddCategoryDone = "Categoría engadida";
 $NbCategory = "Categorías Nb";
 $DeleteCategoryAreYouSure = "Estás seguro que queres borrar esta categorái?";
 $DeleteCategoryDone = "Categoría eliminada";
-$MofidfyCategoryDone = "Categoría actualizada";
+$ModifyCategoryDone = "Categoría actualizada";
 $NotInAGroup = "Non nun grupo";
 $DoFilter = "Filtro";
 $ByCategory = "Por categoria";

+ 2 - 2
main/lang/german/trad4all.inc.php

@@ -4874,7 +4874,7 @@ $MoreDetails = "Weitere Details";
 $ServerRequirements = "Voraussetzungen des Servers";
 $ServerRequirementsInfo = "Bibliotheken und Funktionen, die der Server bereitstellen muss, damit Chamilo voll genutzt werden kann. Die fehlenden optionalen Bibliotheken sind in orange, jedoch sind einige Funktionen in Chamilo dadurch nicht verfügbar. Diese lassen sich später jederzeit nachinstallieren und aktivieren.";
 $PHPVersion = "PHP Version";
-$support = "Support";
+$Support = "Support";
 $PHPVersionOK = "PHP Version ist Ok";
 $RecommendedSettings = "Empfohlene Einstellungen";
 $RecommendedSettingsInfo = "Empfohlene Einstellungen für die Konfiguration Ihres Servers. Diese Einstellungen werden in der php.ini Datei auf Ihrem Server vorgenommen.";
@@ -6374,7 +6374,7 @@ $AddCategoryDone = "Katgeorie hinzugefügt";
 $NbCategory = "Gemerkte Kategorien";
 $DeleteCategoryAreYouSure = "Sind Sie sicher, dass Sie diese Kategorie löschen wollen?";
 $DeleteCategoryDone = "Kategorie gelöscht";
-$MofidfyCategoryDone = "Kategorie aktualisiert";
+$ModifyCategoryDone = "Kategorie aktualisiert";
 $NotInAGroup = "Nicht in einer Gruppe";
 $DoFilter = "Filter";
 $ByCategory = "Nach Kategorie";

+ 2 - 2
main/lang/greek/trad4all.inc.php

@@ -5206,7 +5206,7 @@ $MoreDetails = "For more details";
 $ServerRequirements = "Server requirements";
 $ServerRequirementsInfo = "Your server must provide the following libraries to enable all features of Chamilo. The missing libraries shown in orange letters are optional, but some features of Chamilo might be disabled if they are not installed. You can still install those libraries later on to enable the missing features.";
 $PHPVersion = "PHP version";
-$support = "support";
+$Support = "support";
 $PHPVersionOK = "Your PHP version matches the minimum requirement:";
 $RecommendedSettings = "Recommended settings";
 $RecommendedSettingsInfo = "Recommended settings for your server configuration. These settings are set in the php.ini configuration file on your server.";
@@ -6712,7 +6712,7 @@ $AddCategoryDone = "Η κατηγορία προστέθηκε";
 $NbCategory = "Κατηγορίες Nb";
 $DeleteCategoryAreYouSure = "Είστε σίγουροι ότι θέλετε να διαγράψετε την κατηγορία?";
 $DeleteCategoryDone = "Η κατηγορία διαγράφηκε";
-$MofidfyCategoryDone = "Η κατηγορία ενημερώθηκε";
+$ModifyCategoryDone = "Η κατηγορία ενημερώθηκε";
 $NotInAGroup = "Δεν ανοίκει σε κάποια ομάδα";
 $DoFilter = "Φίλτρο";
 $ByCategory = "Ανά κατηγορία";

+ 1 - 1
main/lang/hungarian/trad4all.inc.php

@@ -3741,7 +3741,7 @@ $MoreDetails = "Részletek";
 $ServerRequirements = "Szerver kívánalmak";
 $ServerRequirementsInfo = "A Chamilo teljes kiépítettségéhez tartozó összes szolgáltatáshoz az szervernek az alábbi könyvtárakkal és tulajdonságokkal kell rendelkeznie";
 $PHPVersion = "PHP verzió";
-$support = "Támogatás";
+$Support = "Támogatás";
 $PHPVersionOK = "A PHP verzió megfelel.";
 $RecommendedSettings = "Ajánlott beállítások";
 $RecommendedSettingsInfo = "A szerver konfigurálásához tartozó ajánlott beállítások. Ezek értékei a php.ini állományban állíthatóak be.";

+ 1 - 1
main/lang/indonesian/trad4all.inc.php

@@ -2170,7 +2170,7 @@ $MoreDetails = "Untuk lebih detail";
 $ServerRequirements = "Syarat-syarat server";
 $ServerRequirementsInfo = "Library dan fitur yang dibutuhkan server untuk menggunakan Chamilo secara maksimal";
 $PHPVersion = "Versi PHP";
-$support = "dukungan";
+$Support = "dukungan";
 $PHPVersionOK = "Versi PHP OK";
 $RecommendedSettings = "Seting anjuran";
 $RecommendedSettingsInfo = "Seting anjuran untuk konfigurasi server anda.  Seting ini di set dalam file konfigurasi php.ini pada server anda.";

+ 2 - 2
main/lang/italian/trad4all.inc.php

@@ -5218,7 +5218,7 @@ $MoreDetails = "Per maggiori informazioni";
 $ServerRequirements = "Caratteristiche del server";
 $ServerRequirementsInfo = "Librerie e servizi offerti dal server per usare Chamilo al massimo delle funzionalità";
 $PHPVersion = "Versione PHP";
-$support = "supporto";
+$Support = "supporto";
 $PHPVersionOK = "La Versione di PHP è corretta";
 $RecommendedSettings = "Configurazione consigliata";
 $RecommendedSettingsInfo = "Parametri consigliati per la configurazione del server. I parametri sono memorizzati nel file di configurazione php.ini del server.";
@@ -6767,7 +6767,7 @@ $AddCategoryDone = "Categoria aggiunta";
 $NbCategory = "Nb categorie";
 $DeleteCategoryAreYouSure = "Vuoi veramente eliminare questa categoria?";
 $DeleteCategoryDone = "Categoria eliminata";
-$MofidfyCategoryDone = "Categoria aggiornata";
+$ModifyCategoryDone = "Categoria aggiornata";
 $NotInAGroup = "Non in un gruppo";
 $DoFilter = "Filtro";
 $ByCategory = "Per categoria";

+ 2 - 2
main/lang/latvian/trad4all.inc.php

@@ -4561,7 +4561,7 @@ $MoreDetails = "Lai iegūtu sīkāku informāciju";
 $ServerRequirements = "Servera vajadzības";
 $ServerRequirementsInfo = "Bibliotēkām un servera funkcijām ir jānodrošina izmantot Chamilo pilnā apmērā";
 $PHPVersion = "PHP versija";
-$support = "atbalsts";
+$Support = "atbalsts";
 $PHPVersionOK = "PHP versija ir OK";
 $RecommendedSettings = "Rekomendētie iestatījumi";
 $RecommendedSettingsInfo = "Ieteicamie iestatījumi servera konfigurācijai. Šie iestatījumi ir noteikti php.ini konfigurācijas failā uz jūsu servera.";
@@ -5612,7 +5612,7 @@ $AddCategoryDone = "Testa kategorijas pievienošana paveikta";
 $NbCategory = "Kategorijas numurs";
 $DeleteCategoryAreYouSure = "Jūs esat pārliecināts par nepieciešamību dzēst Kategoriju";
 $DeleteCategoryDone = "Kategorija ir izdzēsta";
-$MofidfyCategoryDone = "Kategorijas izmaiņas ir veiktas";
+$ModifyCategoryDone = "Kategorijas izmaiņas ir veiktas";
 $NotInAGroup = "Nav grupā";
 $DoFilter = "Filtrēt";
 $ByCategory = "Pēc kategorijas";

+ 1 - 1
main/lang/lithuanian/trad4all.inc.php

@@ -2835,7 +2835,7 @@ $MoreDetails = "For more details";
 $ServerRequirements = "Server requirements";
 $ServerRequirementsInfo = "Libraries and features the server must provide to use Chamilo to its full extent";
 $PHPVersion = "PHP version";
-$support = "support";
+$Support = "support";
 $PHPVersionOK = "PHP version is OK";
 $RecommendedSettings = "Recommended settings";
 $RecommendedSettingsInfo = "Recommended settings for your server configuration. These settings are set in the php.ini configuration file on your server.";

+ 1 - 1
main/lang/macedonian/trad4all.inc.php

@@ -2817,7 +2817,7 @@ $MoreDetails = "За повеќе детали";
 $ServerRequirements = "Барања што се однесуват на серверот";
 $ServerRequirementsInfo = "Библиотеки и одлики што серверот мора да ги нуди за  да може целосно да се исползуваат можностите на Chamilo";
 $PHPVersion = "Верзија на PHP";
-$support = "поддршка";
+$Support = "поддршка";
 $PHPVersionOK = "PHP верзијата е добра";
 $RecommendedSettings = "Препорачливи поставки";
 $RecommendedSettingsInfo = "Препорачливи поставки за конфигурирањето на Вашиот сервер. Тие поставки се поставени во конфигурациската датотека php.ini на Вашиот сервер.";

+ 2 - 2
main/lang/polish/trad4all.inc.php

@@ -4759,7 +4759,7 @@ $MoreDetails = "Więcej informacji";
 $ServerRequirements = "Wymagania serwera";
 $ServerRequirementsInfo = "Twój serwer musi dostarczyć następujące biblioteki, aby włączyć wszystkie funkcje Chamilo. Brakujące biblioteki oznaczone pomarańczowymi literami są opcjonalne, ale niektóre funkcje Chamilo mogą być wyłączone, jeżeli nie są zainstalowane. Można zainstalować te biblioteki później, aby włączyć brakujące funkcje.";
 $PHPVersion = "wersja PHP";
-$support = "wsparcie";
+$Support = "wsparcie";
 $PHPVersionOK = "Twoja wersja PHP pasuje do minimalnych wymagań:";
 $RecommendedSettings = "Zalecane ustawienia";
 $RecommendedSettingsInfo = "Zalecane ustawienia do konfiguracji serwera. Ustawienia te są ustawione w pliku konfiguracyjnym php.ini na Twoim serwerze.";
@@ -6283,7 +6283,7 @@ $AddCategoryDone = "Kategoria dodana";
 $NbCategory = "Kategorie Nb";
 $DeleteCategoryAreYouSure = "Na pewno chcesz usunąć tą kategorię?";
 $DeleteCategoryDone = "Kategoria usunięta";
-$MofidfyCategoryDone = "Kategoria zaktualizowana";
+$ModifyCategoryDone = "Kategoria zaktualizowana";
 $NotInAGroup = "Nie w grupie";
 $DoFilter = "Sortuj";
 $ByCategory = "Według kategorii";

+ 10 - 11
main/lang/portuguese/trad4all.inc.php

@@ -30,7 +30,7 @@ $CotangentCot = "Co-tangente:\t\t\tcot(x)";
 $HyperbolicCotangentCoth = "Co-tangente hiperbólico:\t\tcoth(x)";
 $ArccotangentArccot = "Arcoco-tangente:\t\t\tarccot(x)";
 $HyperbolicArccotangentArccoth = "Arco-cotangente hiperbólico:\t\tarccoth(x)";
-$HelpCookieUsageValidation = "Para o bom funcionamento do site e medir a sua utilização, esta plataforma usa cookies.<br /><br />\nSe que julgar necessário, a seção de ajuda do seu navegador vai falar sobre as prcedimientos para definir cookies.<br /><br />\nPara obter mais informações sobre cookies, você pode visitar o site <a href=\\"http://www.aboutcookies.org/\\">About Cookies</a> (em inglês) ou qualquer equivalente em 
+$HelpCookieUsageValidation = "Para o bom funcionamento do site e medir a sua utilização, esta plataforma usa cookies.<br /><br />\nSe que julgar necessário, a seção de ajuda do seu navegador vai falar sobre as prcedimientos para definir cookies.<br /><br />\nPara obter mais informações sobre cookies, você pode visitar o site <a href='http://www.aboutcookies.org/'>About Cookies</a> (em inglês) ou qualquer equivalente em 
 português.";
 $YouAcceptCookies = "Ao continuar a utilizar este site, você declara aceitar o uso de cookies.";
 $TemplateCertificateComment = "Certificado de exemplo";
@@ -45,7 +45,7 @@ $Formula = "Fórmula";
 $MultipleConnectionsAreNotAllow = "Este usuário já está conectado";
 $Listen = "Ouvir";
 $AudioFileForItemX = "Áudio para o item %s";
-$ThereIsANewWorkFeedbackInWorkXHere = "Há um novo comentário na tarefa %s. Para ver <a href=\\"%s\\">clique aqui </a>";
+$ThereIsANewWorkFeedbackInWorkXHere = "Há um novo comentário na tarefa %s. Para ver <a href='%s'>clique aqui </a>";
 $ThereIsANewWorkFeedback = "Há um novo comentário na tarefa %s";
 $LastUpload = "Último carregamento";
 $EditUserListCSV = "Editar usuários por CSV";
@@ -5210,7 +5210,7 @@ $MoreDetails = "Para mais detalhes";
 $ServerRequirements = "Requisitos do servidor";
 $ServerRequirementsInfo = "As bibliotecas e recursos do servidor devem proporcionar a utilização do Chamilo em toda a sua extensão";
 $PHPVersion = "Versão do PHP";
-$support = "suporte";
+$Support = "suporte";
 $PHPVersionOK = "A versão de PHP está correcta";
 $RecommendedSettings = "Definições recomendadas";
 $RecommendedSettingsInfo = "Definições recomendadas para a configuração do servidor. Estas definições são definidas no ficheiro de configuração php.ini no seu servidor.";
@@ -5948,7 +5948,7 @@ $ContactInformationHasBeenSent = "Informação de contato enviada";
 $EditExtraFieldOptions = "Editar opções os campos extras";
 $ExerciseDescriptionLabel = "Descrição";
 $UserInactivedSinceX = "Usuário inativo a partir de %s";
-$ContactInformationDescription = "Caro usuário,\n\nestá prestes a instalar um dos a melhor plataforma open source de e-learning no mercado. Como muitos outros projetos de código aberto, Chamilo é apoiado por uma grande comunidade de professores, estudantes, desenvolvedores e criadores de conteúdo.\n\nSe você sabe mais quem vai gerir este sistema e-learning, pode divulgar outros que o nosso software que você usa e você pode dizer sobre eventos que possam ser de interesse.\n\nCumplimentar essa forma consiste na aceitação do associação Chamilo ou seus membros possam enviar informações por e-mail sobre eventos ou atualizações importantes o software Chamilo. Isso irá ajudar a comunidade a crescer como uma entidade organizada, onde o fluxo de informações, é feito o respeito permanente para o seu tempo e sua privacidade.\n\nNo entanto, note que não tem nenhuma obrigação de preencher este formulário. Se você deseja manter o anonimato, vamos perder a oportunidade de oferecer todos os privilégios de ser um portal administrador registrado, mas vai respeitar sua decisão. Basta deixar este formulário em branco e clique em \\"Avançar\\" para continuar a instalação Chamilo.";
+$ContactInformationDescription = "Caro usuário,\n\nestá prestes a instalar um dos a melhor plataforma open source de e-learning no mercado. Como muitos outros projetos de código aberto, Chamilo é apoiado por uma grande comunidade de professores, estudantes, desenvolvedores e criadores de conteúdo.\n\nSe você sabe mais quem vai gerir este sistema e-learning, pode divulgar outros que o nosso software que você usa e você pode dizer sobre eventos que possam ser de interesse.\n\nCumplimentar essa forma consiste na aceitação do associação Chamilo ou seus membros possam enviar informações por e-mail sobre eventos ou atualizações importantes o software Chamilo. Isso irá ajudar a comunidade a crescer como uma entidade organizada, onde o fluxo de informações, é feito o respeito permanente para o seu tempo e sua privacidade.\n\nNo entanto, note que não tem nenhuma obrigação de preencher este formulário. Se você deseja manter o anonimato, vamos perder a oportunidade de oferecer todos os privilégios de ser um portal administrador registrado, mas vai respeitar sua decisão. Basta deixar este formulário em branco e clique em 'Avançar' para continuar a instalação Chamilo.";
 $CompanyActivity = "Actividade da empresa";
 $PleaseAllowUsALittleTimeToSubscribeYouToOneOfOurCourses = "Por favor, permita-nos um pouco de tempo para inscrevê-lo num de nossos cursos. Se acha que nos esquecemos de si, contacte os administradores do portal. Normalmente pode encontrar os detalhes de contato no rodapé desta página.";
 $ManageSessionFields = "Administrar campos de sessão";
@@ -6082,8 +6082,8 @@ $CourseRequestAcceptedEmailText = "Seu petição do curso %s foi aprovado. Um no
 $CourseRequestRejectedEmailSubject = "%s A petição do curso %s foi rejeitada";
 $CourseRequestRejectedEmailText = "Lamentamos que o pedido do curso% s foi rejeitada porque não está em conformidade com os nossos termos e condições.";
 $CourseValidationTermsAndConditionsLink = "Petição do cursos - link para termos e condições";
-$CourseValidationTermsAndConditionsLinkComment = "A URL que liga o documento \\"Termos e Condições\\" que regem a aplicação de um curso. Se este endereço
-é definido, o usuário terá que ler e aceitar os termos e condições antes de submeter o seu pedido claro. Se você ativar o módulo \\"Termos e Condições\\" Chamilo e quiser usá-lo, em vez de termos e condições próprias, deixe este campo em branco.";
+$CourseValidationTermsAndConditionsLinkComment = "A URL que liga o documento 'Termos e Condições' que regem a aplicação de um curso. Se este endereço
+é definido, o usuário terá que ler e aceitar os termos e condições antes de submeter o seu pedido claro. Se você ativar o módulo 'Termos e Condições' Chamilo e quiser usá-lo, em vez de termos e condições próprias, deixe este campo em branco.";
 $CourseCreationFailed = "O curso não tiver sido criado devido a um erro interno.";
 $CourseRequestCreationFailed = "A petição do curso não tiver sido criada devido a um erro interno.";
 $CourseRequestEdit = "Editar uma petição do curso";
@@ -6103,7 +6103,7 @@ $SSOServerUnAuthURIComment = "Endereço da página do servidor que um usuário d
 $SSOServerProtocolTitle = "Protocolo do servidor Single Sign On";
 $SSOServerProtocolComment = "Prefixo que indica o domínio do servidor protocolo de Single Sign On (se o servidor permitir, recomendamos https:// para protocolos seguros não são um perigo para um sistema de autenticação)";
 $EnabledWirisTitle = "Editor matemática WIRIS";
-$EnabledWirisComment = "Ativar WIRIS editor matemática. Ao instalar este plugin você começa WIRIS editor e WIRIS CAS. Activation <br/> não é completamente feito se você ainda não tiver baixado o <a href=\\"http://www.wiris.com/es/plugins3/ckeditor/download\\" target=\\"_ blank\\">PHP plugin para CKeditor do WIRIS</a> e conteúdo diretório descompactado no Chamilo main/inc/lib/javascript/ckeditor/plugins/ <br/>Esta vontade é necessário porque WIRIS é software proprietário e serviços do WIRIS são <a href=\\"http://www.wiris.com/store/who-pays\\" target=\\"_blank\\">comercial</a>. Para fazer ajustes para o plugin editar o arquivo configuration.ini ou substituir seu conteúdo com o de configuration.ini.default que acompanha Chamilo.";
+$EnabledWirisComment = "Ativar WIRIS editor matemática. Ao instalar este plugin você começa WIRIS editor e WIRIS CAS. Activation <br/> não é completamente feito se você ainda não tiver baixado o <a href='http://www.wiris.com/es/plugins3/ckeditor/download' target='_ blank'>PHP plugin para CKeditor do WIRIS</a> e conteúdo diretório descompactado no Chamilo main/inc/lib/javascript/ckeditor/plugins/ <br/>Esta vontade é necessário porque WIRIS é software proprietário e serviços do WIRIS são <a href='http://www.wiris.com/store/who-pays' target='_blank'>comercial</a>. Para fazer ajustes para o plugin editar o arquivo configuration.ini ou substituir seu conteúdo com o de configuration.ini.default que acompanha Chamilo.";
 $FileSavedAs = "Ficheiro guardado como";
 $FileExportAs = "Ficheiro exportado como";
 $AllowSpellCheckTitle = "Corretor ortografico";
@@ -6127,8 +6127,7 @@ $AverageScore = "Média de resultados";
 $LastConnexionDate = "Data da última entrada";
 $ToolVideoconference = "Videoconferência";
 $BigBlueButtonEnableTitle = "Ferramenta do videoconferência BigBlueButton";
-$BigBlueButtonEnableComment = "Selecione se deseja ativar a ferramenta de videoconferência BigBlueButton. Uma vez ativado, ele aparecerá como uma ferramenta na página principal de todos os cursos. Os professores podem iniciar uma videoconferência, a qualquer momento, mas os estudantes só podem aderir a um já lançado. Se você não tiver um servidor BigBlueButton, tente <a href=\\"http://bigbluebutton.org/\\" target=\\"_blank\\">configurar um</a> ou pedir a ajuda do <a href=\\"http://www.chamilo.org/en/providers\\"
-target=\\"_blank\\">provedores oficiais do Chamilo</a>. BigBlueButton é livre, mas a instalação requer certas habilidades técnicas que nem todo mundo possui. Você pode instalá-lo em seu próprio país ou procurar ajuda profissional com o consequente custo. Na lógica do software livre, oferecemos-lhe as ferramentas para fazer seu trabalho mais fácil e nós recomendamos profissionais (os fornecedores oficiais Chamilo), que será capaz de ajudar.";
+$BigBlueButtonEnableComment = "Selecione se deseja ativar a ferramenta de videoconferência BigBlueButton. Uma vez ativado, ele aparecerá como uma ferramenta na página principal de todos os cursos. Os professores podem iniciar uma videoconferência, a qualquer momento, mas os estudantes só podem aderir a um já lançado. Se você não tiver um servidor BigBlueButton, tente <a href='http://bigbluebutton.org/' target='_blank'>configurar um</a> ou pedir a ajuda do <a href='http://www.chamilo.org/en/providers' target='_blank'>provedores oficiais do Chamilo</a>. BigBlueButton é livre, mas a instalação requer certas habilidades técnicas que nem todo mundo possui. Você pode instalá-lo em seu próprio país ou procurar ajuda profissional com o consequente custo. Na lógica do software livre, oferecemos-lhe as ferramentas para fazer seu trabalho mais fácil e nós recomendamos profissionais (os fornecedores oficiais Chamilo), que será capaz de ajudar.";
 $BigBlueButtonHostTitle = "Servidor host BigBlueButton";
 $BigBlueButtonHostComment = "Este é o nome do servidor em que o servidor BigBlueButton está em execução. Ele pode ser localhost, um endereço IP (por exemplo, 192.168.14.54) ou um nome de domínio (por exemplo, my.video.com).";
 $BigBlueButtonSecuritySaltTitle = "Chave de segurança do servidor BigBlueButton";
@@ -6373,7 +6372,7 @@ $EvaluationHasBeenLocked = "Avaliação foi bloqueada";
 $AllDone = "Dias comprovados";
 $AllNotDone = "Dias não verificados";
 $IfYourLPsHaveAudioFilesIncludedYouShouldSelectThemFromTheDocuments = "Se os seus caminhos de aprendizagem tem arquivos de áudio incluído, você deve selecioná-los a partir dos documentos";
-$IfYouPlanToUpgradeFromOlderVersionYouMightWantToHaveAlookAtTheChangelog = "Se você planeja fazer um upgrade de uma versão mais antiga do Chamilo, você pode querer <a href=\\"http://translate.chamilo.org/documentation/changelog.html\\" target=\\"_blank\\">ter um olhar para o changelog</a> para saber o que há de novo eo que foi alterado";
+$IfYouPlanToUpgradeFromOlderVersionYouMightWantToHaveAlookAtTheChangelog = "Se você planeja fazer um upgrade de uma versão mais antiga do Chamilo, você pode querer <a href='http://translate.chamilo.org/documentation/changelog.html' target='_blank'>ter um olhar para o changelog</a> para saber o que há de novo eo que foi alterado";
 $UplUploadFailedSizeIsZero = "Ocorreu um problema ao carregar o documento: o arquivo recebido tinha um tamanho de 0 bytes no servidor. Por favor, reveja o arquivo local e caso constate qualquer tipo de corrupção ou danos, tente novamente.";
 $CourseBelongURL = "Curso registrado para o URL";
 $CoursesInPlatform = "Cursos em a plataforma";
@@ -6533,7 +6532,7 @@ $AddCategoryDone = "Categoria adicionada";
 $NbCategory = "Categorias Nb";
 $DeleteCategoryAreYouSure = "Tem a certeza de que quer eliminar esta categoria?";
 $DeleteCategoryDone = "Categoria eliminada";
-$MofidfyCategoryDone = "Categoria atualizada";
+$ModifyCategoryDone = "Categoria atualizada";
 $NotInAGroup = "Não está num grupo";
 $DoFilter = "Filtrar";
 $ByCategory = "Por categoria";

+ 1 - 1
main/lang/quechua_cusco/trad4all.inc.php

@@ -4310,7 +4310,7 @@ $MoreDetails = "Para más detalles";
 $ServerRequirements = "Requisitos del servidor";
 $ServerRequirementsInfo = "Bibliotecas y funcionalidades que el servidor debe proporcionar para poder utilizar Chamilo con todas sus posibilidades.";
 $PHPVersion = "Versión PHP";
-$support = "disponible";
+$Support = "disponible";
 $PHPVersionOK = "La versión PHP es correcta";
 $RecommendedSettings = "Parámetros recomendados";
 $RecommendedSettingsInfo = "Parámetros recomendados para la configuración de su servidor. Estos parámetros deben establecerse en el fichero de configuración php.ini de su servidor.";

+ 2 - 2
main/lang/romanian/trad4all.inc.php

@@ -5083,7 +5083,7 @@ $MoreDetails = "Pentru mai multe detalii";
 $ServerRequirements = "Cerintele serverului";
 $ServerRequirementsInfo = "Librarii si optiuni pe care serverul trebuie sa le ofere pentru a utiliza Chamilo la capacitatea sa maxima";
 $PHPVersion = "Versiune PHP";
-$support = "suport";
+$Support = "suport";
 $PHPVersionOK = "Versiunea PHP este OK";
 $RecommendedSettings = "Setari recomandate";
 $RecommendedSettingsInfo = "Setarile recomandate pentru configuratia sistemului dumneavoastra. Aceste setari sunt fixate in fisierul de configuratie php.ini din serverul dumneavoastra.";
@@ -6426,7 +6426,7 @@ $AddCategoryDone = "Categorie adăugata cu succes";
 $NbCategory = "Numarul de categorii";
 $DeleteCategoryAreYouSure = "¿Sunteti sigur ca doriti sa eliminati aceasta categorie?";
 $DeleteCategoryDone = "Categorie eliminata";
-$MofidfyCategoryDone = "Categorie modificata";
+$ModifyCategoryDone = "Categorie modificata";
 $NotInAGroup = "Nu este în nici un grup";
 $DoFilter = "Filtrat";
 $ByCategory = "Pe categorii";

+ 1 - 1
main/lang/russian/trad4all.inc.php

@@ -3157,7 +3157,7 @@ $MoreDetails = "Более подробно";
 $ServerRequirements = "Требования сервера";
 $ServerRequirementsInfo = "Библиотеки и функциональные возможности сервера должны обеспечивать использование Chamilo в полном объеме";
 $PHPVersion = "PHP версия";
-$support = "поддержка";
+$Support = "поддержка";
 $PHPVersionOK = "PHP версия подходит";
 $RecommendedSettings = "Рекомендованные настройки";
 $RecommendedSettingsInfo = "Рекомендованные настройки для конфигурации Вашего сервера. Они находятся на вашем сервере в файле конфигураций php.ini";

+ 1 - 1
main/lang/simpl_chinese/trad4all.inc.php

@@ -3467,7 +3467,7 @@ $of = "of";
 $MoreDetails = "要求更多详情";
 $ServerRequirements = "伺服器要求";
 $PHPVersion = "PHP 版本";
-$support = "支持";
+$Support = "支持";
 $PHPVersionOK = "PHP 版本能接受";
 $RecommendedSettings = "推荐设定";
 $RecommendedSettingsInfo = "服务器的推荐设定。这些设定已出现在您的服务器里的php.ini文件。";

+ 2 - 2
main/lang/slovak/trad4all.inc.php

@@ -5312,7 +5312,7 @@ $MoreDetails = "Pre viac detailov";
 $ServerRequirements = "Požiadavky serveru";
 $ServerRequirementsInfo = "Váš server musí poskytnúť nasledujúce knižnice, aby boli povolené všetky funkcie Chamilo. Chýbajúce knižnice zobrazené písmenami na oranžovo sú nepovinné, ale niektoré funkcie Chamilo môžu byť zakázané, pokiaľ nie sú nainštalované. Stále môžete nainštalovať tieto knižnice neskôr a povoliť chýbajúce funkcie.";
 $PHPVersion = "PHP verzia";
-$support = "podpora";
+$Support = "podpora";
 $PHPVersionOK = "PHP verzia je OK";
 $RecommendedSettings = "Odporúčané nastavenia";
 $RecommendedSettingsInfo = "Odporúčané nastavenia pre konfiguráciu Vášho servera. Tieto nastavenia sú dané v konfiguračnom súbore php.ini na Vašom serveri.";
@@ -6878,7 +6878,7 @@ $AddCategoryDone = "Kategória pridaná";
 $NbCategory = "Nb kategórie";
 $DeleteCategoryAreYouSure = "Ste si istí, že chcete zmazať túto kategóriu?";
 $DeleteCategoryDone = "Kategória zmazaná";
-$MofidfyCategoryDone = "Kategória aktualizovaná";
+$ModifyCategoryDone = "Kategória aktualizovaná";
 $NotInAGroup = "Nie v skupine";
 $DoFilter = "Filter";
 $ByCategory = "Podľa kategórie";

+ 2 - 2
main/lang/slovenian/trad4all.inc.php

@@ -5199,7 +5199,7 @@ $MoreDetails = "Za več podrobnosti";
 $ServerRequirements = "Strežnikove zahteve";
 $ServerRequirementsInfo = "Knjižnjice in zmožnosti, ki jih strežnik mora zagotavljati, da Chamilo doseže polno funkcionalnost";
 $PHPVersion = "Verzija PHP";
-$support = "podpora";
+$Support = "podpora";
 $PHPVersionOK = "PHP vezija : ustrezna";
 $RecommendedSettings = "Priporočene nastavitve";
 $RecommendedSettingsInfo = "Priporočene nastavitve za strežniško nastavitev. Te nastavitve so shranjene v datoteki php.ini vašega strežnika.";
@@ -6726,7 +6726,7 @@ $AddCategoryDone = "Kategorija je bila dodana";
 $NbCategory = "vprašanj v tej kategoriji.";
 $DeleteCategoryAreYouSure = "Resnično želite odstraniti kategorijo?";
 $DeleteCategoryDone = "Kategorija je bila odstranjena";
-$MofidfyCategoryDone = "Kategorija je bila ažurirana";
+$ModifyCategoryDone = "Kategorija je bila ažurirana";
 $NotInAGroup = "Ni v skupini";
 $DoFilter = "Filtriraj";
 $ByCategory = "Po kategorijah";

+ 15 - 3
main/lang/spanish/trad4all.inc.php

@@ -5241,7 +5241,7 @@ $MoreDetails = "Para más detalles";
 $ServerRequirements = "Requisitos del servidor";
 $ServerRequirementsInfo = "Bibliotecas y funcionalidades que el servidor debe proporcionar para poder utilizar Chamilo con todas sus posibilidades.";
 $PHPVersion = "Versión PHP";
-$support = "disponible";
+$Support = "disponible";
 $PHPVersionOK = "Su versión PHP es suficiente:";
 $RecommendedSettings = "Parámetros recomendados";
 $RecommendedSettingsInfo = "Parámetros recomendados para la configuración de su servidor. Estos parámetros deben establecerse en el fichero de configuración php.ini de su servidor.";
@@ -6392,7 +6392,7 @@ $ShowGroupsToUsersComment = "Mostrar las clases a los usuarios. Las clases son u
 $ExerciseWillBeActivatedFromXToY = "El ejercicio estará visible del %s al %s";
 $ExerciseAvailableFromX = "Ejercicio disponible desde el %s";
 $ExerciseAvailableUntilX = "Ejercicio disponible hasta el %s";
-$HomepageViewActivityBig = "Grande vista actividad (estilo iPad)";
+$HomepageViewActivityBig = "Vista actividad tipo iPad.";
 $CheckFilePermissions = "Verificar permisos de ficheros";
 $AddedToALP = "Añadido a una lección";
 $NotAvailable = "No disponible";
@@ -6771,7 +6771,7 @@ $AddCategoryDone = "Categoría añadida con éxito";
 $NbCategory = "Número de categorías";
 $DeleteCategoryAreYouSure = "¿Está segura que desea eliminar esta categoría?";
 $DeleteCategoryDone = "Categoría eliminada";
-$MofidfyCategoryDone = "Categoría modificada";
+$ModifyCategoryDone = "Categoría modificada";
 $NotInAGroup = "No está en ningún grupo";
 $DoFilter = "Filtrar";
 $ByCategory = "Por categoría";
@@ -7870,5 +7870,17 @@ $Palettes = "Paletas";
 $DesignWithBadgeStudioComment = "Use the Badge Studio to create your own badge from within your platform";
 $YouAlreadySentThisFile = "Ya envió este archivo u otro archivo con el mismo nombre. Por favor asegúrese de enviar cada archivo una sola vez.";
 $DocumentsDefaultVisibility = "Visibilidad por defecto de los documentos";
+$TicketAllowStudentAddTitle = "Permitir a usuarios añadir tickets";
+$TicketAllowStudentAddComment = "Permitir que todos los usuarios puedan añadir tickets, no solo los administradores.";
+$TicketSendWarningToAllAdminsTitle = "Enviar alertas de tickets a administradores";
+$TicketSendWarningToAllAdminsComment = "Enviar una alerta a todos los administradores si un ticket ha sido creado sin categoría o si la categoría elegida no tiene un administrador asignado.";
+$TicketWarnAdminNoUserInCategoryTitle = "Mensajes a administradores para categorías sin responsable";
+$TicketWarnAdminNoUserInCategoryComment = "Enviar una alerta (por correo electrónico y mensaje interno de Chamilo) a todos los administradores si existe una categoría de tickets sin responsable.";
+$TicketAllowCategoryEditionTitle = "Permitir edición de categorías de tickets";
+$TicketAllowCategoryEditionComment = "Permitir la edición de categorías de tickets por los administradores.";
+$TicketSystem = "Tickets";
 $MoodleFileImportedSuccessfully = "El archivo de curso de Moodle ha sido importado exitosamente.";
+$ExtensionInstalledButNotEnabled = "Extensión instalada pero no activada";
+$MailingTestSent = "El correo de prueba ha sido enviado. Se comporta en todos aspectos como los demás correos de Chamilo, pero permite hacer pruebas con correos y cuerpos distintos.";
+$EMailTester = "Probador de correo electrónico";
 ?>

+ 1 - 1
main/lang/spanish_latin/trad4all.inc.php

@@ -2412,7 +2412,7 @@ $MoreDetails = "Para más detalles";
 $ServerRequirements = "Requerimientos del servidor";
 $ServerRequirementsInfo = "Librerías y características que el servidor debe proporcionar para poder utilizar Chamilo con todas sus posibilidades";
 $PHPVersion = "Versión PHP";
-$support = "soporte";
+$Support = "soporte";
 $PHPVersionOK = "La versión PHP es correcta";
 $RecommendedSettings = "Parámetros recomendados";
 $RecommendedSettingsInfo = "Parámetros recomendados para la configuración de su servidor. Estos parámetros deben establecerse en el archivo de configuración php.ini de su servidor.";

+ 1 - 1
main/lang/swedish/trad4all.inc.php

@@ -3036,7 +3036,7 @@ $MoreDetails = "För mer detaljer";
 $ServerRequirements = "Krav på servern";
 $ServerRequirementsInfo = "Program och funktioner som servern måste hantera för att Chamilo ska kunna användas fullt ut";
 $PHPVersion = "PHP-version";
-$support = "support";
+$Support = "support";
 $PHPVersionOK = "PHP-versionen är OK";
 $RecommendedSettings = "Rekommenderade inställningar";
 $RecommendedSettingsInfo = "Rekommenderade inställningar för serverns konfiguration. Inställningarna görs i konfigurationsfilen php.ini av serveradministratören på din server";

+ 1 - 1
main/lang/thai/trad4all.inc.php

@@ -1969,7 +1969,7 @@ $MoreDetails = "รายละเอียดเพิ่มเติม";
 $ServerRequirements = "สิ่งที่ต้องติดตั้งในเครื่องแม่ข่ายบริการ";
 $ServerRequirementsInfo = "Libraries and features the server must provide to use Chamilo to its full extent";
 $PHPVersion = "PHP เวอร์ชั่น";
-$support = "ʹѺʹع";
+$Support = "ʹѺʹع";
 $PHPVersionOK = "PHP เวอร์ชั่นนี้ ใช้ร่วมได้";
 $RecommendedSettings = "แนะนำตามค่านี้";
 $RecommendedSettingsInfo = "Recommended settings for your server configuration. These settings are set in the php.ini configuration file on your server.";

+ 1 - 1
main/lang/trad_chinese/trad4all.inc.php

@@ -2935,7 +2935,7 @@ $Installing = "安裝";
 $MoreDetails = "詳細資料";
 $ServerRequirements = "伺服器要求";
 $PHPVersion = "PHP 版本";
-$support = "支援";
+$Support = "支援";
 $PHPVersionOK = "通過 PHP 版本";
 $RecommendedSettings = "建議設定";
 $RecommendedSettingsInfo = "伺服器設定建議。這些設定位於伺服器設定檔(php.ini configuration file)中。";

+ 1 - 1
main/lang/turkish/trad4all.inc.php

@@ -3346,7 +3346,7 @@ $Installing = "Kurulum";
 $MoreDetails = "Detaylar için";
 $ServerRequirements = "Sunucu gereksinimleri";
 $PHPVersion = "PHP sürümü";
-$support = "destek";
+$Support = "destek";
 $PHPVersionOK = "PHP sürümü Tamam";
 $RecommendedSettings = "Önerilen ayarlar";
 $DirectoryAndFilePermissions = "Klasör ve dosya izinleri";

+ 8 - 13
main/lp/lp_view.php

@@ -407,33 +407,31 @@ if (Database::num_rows($res_media) > 0) {
 
 $is_allowed_to_edit = api_is_allowed_to_edit(false, true, true, false);
 
-$breadcrumb = null;
-
+global $interbreadcrumb;
 if ($is_allowed_to_edit) {
-    global $interbreadcrumb;
     $interbreadcrumb[] = array(
-        'url' => 'lp_controller.php?action=list&isStudentView=false',
+        'url' => api_get_self().'?action=list&isStudentView=false&'.api_get_cidreq(true, true, 'course'),
         'name' => get_lang('LearningPaths')
     );
     $interbreadcrumb[] = array(
-        'url' => api_get_self() . "?action=add_item&type=step&lp_id={$_SESSION['oLP']->lp_id}&isStudentView=false&".api_get_cidreq(),
+        'url' => api_get_self() . "?action=add_item&type=step&lp_id={$_SESSION['oLP']->lp_id}&isStudentView=false&".api_get_cidreq(true, true, 'course'),
         'name' => $_SESSION['oLP']->get_name()
     );
+
     $interbreadcrumb[] = array(
         'url' => '#',
         'name' => get_lang('Preview')
     );
-    $breadcrumb = return_breadcrumb($interbreadcrumb, null, null);
 }
 
 // Return to course home.
 if ($is_allowed_to_edit) {
-    $buttonHomeUrl = 'lp_controller.php?' . api_get_cidreq() . '&' . http_build_query([
+    $buttonHomeUrl = 'lp_controller.php?' . api_get_cidreq(true, true, 'course') . '&' . http_build_query([
         'isStudentView' => 'false',
         'action' => 'return_to_course_homepage'
     ]);
 } else {
-    $buttonHomeUrl = 'lp_controller.php?' . api_get_cidreq() . '&' . http_build_query([
+    $buttonHomeUrl = 'lp_controller.php?' . api_get_cidreq(true, true, 'course') . '&' . http_build_query([
         'action' => 'return_to_course_homepage'
     ]);
 }
@@ -479,10 +477,7 @@ if ($_SESSION['oLP']->current == $_SESSION['oLP']->get_last()) {
     }
 }
 
-
-
-
-$template = new Template('title', false, false, true, true, false);
+$template = new Template('', false, false, true, true, false);
 $template->assign('glossary_extra_tools', api_get_setting('show_glossary_in_extra_tools'));
 
 $fixLinkSetting = api_get_configuration_value('lp_fix_embed_content');
@@ -508,7 +503,7 @@ $template->assign('jquery_ui_js_web_path', api_get_jquery_ui_js_web_path());
 $template->assign('jquery_ui_css_web_path', api_get_jquery_ui_css_web_path());
 $template->assign('is_allowed_to_edit', $is_allowed_to_edit);
 $template->assign('gamification_mode', $gamificationMode);
-$template->assign('breadcrumb', $breadcrumb);
+//$template->assign('breadcrumb', $breadcrumb);
 $template->assign('button_home_url', $buttonHomeUrl);
 $template->assign('button_home_text', $buttonHomeText);
 $template->assign('navigation_bar', $navigation_bar);

+ 2 - 1
main/session/about.php

@@ -149,7 +149,8 @@ $template->assign(
 );
 
 $template->assign('courses', $courses);
-$essence = new Essence\Essence();
+//$essence = new Essence\Essence();
+$essence =  Essence\Essence::instance( );
 $template->assign('essence', $essence);
 $template->assign(
     'session_extra_fields',

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov