瀏覽代碼

Merge 1.11.x

jmontoyaa 8 年之前
父節點
當前提交
f8b8112537
共有 100 個文件被更改,包括 3922 次插入381 次删除
  1. 1 0
      .gitignore
  2. 3 0
      .htaccess
  3. 3 5
      app/Migrations/Schema/V110/Version110.php
  4. 8 13
      app/Migrations/Schema/V110/Version20150603181728.php
  5. 1 1
      app/Migrations/Schema/V110/Version20151214170800.php
  6. 100 46
      app/Migrations/Schema/V111/Version111.php
  7. 10 45
      app/Migrations/Schema/V111/Version20160330103045.php
  8. 8 15
      app/Migrations/Schema/V111/Version20160727155600.php
  9. 9 7
      app/Migrations/Schema/V111/Version20160804174600.php
  10. 3 1
      app/Migrations/Schema/V111/Version20160907140300.php
  11. 1 3
      app/Migrations/Schema/V111/Version20160930144400.php
  12. 52 0
      app/Migrations/Schema/V111/Version20161028123400.php
  13. 569 14
      app/Resources/public/assets/ckeditor/plugins/image2/dialogs/image2.js
  14. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/af.js
  15. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ar.js
  16. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/bg.js
  17. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/bn.js
  18. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/bs.js
  19. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ca.js
  20. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/cs.js
  21. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/cy.js
  22. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/da.js
  23. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/de-ch.js
  24. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/de.js
  25. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/el.js
  26. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/en-au.js
  27. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/en-ca.js
  28. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/en-gb.js
  29. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/en.js
  30. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/eo.js
  31. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/es.js
  32. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/et.js
  33. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/eu.js
  34. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/fa.js
  35. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/fi.js
  36. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/fo.js
  37. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/fr-ca.js
  38. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/fr.js
  39. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/gl.js
  40. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/gu.js
  41. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/he.js
  42. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/hi.js
  43. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/hr.js
  44. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/hu.js
  45. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/id.js
  46. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/is.js
  47. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/it.js
  48. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ja.js
  49. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ka.js
  50. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/km.js
  51. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ko.js
  52. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ku.js
  53. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/lt.js
  54. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/lv.js
  55. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/mk.js
  56. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/mn.js
  57. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ms.js
  58. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/nb.js
  59. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/nl.js
  60. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/no.js
  61. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/pl.js
  62. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/pt-br.js
  63. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/pt.js
  64. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ro.js
  65. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ru.js
  66. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/si.js
  67. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/sk.js
  68. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/sl.js
  69. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/sq.js
  70. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/sr-latn.js
  71. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/sr.js
  72. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/sv.js
  73. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/th.js
  74. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/tr.js
  75. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/tt.js
  76. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/ug.js
  77. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/uk.js
  78. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/vi.js
  79. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/zh-cn.js
  80. 17 1
      app/Resources/public/assets/ckeditor/plugins/image2/lang/zh.js
  81. 1711 31
      app/Resources/public/assets/ckeditor/plugins/image2/plugin.js
  82. 67 10
      documentation/changelog.html
  83. 1 1
      documentation/credits.html
  84. 4 3
      documentation/dependencies.html
  85. 3 3
      documentation/index.html
  86. 105 57
      documentation/installation_guide.html
  87. 52 18
      documentation/installation_guide_es_ES.html
  88. 56 23
      documentation/installation_guide_fr_FR.html
  89. 1 2
      documentation/installation_guide_it_IT.html
  90. 2 3
      index.php
  91. 1 1
      main/admin/access_url_add_courses_to_url.php
  92. 1 1
      main/admin/access_url_add_usergroup_to_url.php
  93. 1 1
      main/admin/access_url_add_users_to_url.php
  94. 1 1
      main/admin/access_url_check_user_session.php
  95. 4 4
      main/admin/access_url_edit.php
  96. 1 1
      main/admin/access_url_edit_course_category_to_url.php
  97. 1 1
      main/admin/access_url_edit_courses_to_url.php
  98. 1 1
      main/admin/access_url_edit_usergroup_to_url.php
  99. 1 1
      main/admin/access_url_edit_users_to_url.php
  100. 1 1
      main/admin/access_urls.php

+ 1 - 0
.gitignore

@@ -42,6 +42,7 @@ plugin/bbb/config.vm.php
 
 # Cron temp files
 main/cron/incoming/*
+plugin/vchamilo/templates/*
 
 # Stuff updated through composer - Remove just before release
 composer.lock

+ 3 - 0
.htaccess

@@ -53,5 +53,8 @@ RewriteRule ^main/exercice/(.*)$ main/exercise/$1 [QSA,L]
 # Support old URLs using the newscorm folder rather than lp
 RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L]
 
+# service Information
+RewriteRule ^service/(\d{1,})$ plugin/buycourses/src/service_information.php?service_id=$1 [L]
+
 # Deny access
 RewriteRule ^(tests|.git) - [F,L,NC]

+ 3 - 5
app/Migrations/Schema/V110/Version110.php

@@ -46,7 +46,7 @@ class Version110 extends AbstractMigrationChamilo
         $this->addSql("CREATE TABLE IF NOT EXISTS hook_call( id int UNSIGNED NOT NULL AUTO_INCREMENT, hook_event_id int UNSIGNED NOT NULL, hook_observer_id int UNSIGNED NOT NULL, type tinyint NOT NULL, hook_order int UNSIGNED NOT NULL, enabled tinyint NOT NULL, PRIMARY KEY PK_hook_management_hook_call(id))");
         $this->addSql("CREATE TABLE IF NOT EXISTS c_student_publication_rel_document (iid INT NOT NULL PRIMARY KEY, id INT NULL, work_id INT NOT NULL, document_id INT NOT NULL, c_id INT NOT NULL)");
         $this->addSql("CREATE TABLE IF NOT EXISTS c_student_publication_rel_user (iid INT NOT NULL AUTO_INCREMENT PRIMARY KEY, id INT NULL, work_id INT NOT NULL, user_id INT NOT NULL, c_id INT NOT NULL)");
-        $this->addSql("CREATE TABLE IF NOT EXISTS c_student_publication_comment (iid INT NOT NULL PRIMARY KEY, id INT NULL, work_id INT NOT NULL, c_id INT NOT NULL, comment text, file VARCHAR(255), user_id int NOT NULL, sent_at datetime NOT NULL)");
+        $this->addSql("CREATE TABLE IF NOT EXISTS c_student_publication_comment (iid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, id INT NULL, work_id INT NOT NULL, c_id INT NOT NULL, comment text, file VARCHAR(255), user_id int NOT NULL, sent_at datetime NOT NULL)");
         $this->addSql("CREATE TABLE IF NOT EXISTS c_attendance_calendar_rel_group (iid int NOT NULL auto_increment PRIMARY KEY, id INT, c_id INT NOT NULL, group_id INT NOT NULL, calendar_id INT NOT NULL)");
 
         $this->addSql("ALTER TABLE skill_rel_user MODIFY COLUMN acquired_skill_at datetime default NULL");
@@ -154,15 +154,13 @@ class Version110 extends AbstractMigrationChamilo
         $this->addSql("ALTER TABLE course_rel_user ADD COLUMN c_id int default NULL");
         $this->addSql("ALTER TABLE course_field_values ADD COLUMN c_id int default NULL");
 
-        $this->addSql("ALTER TABLE session_rel_course_rel_user ADD COLUMN c_id int default NULL");
+        $this->addSql("ALTER TABLE session_rel_course_rel_user ADD COLUMN c_id int NOT NULL");
         $this->addSql("ALTER TABLE session_rel_course_rel_user CHANGE id_session session_id int");
         $this->addSql("ALTER TABLE session_rel_course_rel_user CHANGE id_user user_id int");
-
         $this->addSql("ALTER TABLE access_url_rel_course ADD COLUMN c_id int");
-
         $this->addSql("ALTER TABLE session_rel_course ADD COLUMN position int NOT NULL default 0");
         $this->addSql("ALTER TABLE session_rel_course ADD COLUMN category varchar(255) default ''");
-        $this->addSql("ALTER TABLE session_rel_course ADD COLUMN c_id int unsigned");
+        $this->addSql("ALTER TABLE session_rel_course ADD COLUMN c_id int unsigned NOT NULL");
         $this->addSql("ALTER TABLE session_rel_course CHANGE id_session session_id int");
         $this->addSql('DELETE FROM session_rel_course WHERE session_id NOT IN (SELECT id FROM session)');
 

+ 8 - 13
app/Migrations/Schema/V110/Version20150603181728.php

@@ -38,23 +38,18 @@ class Version20150603181728 extends AbstractMigrationChamilo
             $this->addSql('ALTER TABLE c_lp ADD subscribe_users INT NOT NULL DEFAULT 0');
         }
 
-        $this->addSql('
-            ALTER TABLE c_item_property
-            MODIFY c_id INT DEFAULT NULL,
-            MODIFY lastedit_user_id INT NOT NULL,
-            MODIFY to_group_id INT NULL,
-            MODIFY insert_user_id INT DEFAULT NULL,
-            MODIFY start_visible DATETIME DEFAULT NULL,
-            MODIFY end_visible DATETIME DEFAULT NULL,
-            MODIFY session_id INT DEFAULT NULL,
-            MODIFY to_user_id INT NULL
-        ');
-
+        $this->addSql('ALTER TABLE c_item_property MODIFY c_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_item_property MODIFY lastedit_user_id INT NOT NULL');
+        $this->addSql('ALTER TABLE c_item_property MODIFY to_group_id INT NULL');
+        $this->addSql('ALTER TABLE c_item_property MODIFY insert_user_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_item_property MODIFY start_visible DATETIME DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_item_property MODIFY end_visible DATETIME DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_item_property MODIFY session_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_item_property MODIFY to_user_id INT NULL');
         $this->addSql("UPDATE c_item_property SET start_visible = NULL WHERE start_visible = '0000-00-00 00:00:00'");
         $this->addSql("UPDATE c_item_property SET end_visible = NULL WHERE end_visible = '0000-00-00 00:00:00'");
 
         // Remove inconsistencies about non-existing courses
-
         $this->addSql("DELETE FROM c_item_property WHERE session_id IS NOT NULL and session_id <> 0 AND session_id NOT IN (SELECT id FROM session)");
         $this->addSql("DELETE FROM c_item_property WHERE to_user_id IS NOT NULL and to_user_id <> 0 AND to_user_id NOT IN (SELECT id FROM user)");
         $this->addSql("DELETE FROM c_item_property WHERE to_user_id IS NOT NULL AND to_user_id <> 0 AND to_user_id NOT IN (SELECT id FROM user)");

+ 1 - 1
app/Migrations/Schema/V110/Version20151214170800.php

@@ -39,7 +39,7 @@ class Version20151214170800 extends AbstractMigrationChamilo
 
         foreach ($answers as $answer) {
             // Recover the real image size to recalculate coordinates
-            $imagePath = api_get_path(SYS_PATH) . "courses/{$answer['directory']}/document/images/{$answer['picture']}";
+            $imagePath = __DIR__ . "/../../../../courses/{$answer['directory']}/document/images/{$answer['picture']}";
             if (!file_exists($imagePath)) {
                 error_log("Migration: Image does not exists: $imagePath");
                 continue;

+ 100 - 46
app/Migrations/Schema/V111/Version111.php

@@ -6,6 +6,7 @@ namespace Application\Migrations\Schema\V111;
 use Application\Migrations\AbstractMigrationChamilo;
 use Doctrine\DBAL\Schema\Schema;
 
+
 /**
  * Class Version111
  * Migrate file to updated to Chamilo 1.11
@@ -20,11 +21,16 @@ class Version111 extends AbstractMigrationChamilo
      */
     public function up(Schema $schema)
     {
+        // Needed to update 0000-00-00 00:00:00 values
+        $this->addSql('SET sql_mode = ""');
+        // In case this one didn't work, also try this
+        $this->addSql('SET SESSION sql_mode = ""');
+
         $this->addSql("ALTER TABLE extra_field ENGINE=InnoDB");
         $this->addSql('CREATE TABLE extra_field_saved_search (id INT AUTO_INCREMENT NOT NULL, field_id INT DEFAULT NULL, user_id INT DEFAULT NULL, value LONGTEXT DEFAULT NULL COLLATE utf8_unicode_ci, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_16ABE32A443707B0 (field_id), INDEX IDX_16ABE32AA76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
         $this->addSql('ALTER TABLE extra_field_saved_search ADD CONSTRAINT FK_16ABE32A443707B0 FOREIGN KEY (field_id) REFERENCES extra_field (id)');
         $this->addSql('ALTER TABLE extra_field_saved_search ADD CONSTRAINT FK_16ABE32AA76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
-
+        $this->addSql("ALTER TABLE extra_field_saved_search CHANGE value value LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)'");
         $this->addSql('CREATE TABLE c_lp_category_user (id INT AUTO_INCREMENT NOT NULL, category_id INT DEFAULT NULL, INDEX IDX_61F042712469DE2 (category_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
         $this->addSql('ALTER TABLE c_lp_category_user ADD CONSTRAINT FK_61F042712469DE2 FOREIGN KEY (category_id) REFERENCES c_lp_category (iid)');
 
@@ -45,8 +51,13 @@ class Version111 extends AbstractMigrationChamilo
         $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('configure_exercise_visibility_in_course','false','No') ");
         $this->addSql("ALTER TABLE c_forum_forum ADD moderated TINYINT(1) DEFAULT NULL");
         $this->addSql("ALTER TABLE c_forum_post ADD status INT DEFAULT NULL");
-        $this->addSql("CREATE TABLE c_quiz_rel_category (iid BIGINT AUTO_INCREMENT NOT NULL, c_id INT NOT NULL, category_id INT NOT NULL, exercise_id INT NOT NULL, count_questions INT NOT NULL, PRIMARY KEY(iid))");
-        $this->addSql("ALTER TABLE c_quiz ADD COLUMN question_selection_type INT");
+        $this->addSql("CREATE TABLE IF NOT EXISTS c_quiz_rel_category (iid BIGINT AUTO_INCREMENT NOT NULL, c_id INT NOT NULL, category_id INT NOT NULL, exercise_id INT NOT NULL, count_questions INT NOT NULL, PRIMARY KEY(iid))");
+
+        $table = $schema->getTable('c_quiz');
+        if (!$table->hasColumn('question_selection_type')) {
+            $this->addSql("ALTER TABLE c_quiz ADD COLUMN question_selection_type INT");
+        }
+
         $this->addSql("ALTER TABLE c_quiz ADD hide_question_title TINYINT(1) DEFAULT 0");
         $this->addSql("CREATE TABLE faq_question_translation (id INT AUTO_INCREMENT NOT NULL, translatable_id INT DEFAULT NULL, headline VARCHAR(255) NOT NULL, body LONGTEXT DEFAULT NULL, slug VARCHAR(50) NOT NULL, locale VARCHAR(255) NOT NULL, INDEX IDX_C2D1A2C2AC5D3 (translatable_id), UNIQUE INDEX faq_question_translation_unique_translation (translatable_id, locale), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;");
         $this->addSql("CREATE TABLE faq_category_translation (id INT AUTO_INCREMENT NOT NULL, translatable_id INT DEFAULT NULL, headline VARCHAR(255) NOT NULL, body LONGTEXT DEFAULT NULL, slug VARCHAR(50) NOT NULL, locale VARCHAR(255) NOT NULL, INDEX IDX_5493B0FC2C2AC5D3 (translatable_id), UNIQUE INDEX faq_category_translation_unique_translation (translatable_id, locale), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;");
@@ -63,16 +74,18 @@ class Version111 extends AbstractMigrationChamilo
         }
 
         $this->addSql('CREATE TABLE access_url_rel_course_category (id INT AUTO_INCREMENT NOT NULL, access_url_id INT NOT NULL, course_category_id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
-        $this->addSql("INSERT INTO access_url_rel_course_category (access_url_id, course_category_id) VALUES (1, 1) ");
-        $this->addSql("INSERT INTO access_url_rel_course_category (access_url_id, course_category_id) VALUES (1, 2) ");
-        $this->addSql("INSERT INTO access_url_rel_course_category (access_url_id, course_category_id) VALUES (1, 3) ");
 
-        $this->addSql('ALTER TABLE notification CHANGE content content TEXT');
+        $stmt = $this->connection->query('SELECT id FROM course_category');
+        $results = $stmt->fetchAll();
 
-        // Needed to update 0000-00-00 00:00:00 values
-        $this->addSql('SET sql_mode = ""');
-        // In case this one didn't work, also try this
-        $this->addSql('SET SESSION sql_mode = ""');
+        foreach ($results as $result) {
+            $this->addSql("
+                INSERT INTO access_url_rel_course_category (access_url_id, course_category_id)
+                VALUES (1, {$result['id']})
+            ");
+        }
+
+        $this->addSql('ALTER TABLE notification CHANGE content content TEXT');
 
         $this->addSql('ALTER TABLE c_lp CHANGE publicated_on publicated_on DATETIME');
         $this->addSql('ALTER TABLE c_lp CHANGE expired_on expired_on DATETIME');
@@ -149,25 +162,68 @@ class Version111 extends AbstractMigrationChamilo
             $this->addSql('UPDATE plugin_ticket_ticket t INNER JOIN plugin_ticket_message as m  ON(t.ticket_id = m.ticket_id and message_id =1)  SET t.subject = m.subject');
             $this->addSql('UPDATE plugin_ticket_ticket t INNER JOIN plugin_ticket_message as m  ON(t.ticket_id = m.ticket_id and message_id =1)  SET t.message = m.message');
             $this->addSql('DELETE FROM plugin_ticket_message WHERE message_id = 1');
+            $this->addSql('UPDATE plugin_ticket_project SET sys_insert_user_id = 1 WHERE sys_insert_user_id IS NULL');
+            $this->addSql('UPDATE plugin_ticket_project SET sys_insert_datetime = NOW() WHERE sys_insert_datetime IS NULL');
+
+            $this->addSql('ALTER TABLE plugin_ticket_ticket MODIFY ticket_id INT UNSIGNED NOT NULL;');
+            $this->addSql('DROP INDEX UN_ticket_code ON plugin_ticket_ticket;');
+            $this->addSql('DROP INDEX FK_ticket_category ON plugin_ticket_ticket;');
+            $this->addSql('ALTER TABLE plugin_ticket_ticket DROP PRIMARY KEY;');
+            $this->addSql('ALTER TABLE plugin_ticket_ticket ADD id INT, ADD code VARCHAR(255) NOT NULL, CHANGE project_id project_id INT DEFAULT NULL, CHANGE priority_id priority_id INT DEFAULT NULL, CHANGE course_id course_id INT DEFAULT NULL, CHANGE session_id session_id INT DEFAULT NULL, CHANGE personal_email personal_email VARCHAR(255) NOT NULL, CHANGE assigned_last_user assigned_last_user INT DEFAULT NULL, CHANGE status_id status_id INT DEFAULT NULL, CHANGE total_messages total_messages INT NOT NULL, CHANGE keyword keyword VARCHAR(255) DEFAULT NULL, CHANGE source source VARCHAR(255) DEFAULT NULL, CHANGE start_date start_date DATETIME DEFAULT NULL, CHANGE sys_insert_user_id sys_insert_user_id INT NOT NULL, CHANGE sys_insert_datetime sys_insert_datetime DATETIME NOT NULL, CHANGE sys_lastedit_user_id sys_lastedit_user_id INT DEFAULT NULL, CHANGE subject subject VARCHAR(255) NOT NULL, CHANGE message message LONGTEXT DEFAULT NULL;');
+
+            $this->addSql('UPDATE plugin_ticket_ticket SET code = ticket_code');
+            $this->addSql('UPDATE plugin_ticket_ticket SET id = ticket_id');
+            $this->addSql('ALTER TABLE plugin_ticket_ticket DROP ticket_id, DROP ticket_code, DROP request_user');
+            $this->addSql('ALTER TABLE plugin_ticket_ticket MODIFY COLUMN id INT NOT NULL PRIMARY KEY AUTO_INCREMENT');
+
+            if ($schema->hasTable('plugin_ticket_assigned_log')) {
+                $this->addSql('RENAME TABLE plugin_ticket_assigned_log TO ticket_assigned_log');
+            }
+
+            if ($schema->hasTable('plugin_ticket_category')) {
+                $this->addSql('RENAME TABLE plugin_ticket_category TO ticket_category');
+            }
+
+            if ($schema->hasTable('plugin_ticket_message')) {
+                $this->addSql(
+                    'RENAME TABLE plugin_ticket_message TO ticket_message'
+                );
+            }
+
+            if ($schema->hasTable('plugin_ticket_message_attachments')) {
+                $this->addSql(
+                    'RENAME TABLE plugin_ticket_message_attachments TO ticket_message_attachments'
+                );
+            }
+
+            if ($schema->hasTable('plugin_ticket_priority')) {
+                $this->addSql(
+                    'RENAME TABLE plugin_ticket_priority TO ticket_priority'
+                );
+            }
+
+            if ($schema->hasTable('plugin_ticket_project')) {
+                $this->addSql(
+                    'RENAME TABLE plugin_ticket_project TO ticket_project'
+                );
+            }
+
+            if ($schema->hasTable('plugin_ticket_status')) {
+                $this->addSql(
+                    'RENAME TABLE plugin_ticket_status TO ticket_status'
+                );
+            }
+
+            if ($schema->hasTable('plugin_ticket_ticket')) {
+                $this->addSql(
+                    'RENAME TABLE plugin_ticket_ticket TO ticket_ticket'
+                );
+            }
 
-            $this->addSql('RENAME TABLE plugin_ticket_assigned_log TO ticket_assigned_log');
-            $this->addSql('RENAME TABLE plugin_ticket_category TO ticket_category');
-            $this->addSql('RENAME TABLE plugin_ticket_category_rel_user TO ticket_category_rel_user');
-            $this->addSql('RENAME TABLE plugin_ticket_message TO ticket_message');
-            $this->addSql('RENAME TABLE plugin_ticket_message_attachments TO ticket_message_attachments');
-            $this->addSql('RENAME TABLE plugin_ticket_priority TO ticket_priority');
-            $this->addSql('RENAME TABLE plugin_ticket_project TO ticket_project');
-            $this->addSql('RENAME TABLE plugin_ticket_status TO ticket_status');
-            $this->addSql('RENAME TABLE plugin_ticket_ticket TO ticket_ticket');
-
-            $this->addSql('UPDATE ticket_project SET sys_insert_user_id = 1 WHERE sys_insert_user_id IS NULL');
-            $this->addSql('UPDATE ticket_project SET sys_insert_datetime = NOW() WHERE sys_insert_datetime IS NULL');
             $this->addSql('ALTER TABLE ticket_project DROP project_id, CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE name name VARCHAR(255) NOT NULL, CHANGE description description LONGTEXT DEFAULT NULL, CHANGE email email VARCHAR(255) DEFAULT NULL, CHANGE other_area other_area INT DEFAULT NULL, CHANGE sys_insert_user_id sys_insert_user_id INT NOT NULL, CHANGE sys_insert_datetime sys_insert_datetime DATETIME NOT NULL, CHANGE sys_lastedit_user_id sys_lastedit_user_id INT DEFAULT NULL;');
-
             $this->addSql('ALTER TABLE ticket_status ADD code VARCHAR(255) NOT NULL, CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE name name VARCHAR(255) NOT NULL, CHANGE description description LONGTEXT DEFAULT NULL;');
             $this->addSql('UPDATE ticket_status SET code = status_id ');
             $this->addSql('ALTER TABLE ticket_status DROP status_id');
-            $this->addSql('ALTER TABLE ticket_category_rel_user CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE category_id category_id INT DEFAULT NULL, CHANGE user_id user_id INT DEFAULT NULL;');
 
             $this->addSql('UPDATE ticket_category SET sys_insert_user_id = 1 WHERE sys_insert_user_id IS NULL');
             $this->addSql('UPDATE ticket_category SET sys_insert_datetime = NOW() WHERE sys_insert_datetime IS NULL');
@@ -179,20 +235,31 @@ class Version111 extends AbstractMigrationChamilo
             $this->addSql('ALTER TABLE ticket_category ADD CONSTRAINT FK_8325E540166D1F9C FOREIGN KEY (project_id) REFERENCES ticket_project (id);');
             $this->addSql('CREATE INDEX IDX_8325E540166D1F9C ON ticket_category (project_id);');
 
-            $this->addSql('ALTER TABLE ticket_category_rel_user ADD CONSTRAINT FK_5B8A98712469DE2 FOREIGN KEY (category_id) REFERENCES ticket_category (id);');
-            $this->addSql('ALTER TABLE ticket_category_rel_user ADD CONSTRAINT FK_5B8A987A76ED395 FOREIGN KEY (user_id) REFERENCES user (id);');
-
-            $this->addSql('CREATE INDEX IDX_5B8A98712469DE2 ON ticket_category_rel_user (category_id);');
-            $this->addSql('CREATE INDEX IDX_5B8A987A76ED395 ON ticket_category_rel_user (user_id);');
+            if ($schema->hasTable('plugin_ticket_category_rel_user')) {
+                $table = $schema->getTable('plugin_ticket_category_rel_user');
+                $this->addSql('RENAME TABLE plugin_ticket_category_rel_user TO ticket_category_rel_user');
+                $this->addSql('ALTER TABLE ticket_category_rel_user CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE category_id category_id INT DEFAULT NULL, CHANGE user_id user_id INT DEFAULT NULL;');
+                $this->addSql('CREATE INDEX IDX_5B8A98712469DE2 ON ticket_category_rel_user (category_id);');
+                $this->addSql('CREATE INDEX IDX_5B8A987A76ED395 ON ticket_category_rel_user (user_id);');
+
+                if ($table->hasIndex('fk_5b8a98712469de2')) {
+                    $table->dropIndex('fk_5b8a98712469de2');
+                }
+
+                if ($table->hasIndex('fk_5b8a987a76ed395')) {
+                    $table->dropIndex('fk_5b8a987a76ed395');
+                }
+            } else {
+                $this->addSql('CREATE TABLE IF NOT EXISTS ticket_category_rel_user (id INT AUTO_INCREMENT NOT NULL, category_id INT DEFAULT NULL, user_id INT DEFAULT NULL, INDEX IDX_5B8A98712469DE2 (category_id), INDEX IDX_5B8A987A76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+                $this->addSql('ALTER TABLE ticket_category_rel_user ADD CONSTRAINT FK_5B8A98712469DE2 FOREIGN KEY (category_id) REFERENCES ticket_category (id)');
+                $this->addSql('ALTER TABLE ticket_category_rel_user ADD CONSTRAINT FK_5B8A987A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
+            }
 
             $this->addSql('ALTER TABLE ticket_message_attachments DROP message_attch_id, CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE message_id message_id INT DEFAULT NULL, CHANGE ticket_id ticket_id INT DEFAULT NULL, CHANGE filename filename LONGTEXT NOT NULL, CHANGE size size INT NOT NULL, CHANGE sys_insert_user_id sys_insert_user_id INT NOT NULL, CHANGE sys_insert_datetime sys_insert_datetime DATETIME NOT NULL, CHANGE sys_lastedit_user_id sys_lastedit_user_id INT DEFAULT NULL;');
-
-            // missing
             $this->addSql('ALTER TABLE ticket_message_attachments ADD CONSTRAINT FK_70BF9E26700047D2 FOREIGN KEY (ticket_id) REFERENCES ticket_ticket (id);');
             $this->addSql('CREATE INDEX IDX_70BF9E26700047D2 ON ticket_message_attachments (ticket_id);');
             $this->addSql('ALTER TABLE ticket_message_attachments RENAME INDEX ticket_message_id_fk TO IDX_70BF9E26537A1329;');
 
-
             $this->addSql('UPDATE ticket_priority SET sys_insert_user_id = 1 WHERE sys_insert_user_id IS NULL');
             $this->addSql('UPDATE ticket_priority SET sys_insert_datetime = NOW() WHERE sys_insert_datetime IS NULL');
 
@@ -206,20 +273,10 @@ class Version111 extends AbstractMigrationChamilo
 
             $this->addSql('ALTER TABLE ticket_priority DROP priority_id, DROP priority, DROP priority_desc, DROP priority_color, DROP priority_urgency');
 
-            $this->addSql('ALTER TABLE ticket_ticket MODIFY ticket_id INT UNSIGNED NOT NULL;');
-            $this->addSql('DROP INDEX UN_ticket_code ON ticket_ticket;');
-            $this->addSql('DROP INDEX FK_ticket_category ON ticket_ticket;');
-            $this->addSql('ALTER TABLE ticket_ticket DROP PRIMARY KEY;');
-
             $this->addSql('UPDATE ticket_ticket t SET priority_id = (SELECT id FROM ticket_priority t2 WHERE t2.code = t.priority_id)');
             $this->addSql('UPDATE ticket_ticket t SET status_id = (SELECT id FROM ticket_status t2 WHERE t2.code = t.status_id)');
 
-            $this->addSql('ALTER TABLE ticket_ticket ADD id INT NOT NULL, ADD code VARCHAR(255) NOT NULL, CHANGE project_id project_id INT DEFAULT NULL, CHANGE priority_id priority_id INT DEFAULT NULL, CHANGE course_id course_id INT DEFAULT NULL, CHANGE session_id session_id INT DEFAULT NULL, CHANGE personal_email personal_email VARCHAR(255) NOT NULL, CHANGE assigned_last_user assigned_last_user INT DEFAULT NULL, CHANGE status_id status_id INT DEFAULT NULL, CHANGE total_messages total_messages INT NOT NULL, CHANGE keyword keyword VARCHAR(255) DEFAULT NULL, CHANGE source source VARCHAR(255) DEFAULT NULL, CHANGE start_date start_date DATETIME DEFAULT NULL, CHANGE sys_insert_user_id sys_insert_user_id INT NOT NULL, CHANGE sys_insert_datetime sys_insert_datetime DATETIME NOT NULL, CHANGE sys_lastedit_user_id sys_lastedit_user_id INT DEFAULT NULL, CHANGE subject subject VARCHAR(255) NOT NULL, CHANGE message message LONGTEXT DEFAULT NULL;');
 
-            $this->addSql('UPDATE ticket_ticket SET code = ticket_code');
-            $this->addSql('UPDATE ticket_ticket SET id = ticket_id');
-            $this->addSql('ALTER TABLE ticket_ticket DROP ticket_id, DROP ticket_code, DROP request_user');
-            $this->addSql('ALTER TABLE ticket_ticket MODIFY COLUMN id INT NOT NULL PRIMARY KEY AUTO_INCREMENT');
             $this->addSql('ALTER TABLE ticket_ticket ADD CONSTRAINT FK_EDE2C768497B19F9 FOREIGN KEY (priority_id) REFERENCES ticket_priority (id);');
 
             $this->addSql('UPDATE ticket_ticket SET project_id = 1 WHERE project_id is NULL or project_id = 0');
@@ -247,11 +304,8 @@ class Version111 extends AbstractMigrationChamilo
             $this->addSql('CREATE INDEX IDX_54B65868A76ED395 ON ticket_assigned_log (user_id);');
             $this->addSql('ALTER TABLE ticket_assigned_log RENAME INDEX fk_ticket_assigned_log TO IDX_54B65868700047D2;');
 
-            $this->addSql('ALTER TABLE ticket_category_rel_user RENAME INDEX fk_5b8a98712469de2 TO IDX_5B8A98712469DE2;');
-            $this->addSql('ALTER TABLE ticket_category_rel_user RENAME INDEX fk_5b8a987a76ed395 TO IDX_5B8A987A76ED395;');
 
             $this->addSql('ALTER TABLE ticket_message DROP message_id, CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE ticket_id ticket_id INT DEFAULT NULL, CHANGE subject subject VARCHAR(255) DEFAULT NULL, CHANGE message message LONGTEXT DEFAULT NULL, CHANGE status status VARCHAR(255) NOT NULL, CHANGE ip_address ip_address VARCHAR(255) NOT NULL, CHANGE sys_insert_user_id sys_insert_user_id INT NOT NULL, CHANGE sys_insert_datetime sys_insert_datetime DATETIME NOT NULL, CHANGE sys_lastedit_user_id sys_lastedit_user_id INT DEFAULT NULL;');
-
             $this->addSql('ALTER TABLE ticket_message ADD CONSTRAINT FK_BA71692D700047D2 FOREIGN KEY (ticket_id) REFERENCES ticket_ticket (id);');
             $this->addSql('ALTER TABLE ticket_message RENAME INDEX fk_tick_message TO IDX_BA71692D700047D2;');
             $this->addSql('ALTER TABLE ticket_ticket CHANGE category_id category_id INT DEFAULT NULL;');

+ 10 - 45
app/Migrations/Schema/V111/Version20160330103045.php

@@ -108,7 +108,6 @@ class Version20160330103045 extends AbstractMigrationChamilo
         $this->addSql("ALTER TABLE timeline__action_component ADD CONSTRAINT FK_6ACD1B16E2ABAFFF FOREIGN KEY (component_id) REFERENCES timeline__component (id) ON DELETE CASCADE;");
         //$this->addSql("CREATE UNIQUE INDEX UNIQ_8D93D649A0D96FBF ON user (email_canonical);");
         */
-        $this->addSql('DROP TABLE extra_field_saved_search');
         $table = $schema->getTable('track_stored_values_stack');
         $hasIndex = $table->hasIndex('user_sco_course_sv_stack');
         if ($hasIndex) {
@@ -133,9 +132,16 @@ class Version20160330103045 extends AbstractMigrationChamilo
             $this->addSql('DROP INDEX UNIQ_8D93D649F85E0677 ON user');
         }
 
-        $this->addSql(
-            'ALTER TABLE user ADD email_canonical VARCHAR(255) NOT NULL, ADD credentials_expired TINYINT(1), ADD credentials_expire_at DATETIME DEFAULT NULL, ADD locked TINYINT(1),ADD enabled TINYINT(1) NOT NULL, ADD expired TINYINT(1) NOT NULL, ADD expires_at DATETIME DEFAULT NULL, CHANGE username username VARCHAR(255) NOT NULL, CHANGE username_canonical username_canonical VARCHAR(255) NOT NULL, CHANGE email email VARCHAR(255) NOT NULL'
-        );
+        $this->addSql('ALTER TABLE user ADD email_canonical VARCHAR(255) NOT NULL');
+        $this->addSql('ALTER TABLE user ADD credentials_expired TINYINT(1)');
+        $this->addSql('ALTER TABLE user ADD credentials_expire_at DATETIME DEFAULT NULL');
+        $this->addSql('ALTER TABLE user ADD locked TINYINT(1) NOT NULL');
+        $this->addSql('ALTER TABLE user ADD enabled TINYINT(1) NOT NULL');
+        $this->addSql('ALTER TABLE user ADD expired TINYINT(1) NOT NULL');
+        $this->addSql('ALTER TABLE user ADD expires_at DATETIME DEFAULT NULL');
+        $this->addSql('ALTER TABLE user CHANGE username username VARCHAR(100) NOT NULL');
+        $this->addSql('ALTER TABLE user CHANGE username_canonical username_canonical VARCHAR(100) NOT NULL');
+        $this->addSql('ALTER TABLE user CHANGE email email VARCHAR(100) NOT NULL');
 
         $sql = "UPDATE user SET email_canonical = email";
         $this->addSql($sql);
@@ -166,46 +172,5 @@ class Version20160330103045 extends AbstractMigrationChamilo
      */
     public function down(Schema $schema)
     {
-        $this->addSql('ALTER TABLE page__page DROP FOREIGN KEY FK_2FAE39EDF6BD1646');
-        $this->addSql('ALTER TABLE page__snapshot DROP FOREIGN KEY FK_3963EF9AF6BD1646');
-        $this->addSql('ALTER TABLE page__page DROP FOREIGN KEY FK_2FAE39ED727ACA70');
-        $this->addSql('ALTER TABLE page__page DROP FOREIGN KEY FK_2FAE39ED158E0B66');
-        $this->addSql('ALTER TABLE page__snapshot DROP FOREIGN KEY FK_3963EF9AC4663E4');
-        $this->addSql('ALTER TABLE page__bloc DROP FOREIGN KEY FK_FCDC1A97C4663E4');
-        $this->addSql('ALTER TABLE page__bloc DROP FOREIGN KEY FK_FCDC1A97727ACA70');
-        $this->addSql('ALTER TABLE classification__category DROP FOREIGN KEY FK_43629B36727ACA70');
-        $this->addSql('ALTER TABLE media__media DROP FOREIGN KEY FK_5C6DD74E12469DE2');
-        $this->addSql('ALTER TABLE classification__category DROP FOREIGN KEY FK_43629B36E25D857E');
-        $this->addSql('ALTER TABLE classification__tag DROP FOREIGN KEY FK_CA57A1C7E25D857E');
-        $this->addSql('ALTER TABLE classification__collection DROP FOREIGN KEY FK_A406B56AE25D857E');
-        $this->addSql('ALTER TABLE media__gallery_media DROP FOREIGN KEY FK_80D4C5414E7AF8F');
-        $this->addSql('ALTER TABLE classification__category DROP FOREIGN KEY FK_43629B36EA9FDD75');
-        $this->addSql('ALTER TABLE classification__collection DROP FOREIGN KEY FK_A406B56AEA9FDD75');
-        $this->addSql('ALTER TABLE media__gallery_media DROP FOREIGN KEY FK_80D4C541EA9FDD75');
-        $this->addSql(
-            'CREATE TABLE extra_field_saved_search (id INT AUTO_INCREMENT NOT NULL, field_id INT DEFAULT NULL, user_id INT DEFAULT NULL, value LONGTEXT DEFAULT NULL COLLATE utf8_unicode_ci, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_16ABE32A443707B0 (field_id), INDEX IDX_16ABE32AA76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'
-        );
-        $this->addSql(
-            'ALTER TABLE extra_field_saved_search ADD CONSTRAINT FK_16ABE32A443707B0 FOREIGN KEY (field_id) REFERENCES extra_field (id)'
-        );
-        $this->addSql(
-            'ALTER TABLE extra_field_saved_search ADD CONSTRAINT FK_16ABE32AA76ED395 FOREIGN KEY (user_id) REFERENCES user (id)'
-        );
-        /*$this->addSql('DROP TABLE page__site');
-        $this->addSql('DROP TABLE page__page');
-        $this->addSql('DROP TABLE page__snapshot');
-        $this->addSql('DROP TABLE page__bloc');
-        $this->addSql('DROP TABLE classification__category');
-        $this->addSql('DROP TABLE classification__context');
-        $this->addSql('DROP TABLE classification__tag');
-        $this->addSql('DROP TABLE classification__collection');
-        $this->addSql('DROP TABLE media__gallery');
-        $this->addSql('DROP TABLE media__media');
-        $this->addSql('DROP TABLE media__gallery_media');*/
-        $this->addSql('ALTER TABLE session_rel_user DROP duration');
-        $this->addSql('CREATE INDEX user_sco_course_sv ON track_stored_values (user_id, sco_id, course_id, sv_key)');
-        $this->addSql(
-            'CREATE INDEX user_sco_course_sv_stack ON track_stored_values_stack (user_id, sco_id, course_id, sv_key, stack_order)'
-        );
     }
 }

+ 8 - 15
app/Migrations/Schema/V111/Version20160727155600.php

@@ -14,26 +14,19 @@ use Chamilo\CoreBundle\Entity\BranchSync;
  */
 class Version20160727155600 extends AbstractMigrationChamilo
 {
-
     /**
      * @param Schema $schema
      */
     public function up(Schema $schema)
     {
-        $em = $this->getEntityManager();
-
-        $cont = $em
-            ->createQuery('SELECT COUNT(bs.id) FROM ChamiloCoreBundle:BranchSync AS bs')
-            ->getSingleScalarResult();
-
-        if (!$cont) {
-            $branchSync = new BranchSync();
-            $branchSync
-                ->setBranchName('localhost')
-                ->setAccessUrlId(1);
-
-            $em->persist($branchSync);
-            $em->flush();
+        $sql = "SELECT COUNT(id) as count FROM branch_sync";
+        $result = $this->connection->executeQuery($sql)->fetch();
+        $count = $result['count'];
+
+        if (!$count) {
+            $unique = sha1(uniqid());
+            $sql = "INSERT INTO branch_sync (branch_name, unique_id, access_url_id) VALUES ('localhost', '$unique', '1')";
+            $this->addSql($sql);
         }
     }
 

+ 9 - 7
app/Migrations/Schema/V111/Version20160804174600.php

@@ -656,9 +656,10 @@ class Version20160804174600 extends AbstractMigrationChamilo
             $tpl = $em
                 ->getRepository('ChamiloCoreBundle:SystemTemplate')
                 ->findOneBy(['title' => $title]);
-            $tpl->setContent($content);
-
-            $em->merge($tpl);
+            if (!empty($tpl)) {
+                $tpl->setContent($content);
+                $em->merge($tpl);
+            }
         }
 
         $em->flush();
@@ -1213,11 +1214,12 @@ class Version20160804174600 extends AbstractMigrationChamilo
             $tpl = $em
                 ->getRepository('ChamiloCoreBundle:SystemTemplate')
                 ->findOneBy(['title' => $title]);
-            $tpl->setContent($content);
-
-            $em->merge($tpl);
+            if (!empty($tpl)) {
+                $tpl->setContent($content);
+                $em->merge($tpl);
+            }
         }
 
         $em->flush();
     }
-}
+}

+ 3 - 1
app/Migrations/Schema/V111/Version20160907140300.php

@@ -14,7 +14,9 @@ use Doctrine\DBAL\Types\Type;
  */
 class Version20160907140300 extends AbstractMigrationChamilo
 {
-
+    /**
+     * @param Schema $schema
+     */
     public function up(Schema $schema)
     {
         $data = [

+ 1 - 3
app/Migrations/Schema/V111/Version20160930144400.php

@@ -29,9 +29,7 @@ class Version20160930144400 extends AbstractMigrationChamilo
             )
         ');
 
-        $this->addSql(
-            'ALTER TABLE extra_field ADD visible_to_others TINYINT(1) DEFAULT 0, CHANGE visible visible_to_self TINYINT(1) DEFAULT 0'
-        );
+        $this->addSql('ALTER TABLE extra_field ADD visible_to_others TINYINT(1) DEFAULT 0, CHANGE visible visible_to_self TINYINT(1) DEFAULT 0');
     }
 
     /**

+ 52 - 0
app/Migrations/Schema/V111/Version20161028123400.php

@@ -0,0 +1,52 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V111;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20161028123400
+ * Add primary key as auto increment in c_student_publication_comment
+ * @package Application\Migrations\Schema\V111
+ */
+class Version20161028123400 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $iidColumn = $schema
+            ->getTable('c_student_publication_comment')
+            ->getColumn('iid');
+
+        if (!$iidColumn->getAutoincrement()) {
+            $iidColumn->setAutoincrement(true);
+        }
+
+        // Deleting users that don't exist anymore
+        $sql = 'DELETE FROM access_url_rel_user WHERE user_id NOT IN (SELECT user_id from user)';
+        $this->addSql($sql);
+
+        $table = $schema->getTable('personal_agenda');
+        if ($table->hasIndex('id')) {
+            $this->addSql('ALTER TABLE personal_agenda modify id INT NOT NULL');
+            $this->addSql('ALTER TABLE personal_agenda DROP index id');
+            $this->addSql('ALTER TABLE personal_agenda DROP PRIMARY KEY');
+            $this->addSql('ALTER TABLE personal_agenda CHANGE id id INT AUTO_INCREMENT NOT NULL PRIMARY KEY');
+        }
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $schema
+            ->getTable('c_student_publication_comment')
+            ->getColumn('iid')
+            ->setAutoincrement(false);
+    }
+}

+ 569 - 14
app/Resources/public/assets/ckeditor/plugins/image2/dialogs/image2.js

@@ -1,14 +1,569 @@
-/*
- Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
- For licensing, see LICENSE.md or http://ckeditor.com/license
-*/
-CKEDITOR.dialog.add("image2",function(k){function D(){var a=this.getValue().match(E);(a=!(!a||0===parseInt(a[1],10)))||alert(c["invalid"+CKEDITOR.tools.capitalize(this.id)]);return a}function O(){function a(a,b){d.push(l.once(a,function(a){for(var l;l=d.pop();)l.removeListener();b(a)}))}var l=t.createElement("img"),d=[];return function(d,b,c){a("load",function(){var a=F(l);b.call(c,l,a.width,a.height)});a("error",function(){b(null)});a("abort",function(){b(null)});l.setAttribute("src",(x.baseHref||
-"")+d+"?"+Math.random().toString(16).substring(2))}}function G(){var a=this.getValue();u(!1);a!==y.data.src?(H(a,function(a,d,b){u(!0);if(!a)return m(!1);g.setValue(!1===k.config.image2_prefillDimensions?0:d);h.setValue(!1===k.config.image2_prefillDimensions?0:b);v=d;w=b;m(I.checkHasNaturalRatio(a))}),n=!0):n?(u(!0),g.setValue(p),h.setValue(q),n=!1):u(!0)}function J(){if(e){var a=this.getValue();if(a&&(a.match(E)||m(!1),"0"!==a)){var b="width"==this.id,d=p||v,c=q||w,a=b?Math.round(a/d*c):Math.round(a/
-c*d);isNaN(a)||(b?h:g).setValue(a)}}}function m(a){if(f){if("boolean"==typeof a){if(z)return;e=a}else a=g.getValue(),z=!0,(e=!e)&&a&&(a*=q/p,isNaN(a)||h.setValue(Math.round(a)));f[e?"removeClass":"addClass"]("cke_btn_unlocked");f.setAttribute("aria-checked",e);CKEDITOR.env.hc&&f.getChild(0).setHtml(e?CKEDITOR.env.ie?"■":"▣":CKEDITOR.env.ie?"□":"▢")}}function u(a){a=a?"enable":"disable";g[a]();h[a]()}var E=/(^\s*(\d+)(px)?\s*$)|^$/i,K=CKEDITOR.tools.getNextId(),L=CKEDITOR.tools.getNextId(),b=k.lang.image2,
-c=k.lang.common,P=(new CKEDITOR.template('\x3cdiv\x3e\x3ca href\x3d"javascript:void(0)" tabindex\x3d"-1" title\x3d"'+b.lockRatio+'" class\x3d"cke_btn_locked" id\x3d"{lockButtonId}" role\x3d"checkbox"\x3e\x3cspan class\x3d"cke_icon"\x3e\x3c/span\x3e\x3cspan class\x3d"cke_label"\x3e'+b.lockRatio+'\x3c/span\x3e\x3c/a\x3e\x3ca href\x3d"javascript:void(0)" tabindex\x3d"-1" title\x3d"'+b.resetSize+'" class\x3d"cke_btn_reset" id\x3d"{resetButtonId}" role\x3d"button"\x3e\x3cspan class\x3d"cke_label"\x3e'+
-b.resetSize+"\x3c/span\x3e\x3c/a\x3e\x3c/div\x3e")).output({lockButtonId:K,resetButtonId:L}),I=CKEDITOR.plugins.image2,x=k.config,A=k.widgets.registered.image.features,F=I.getNatural,t,y,M,H,p,q,v,w,n,e,z,f,r,g,h,B,C=!(!x.filebrowserImageBrowseUrl&&!x.filebrowserBrowseUrl),N=[{id:"src",type:"text",label:c.url,onKeyup:G,onChange:G,setup:function(a){this.setValue(a.data.src)},commit:function(a){a.setData("src",this.getValue())},validate:CKEDITOR.dialog.validate.notEmpty(b.urlMissing)}];C&&N.push({type:"button",
-id:"browse",style:"display:inline-block;margin-top:14px;",align:"center",label:k.lang.common.browseServer,hidden:!0,filebrowser:"info:src"});return{title:b.title,minWidth:250,minHeight:100,onLoad:function(){t=this._.element.getDocument();H=O()},onShow:function(){y=this.widget;M=y.parts.image;n=z=e=!1;B=F(M);v=p=B.width;w=q=B.height},contents:[{id:"info",label:b.infoTab,elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["100%"],children:N}]},{id:"alt",type:"text",label:b.alt,setup:function(a){this.setValue(a.data.alt)},
-commit:function(a){a.setData("alt",this.getValue())}},{type:"hbox",widths:["25%","25%","50%"],requiredContent:A.dimension.requiredContent,children:[{type:"text",width:"45px",id:"width",label:c.width,validate:D,onKeyUp:J,onLoad:function(){g=this},setup:function(a){this.setValue(a.data.width)},commit:function(a){a.setData("width",this.getValue())}},{type:"text",id:"height",width:"45px",label:c.height,validate:D,onKeyUp:J,onLoad:function(){h=this},setup:function(a){this.setValue(a.data.height)},commit:function(a){a.setData("height",
-this.getValue())}},{id:"lock",type:"html",style:"margin-top:18px;width:40px;height:20px;",onLoad:function(){function a(a){a.on("mouseover",function(){this.addClass("cke_btn_over")},a);a.on("mouseout",function(){this.removeClass("cke_btn_over")},a)}var b=this.getDialog();f=t.getById(K);r=t.getById(L);f&&(b.addFocusable(f,4+C),f.on("click",function(a){m();a.data&&a.data.preventDefault()},this.getDialog()),a(f));r&&(b.addFocusable(r,5+C),r.on("click",function(a){n?(g.setValue(v),h.setValue(w)):(g.setValue(p),
-h.setValue(q));a.data&&a.data.preventDefault()},this),a(r))},setup:function(a){m(a.data.lock)},commit:function(a){a.setData("lock",e)},html:P}]},{type:"hbox",id:"alignment",requiredContent:A.align.requiredContent,children:[{id:"align",type:"radio",items:[[c.alignNone,"none"],[c.alignLeft,"left"],[c.alignCenter,"center"],[c.alignRight,"right"]],label:c.align,setup:function(a){this.setValue(a.data.align)},commit:function(a){a.setData("align",this.getValue())}}]},{id:"hasCaption",type:"checkbox",label:b.captioned,
-requiredContent:A.caption.requiredContent,setup:function(a){this.setValue(a.data.hasCaption)},commit:function(a){a.setData("hasCaption",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:b.uploadTab,elements:[{type:"file",id:"upload",label:b.btnUpload,style:"height:40px"},{type:"fileButton",id:"uploadButton",filebrowser:"info:src",label:b.btnUpload,"for":["Upload","upload"]}]}]}});
+/**
+ * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+/**
+ * @fileOverview Image plugin based on Widgets API
+ */
+
+'use strict';
+
+CKEDITOR.dialog.add( 'image2', function( editor ) {
+
+    // RegExp: 123, 123px, empty string ""
+    var regexGetSizeOrEmpty = /(^\s*(\d+)(px)?\s*$)|^$/i,
+
+        lockButtonId = CKEDITOR.tools.getNextId(),
+        resetButtonId = CKEDITOR.tools.getNextId(),
+
+        lang = editor.lang.image2,
+        commonLang = editor.lang.common,
+
+        lockResetStyle = 'margin-top:18px;width:40px;height:20px;',
+        lockResetHtml = new CKEDITOR.template(
+            '<div>' +
+            '<a href="javascript:void(0)" tabindex="-1" title="' + lang.lockRatio + '" class="cke_btn_locked" id="{lockButtonId}" role="checkbox">' +
+            '<span class="cke_icon"></span>' +
+            '<span class="cke_label">' + lang.lockRatio + '</span>' +
+            '</a>' +
+
+            '<a href="javascript:void(0)" tabindex="-1" title="' + lang.resetSize + '" class="cke_btn_reset" id="{resetButtonId}" role="button">' +
+            '<span class="cke_label">' + lang.resetSize + '</span>' +
+            '</a>' +
+            '</div>' ).output( {
+            lockButtonId: lockButtonId,
+            resetButtonId: resetButtonId
+        } ),
+
+        helpers = CKEDITOR.plugins.image2,
+
+        // Editor instance configuration.
+        config = editor.config,
+
+        // Content restrictions defined by the widget which
+        // impact on dialog structure and presence of fields.
+        features = editor.widgets.registered.image.features,
+
+        // Functions inherited from image2 plugin.
+        getNatural = helpers.getNatural,
+
+        // Global variables referring to the dialog's context.
+        doc, widget, image,
+
+        // Global variable referring to this dialog's image pre-loader.
+        preLoader,
+
+        // Global variables holding the original size of the image.
+        domWidth, domHeight,
+
+        // Global variables related to image pre-loading.
+        preLoadedWidth, preLoadedHeight, srcChanged,
+
+        // Global variables related to size locking.
+        lockRatio, userDefinedLock,
+
+        // Global variables referring to dialog fields and elements.
+        lockButton, resetButton, widthField, heightField,
+
+        natural;
+
+    // Validates dimension. Allowed values are:
+    // "123px", "123", "" (empty string)
+    function validateDimension() {
+        var match = this.getValue().match( regexGetSizeOrEmpty ),
+            isValid = !!( match && parseInt( match[ 1 ], 10 ) !== 0 );
+
+        if ( !isValid )
+            alert( commonLang[ 'invalid' + CKEDITOR.tools.capitalize( this.id ) ] ); // jshint ignore:line
+
+        return isValid;
+    }
+
+    // Creates a function that pre-loads images. The callback function passes
+    // [image, width, height] or null if loading failed.
+    //
+    // @returns {Function}
+    function createPreLoader() {
+        var image = doc.createElement( 'img' ),
+            listeners = [];
+
+        function addListener( event, callback ) {
+            listeners.push( image.once( event, function( evt ) {
+                removeListeners();
+                callback( evt );
+            } ) );
+        }
+
+        function removeListeners() {
+            var l;
+
+            while ( ( l = listeners.pop() ) )
+                l.removeListener();
+        }
+
+        // @param {String} src.
+        // @param {Function} callback.
+        return function( src, callback, scope ) {
+            addListener( 'load', function() {
+                // Don't use image.$.(width|height) since it's buggy in IE9-10 (#11159)
+                var dimensions = getNatural( image );
+
+                callback.call( scope, image, dimensions.width, dimensions.height );
+            } );
+
+            addListener( 'error', function() {
+                callback( null );
+            } );
+
+            addListener( 'abort', function() {
+                callback( null );
+            } );
+
+            image.setAttribute( 'src',
+                ( config.baseHref || '' ) + src + '?' + Math.random().toString( 16 ).substring( 2 ) );
+        };
+    }
+
+    // This function updates width and height fields once the
+    // "src" field is altered. Along with dimensions, also the
+    // dimensions lock is adjusted.
+    function onChangeSrc() {
+        var value = this.getValue();
+
+        toggleDimensions( false );
+
+        // Remember that src is different than default.
+        if ( value !== widget.data.src ) {
+            // Update dimensions of the image once it's preloaded.
+            preLoader( value, function( image, width, height ) {
+                // Re-enable width and height fields.
+                toggleDimensions( true );
+
+                // There was problem loading the image. Unlock ratio.
+                if ( !image )
+                    return toggleLockRatio( false );
+
+                // Fill width field with the width of the new image.
+                widthField.setValue( editor.config.image2_prefillDimensions === false ? 0 : width );
+
+                // Fill height field with the height of the new image.
+                heightField.setValue( editor.config.image2_prefillDimensions === false ? 0 : height );
+
+                // Cache the new width.
+                preLoadedWidth = width;
+
+                // Cache the new height.
+                preLoadedHeight = height;
+
+                // Check for new lock value if image exist.
+                toggleLockRatio( helpers.checkHasNaturalRatio( image ) );
+            } );
+
+            srcChanged = true;
+        }
+
+        // Value is the same as in widget data but is was
+        // modified back in time. Roll back dimensions when restoring
+        // default src.
+        else if ( srcChanged ) {
+            // Re-enable width and height fields.
+            toggleDimensions( true );
+
+            // Restore width field with cached width.
+            widthField.setValue( domWidth );
+
+            // Restore height field with cached height.
+            heightField.setValue( domHeight );
+
+            // Src equals default one back again.
+            srcChanged = false;
+        }
+
+        // Value is the same as in widget data and it hadn't
+        // been modified.
+        else {
+            // Re-enable width and height fields.
+            toggleDimensions( true );
+        }
+    }
+
+    function onChangeDimension() {
+        // If ratio is un-locked, then we don't care what's next.
+        if ( !lockRatio )
+            return;
+
+        var value = this.getValue();
+
+        // No reason to auto-scale or unlock if the field is empty.
+        if ( !value )
+            return;
+
+        // If the value of the field is invalid (e.g. with %), unlock ratio.
+        if ( !value.match( regexGetSizeOrEmpty ) )
+            toggleLockRatio( false );
+
+        // No automatic re-scale when dimension is '0'.
+        if ( value === '0' )
+            return;
+
+        var isWidth = this.id == 'width',
+            // If dialog opened for the new image, domWidth and domHeight
+            // will be empty. Use dimensions from pre-loader in such case instead.
+            width = domWidth || preLoadedWidth,
+            height = domHeight || preLoadedHeight;
+
+        // If changing width, then auto-scale height.
+        if ( isWidth )
+            value = Math.round( height * ( value / width ) );
+
+        // If changing height, then auto-scale width.
+        else
+            value = Math.round( width * ( value / height ) );
+
+        // If the value is a number, apply it to the other field.
+        if ( !isNaN( value ) )
+            ( isWidth ? heightField : widthField ).setValue( value );
+    }
+
+    // Set-up function for lock and reset buttons:
+    // 	* Adds lock and reset buttons to focusables. Check if button exist first
+    // 	  because it may be disabled e.g. due to ACF restrictions.
+    // 	* Register mouseover and mouseout event listeners for UI manipulations.
+    // 	* Register click event listeners for buttons.
+    function onLoadLockReset() {
+        var dialog = this.getDialog();
+
+        function setupMouseClasses( el ) {
+            el.on( 'mouseover', function() {
+                this.addClass( 'cke_btn_over' );
+            }, el );
+
+            el.on( 'mouseout', function() {
+                this.removeClass( 'cke_btn_over' );
+            }, el );
+        }
+
+        // Create references to lock and reset buttons for this dialog instance.
+        lockButton = doc.getById( lockButtonId );
+        resetButton = doc.getById( resetButtonId );
+
+        // Activate (Un)LockRatio button
+        if ( lockButton ) {
+            // Consider that there's an additional focusable field
+            // in the dialog when the "browse" button is visible.
+            dialog.addFocusable( lockButton, 4 + hasFileBrowser );
+
+            lockButton.on( 'click', function( evt ) {
+                toggleLockRatio();
+                evt.data && evt.data.preventDefault();
+            }, this.getDialog() );
+
+            setupMouseClasses( lockButton );
+        }
+
+        // Activate the reset size button.
+        if ( resetButton ) {
+            // Consider that there's an additional focusable field
+            // in the dialog when the "browse" button is visible.
+            dialog.addFocusable( resetButton, 5 + hasFileBrowser );
+
+            // Fills width and height fields with the original dimensions of the
+            // image (stored in widget#data since widget#init).
+            resetButton.on( 'click', function( evt ) {
+                // If there's a new image loaded, reset button should revert
+                // cached dimensions of pre-loaded DOM element.
+                if ( srcChanged ) {
+                    widthField.setValue( preLoadedWidth );
+                    heightField.setValue( preLoadedHeight );
+                }
+
+                // If the old image remains, reset button should revert
+                // dimensions as loaded when the dialog was first shown.
+                else {
+                    widthField.setValue( domWidth );
+                    heightField.setValue( domHeight );
+                }
+
+                evt.data && evt.data.preventDefault();
+            }, this );
+
+            setupMouseClasses( resetButton );
+        }
+    }
+
+    function toggleLockRatio( enable ) {
+        // No locking if there's no radio (i.e. due to ACF).
+        if ( !lockButton )
+            return;
+
+        if ( typeof enable == 'boolean' ) {
+            // If user explicitly wants to decide whether
+            // to lock or not, don't do anything.
+            if ( userDefinedLock )
+                return;
+
+            lockRatio = enable;
+        }
+
+        // Undefined. User changed lock value.
+        else {
+            var width = widthField.getValue(),
+                height;
+
+            userDefinedLock = true;
+            lockRatio = !lockRatio;
+
+            // Automatically adjust height to width to match
+            // the original ratio (based on dom- dimensions).
+            if ( lockRatio && width ) {
+                height = domHeight / domWidth * width;
+
+                if ( !isNaN( height ) )
+                    heightField.setValue( Math.round( height ) );
+            }
+        }
+
+        lockButton[ lockRatio ? 'removeClass' : 'addClass' ]( 'cke_btn_unlocked' );
+        lockButton.setAttribute( 'aria-checked', lockRatio );
+
+        // Ratio button hc presentation - WHITE SQUARE / BLACK SQUARE
+        if ( CKEDITOR.env.hc ) {
+            var icon = lockButton.getChild( 0 );
+            icon.setHtml( lockRatio ? CKEDITOR.env.ie ? '\u25A0' : '\u25A3' : CKEDITOR.env.ie ? '\u25A1' : '\u25A2' );
+        }
+    }
+
+    function toggleDimensions( enable ) {
+        var method = enable ? 'enable' : 'disable';
+
+        widthField[ method ]();
+        heightField[ method ]();
+    }
+
+    var hasFileBrowser = !!( config.filebrowserImageBrowseUrl || config.filebrowserBrowseUrl ),
+        srcBoxChildren = [
+            {
+                id: 'src',
+                type: 'text',
+                label: commonLang.url,
+                onKeyup: onChangeSrc,
+                onChange: onChangeSrc,
+                setup: function( widget ) {
+                    this.setValue( widget.data.src );
+                },
+                commit: function( widget ) {
+                    widget.setData( 'src', this.getValue() );
+                },
+                validate: CKEDITOR.dialog.validate.notEmpty( lang.urlMissing )
+            }
+        ];
+
+    // Render the "Browse" button on demand to avoid an "empty" (hidden child)
+    // space in dialog layout that distorts the UI.
+    if ( hasFileBrowser ) {
+        srcBoxChildren.push( {
+            type: 'button',
+            id: 'browse',
+            // v-align with the 'txtUrl' field.
+            // TODO: We need something better than a fixed size here.
+            style: 'display:inline-block;margin-top:14px;',
+            align: 'center',
+            label: editor.lang.common.browseServer,
+            hidden: true,
+            filebrowser: 'info:src'
+        } );
+    }
+
+    return {
+        title: lang.title,
+        minWidth: 250,
+        minHeight: 100,
+        onLoad: function() {
+            // Create a "global" reference to the document for this dialog instance.
+            doc = this._.element.getDocument();
+
+            // Create a pre-loader used for determining dimensions of new images.
+            preLoader = createPreLoader();
+        },
+        onShow: function() {
+            // Create a "global" reference to edited widget.
+            widget = this.widget;
+
+            // Create a "global" reference to widget's image.
+            image = widget.parts.image;
+
+            // Reset global variables.
+            srcChanged = userDefinedLock = lockRatio = false;
+
+            // Natural dimensions of the image.
+            natural = getNatural( image );
+
+            // Get the natural width of the image.
+            preLoadedWidth = domWidth = natural.width;
+
+            // Get the natural height of the image.
+            preLoadedHeight = domHeight = natural.height;
+        },
+        contents: [
+            {
+                id: 'info',
+                label: lang.infoTab,
+                elements: [
+                    {
+                        type: 'vbox',
+                        padding: 0,
+                        children: [
+                            {
+                                type: 'hbox',
+                                widths: [ '100%' ],
+                                children: srcBoxChildren
+                            }
+                        ]
+                    },
+                    {
+                        id: 'alt',
+                        type: 'text',
+                        label: lang.alt,
+                        setup: function( widget ) {
+                            this.setValue( widget.data.alt );
+                        },
+                        commit: function( widget ) {
+                            widget.setData( 'alt', this.getValue() );
+                        }
+                    },
+                    {
+                        type: 'hbox',
+                        widths: [ '25%', '25%', '50%' ],
+                        requiredContent: features.dimension.requiredContent,
+                        children: [
+                            {
+                                type: 'text',
+                                width: '45px',
+                                id: 'width',
+                                label: commonLang.width,
+                                validate: validateDimension,
+                                onKeyUp: onChangeDimension,
+                                onLoad: function() {
+                                    widthField = this;
+                                },
+                                setup: function( widget ) {
+                                    this.setValue( widget.data.width );
+                                },
+                                commit: function( widget ) {
+                                    widget.setData( 'width', this.getValue() );
+                                }
+                            },
+                            {
+                                type: 'text',
+                                id: 'height',
+                                width: '45px',
+                                label: commonLang.height,
+                                validate: validateDimension,
+                                onKeyUp: onChangeDimension,
+                                onLoad: function() {
+                                    heightField = this;
+                                },
+                                setup: function( widget ) {
+                                    this.setValue( widget.data.height );
+                                },
+                                commit: function( widget ) {
+                                    widget.setData( 'height', this.getValue() );
+                                }
+                            },
+                            {
+                                id: 'lock',
+                                type: 'html',
+                                style: lockResetStyle,
+                                onLoad: onLoadLockReset,
+                                setup: function( widget ) {
+                                    toggleLockRatio( widget.data.lock );
+                                },
+                                commit: function( widget ) {
+                                    widget.setData( 'lock', lockRatio );
+                                },
+                                html: lockResetHtml
+                            }
+                        ]
+                    },
+                    {
+                        type: 'hbox',
+                        id: 'alignment',
+                        requiredContent: features.align.requiredContent,
+                        children: [
+                            {
+                                id: 'align',
+                                type: 'radio',
+                                items: [
+                                    [ commonLang.alignNone, 'none' ],
+                                    [ commonLang.alignLeft, 'left' ],
+                                    [ commonLang.alignCenter, 'center' ],
+                                    [ commonLang.alignRight, 'right' ]
+                                ],
+                                label: commonLang.align,
+                                setup: function( widget ) {
+                                    this.setValue( widget.data.align );
+                                },
+                                commit: function( widget ) {
+                                    widget.setData( 'align', this.getValue() );
+                                }
+                            }
+                        ]
+                    },
+                    {
+                        id: 'hasCaption',
+                        type: 'checkbox',
+                        label: lang.captioned,
+                        requiredContent: features.caption.requiredContent,
+                        setup: function( widget ) {
+                            this.setValue( widget.data.hasCaption );
+                        },
+                        commit: function( widget ) {
+                            widget.setData( 'hasCaption', this.getValue() );
+                        }
+                    },
+                    {
+                        id: 'isReponsive',
+                        type: 'checkbox',
+                        label: lang.reponsive,
+                        requiredContent: features.caption.requiredContent,
+                        setup: function( widget ) {
+                            this.setValue( widget.data.isResponsive );
+                        },
+                        commit: function( widget ) {
+                            var img = widget;
+
+                            if (widget.element.$.tagName === 'FIGURE') {
+                                var img = widget.element.$.firstChild;
+                            }
+
+                            img.className += ' img-responsive ';
+                            widget.setData( 'isResponsive', this.getValue() );
+                        }
+                    }
+                ]
+            },
+            {
+                id: 'Upload',
+                hidden: true,
+                filebrowser: 'uploadButton',
+                label: lang.uploadTab,
+                elements: [
+                    {
+                        type: 'file',
+                        id: 'upload',
+                        label: lang.btnUpload,
+                        style: 'height:40px'
+                    },
+                    {
+                        type: 'fileButton',
+                        id: 'uploadButton',
+                        filebrowser: 'info:src',
+                        label: lang.btnUpload,
+                        'for': [ 'Upload', 'upload' ]
+                    }
+                ]
+            }
+        ]
+    };
+} );

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/af.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","af",{alt:"Alternatiewe teks",btnUpload:"Stuur na bediener",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Afbeelding informasie",lockRatio:"Vaste proporsie",menu:"Afbeelding eienskappe",pathName:"image",pathNameCaption:"caption",resetSize:"Herstel grootte",resizer:"Click and drag to resize",title:"Afbeelding eienskappe",uploadTab:"Oplaai",urlMissing:"Die URL na die afbeelding ontbreek."});
+CKEDITOR.plugins.setLang("image2", "af", {
+    alt: "Alternatiewe teks",
+    btnUpload: "Stuur na bediener",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Afbeelding informasie",
+    lockRatio: "Vaste proporsie",
+    menu: "Afbeelding eienskappe",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Herstel grootte",
+    resizer: "Click and drag to resize",
+    title: "Afbeelding eienskappe",
+    uploadTab: "Oplaai",
+    urlMissing: "Die URL na die afbeelding ontbreek.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ar.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ar",{alt:"عنوان الصورة",btnUpload:"أرسلها للخادم",captioned:"صورة ذات اسم",captionPlaceholder:"تسمية",infoTab:"معلومات الصورة",lockRatio:"تناسق الحجم",menu:"خصائص الصورة",pathName:"صورة",pathNameCaption:"تسمية",resetSize:"إستعادة الحجم الأصلي",resizer:"انقر ثم اسحب للتحجيم",title:"خصائص الصورة",uploadTab:"رفع",urlMissing:"عنوان مصدر الصورة مفقود"});
+CKEDITOR.plugins.setLang("image2", "ar", {
+    alt: "عنوان الصورة",
+    btnUpload: "أرسلها للخادم",
+    captioned: "صورة ذات اسم",
+    captionPlaceholder: "تسمية",
+    infoTab: "معلومات الصورة",
+    lockRatio: "تناسق الحجم",
+    menu: "خصائص الصورة",
+    pathName: "صورة",
+    pathNameCaption: "تسمية",
+    resetSize: "إستعادة الحجم الأصلي",
+    resizer: "انقر ثم اسحب للتحجيم",
+    title: "خصائص الصورة",
+    uploadTab: "رفع",
+    urlMissing: "عنوان مصدر الصورة مفقود",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/bg.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","bg",{alt:"Алтернативен текст",btnUpload:"Изпрати я на сървъра",captioned:"Надписано изображение",captionPlaceholder:"Надпис",infoTab:"Детайли за изображението",lockRatio:"Заключване на съотношението",menu:"Настройки на изображението",pathName:"изображение",pathNameCaption:"надпис",resetSize:"Нулиране на размер",resizer:"Кликни и влачи, за да преоразмериш",title:"Настройки на изображението",uploadTab:"Качване",urlMissing:"URL адреса на изображението липсва."});
+CKEDITOR.plugins.setLang("image2", "bg", {
+    alt: "Алтернативен текст",
+    btnUpload: "Изпрати я на сървъра",
+    captioned: "Надписано изображение",
+    captionPlaceholder: "Надпис",
+    infoTab: "Детайли за изображението",
+    lockRatio: "Заключване на съотношението",
+    menu: "Настройки на изображението",
+    pathName: "изображение",
+    pathNameCaption: "надпис",
+    resetSize: "Нулиране на размер",
+    resizer: "Кликни и влачи, за да преоразмериш",
+    title: "Настройки на изображението",
+    uploadTab: "Качване",
+    urlMissing: "URL адреса на изображението липсва.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/bn.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","bn",{alt:"বিকল্প টেক্সট",btnUpload:"ইহাকে সার্ভারে প্রেরন কর",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"ছবির তথ্য",lockRatio:"অনুপাত লক কর",menu:"ছবির প্রোপার্টি",pathName:"image",pathNameCaption:"caption",resetSize:"সাইজ পূর্বাবস্থায় ফিরিয়ে দাও",resizer:"Click and drag to resize",title:"ছবির প্রোপার্টি",uploadTab:"আপলোড",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "bn", {
+    alt: "বিকল্প টেক্সট",
+    btnUpload: "ইহাকে সার্ভারে প্রেরন কর",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "ছবির তথ্য",
+    lockRatio: "অনুপাত লক কর",
+    menu: "ছবির প্রোপার্টি",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "সাইজ পূর্বাবস্থায় ফিরিয়ে দাও",
+    resizer: "Click and drag to resize",
+    title: "ছবির প্রোপার্টি",
+    uploadTab: "আপলোড",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/bs.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","bs",{alt:"Tekst na slici",btnUpload:"Šalji na server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info slike",lockRatio:"Zakljuèaj odnos",menu:"Svojstva slike",pathName:"image",pathNameCaption:"caption",resetSize:"Resetuj dimenzije",resizer:"Click and drag to resize",title:"Svojstva slike",uploadTab:"Šalji",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "bs", {
+    alt: "Tekst na slici",
+    btnUpload: "Šalji na server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Info slike",
+    lockRatio: "Zakljuèaj odnos",
+    menu: "Svojstva slike",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Resetuj dimenzije",
+    resizer: "Click and drag to resize",
+    title: "Svojstva slike",
+    uploadTab: "Šalji",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ca.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ca",{alt:"Text alternatiu",btnUpload:"Envia-la al servidor",captioned:"Imatge amb subtítol",captionPlaceholder:"Títol",infoTab:"Informació de la imatge",lockRatio:"Bloqueja les proporcions",menu:"Propietats de la imatge",pathName:"imatge",pathNameCaption:"subtítol",resetSize:"Restaura la mida",resizer:"Clicar i arrossegar per redimensionar",title:"Propietats de la imatge",uploadTab:"Puja",urlMissing:"Falta la URL de la imatge."});
+CKEDITOR.plugins.setLang("image2", "ca", {
+    alt: "Text alternatiu",
+    btnUpload: "Envia-la al servidor",
+    captioned: "Imatge amb subtítol",
+    captionPlaceholder: "Títol",
+    infoTab: "Informació de la imatge",
+    lockRatio: "Bloqueja les proporcions",
+    menu: "Propietats de la imatge",
+    pathName: "imatge",
+    pathNameCaption: "subtítol",
+    resetSize: "Restaura la mida",
+    resizer: "Clicar i arrossegar per redimensionar",
+    title: "Propietats de la imatge",
+    uploadTab: "Puja",
+    urlMissing: "Falta la URL de la imatge.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/cs.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","cs",{alt:"Alternativní text",btnUpload:"Odeslat na server",captioned:"Obrázek s popisem",captionPlaceholder:"Popis",infoTab:"Informace o obrázku",lockRatio:"Zámek",menu:"Vlastnosti obrázku",pathName:"Obrázek",pathNameCaption:"Popis",resetSize:"Původní velikost",resizer:"Klepněte a táhněte pro změnu velikosti",title:"Vlastnosti obrázku",uploadTab:"Odeslat",urlMissing:"Zadané URL zdroje obrázku nebylo nalezeno."});
+CKEDITOR.plugins.setLang("image2", "cs", {
+    alt: "Alternativní text",
+    btnUpload: "Odeslat na server",
+    captioned: "Obrázek s popisem",
+    captionPlaceholder: "Popis",
+    infoTab: "Informace o obrázku",
+    lockRatio: "Zámek",
+    menu: "Vlastnosti obrázku",
+    pathName: "Obrázek",
+    pathNameCaption: "Popis",
+    resetSize: "Původní velikost",
+    resizer: "Klepněte a táhněte pro změnu velikosti",
+    title: "Vlastnosti obrázku",
+    uploadTab: "Odeslat",
+    urlMissing: "Zadané URL zdroje obrázku nebylo nalezeno.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/cy.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","cy",{alt:"Testun Amgen",btnUpload:"Anfon i'r Gweinydd",captioned:"Delwedd â phennawd",captionPlaceholder:"Caption",infoTab:"Gwyb Delwedd",lockRatio:"Cloi Cymhareb",menu:"Priodweddau Delwedd",pathName:"delwedd",pathNameCaption:"pennawd",resetSize:"Ailosod Maint",resizer:"Clicio a llusgo i ail-meintio",title:"Priodweddau Delwedd",uploadTab:"Lanlwytho",urlMissing:"URL gwreiddiol y ddelwedd ar goll."});
+CKEDITOR.plugins.setLang("image2", "cy", {
+    alt: "Testun Amgen",
+    btnUpload: "Anfon i'r Gweinydd",
+    captioned: "Delwedd â phennawd",
+    captionPlaceholder: "Caption",
+    infoTab: "Gwyb Delwedd",
+    lockRatio: "Cloi Cymhareb",
+    menu: "Priodweddau Delwedd",
+    pathName: "delwedd",
+    pathNameCaption: "pennawd",
+    resetSize: "Ailosod Maint",
+    resizer: "Clicio a llusgo i ail-meintio",
+    title: "Priodweddau Delwedd",
+    uploadTab: "Lanlwytho",
+    urlMissing: "URL gwreiddiol y ddelwedd ar goll.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/da.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","da",{alt:"Alternativ tekst",btnUpload:"Upload fil til serveren",captioned:"Tekstet billede",captionPlaceholder:"Tekst",infoTab:"Generelt",lockRatio:"Lås størrelsesforhold",menu:"Egenskaber for billede",pathName:"billede",pathNameCaption:"tekst",resetSize:"Nulstil størrelse",resizer:"Klik og træk for at ændre størrelsen",title:"Egenskaber for billede",uploadTab:"Upload",urlMissing:"Kilde på billed-URL mangler"});
+CKEDITOR.plugins.setLang("image2", "da", {
+    alt: "Alternativ tekst",
+    btnUpload: "Upload fil til serveren",
+    captioned: "Tekstet billede",
+    captionPlaceholder: "Tekst",
+    infoTab: "Generelt",
+    lockRatio: "Lås størrelsesforhold",
+    menu: "Egenskaber for billede",
+    pathName: "billede",
+    pathNameCaption: "tekst",
+    resetSize: "Nulstil størrelse",
+    resizer: "Klik og træk for at ændre størrelsen",
+    title: "Egenskaber for billede",
+    uploadTab: "Upload",
+    urlMissing: "Kilde på billed-URL mangler",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/de-ch.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","de-ch",{alt:"Alternativer Text",btnUpload:"Zum Server senden",captioned:"Bild mit Überschrift",captionPlaceholder:"Überschrift",infoTab:"Bildinfo",lockRatio:"Größenverhältnis beibehalten",menu:"Bildeigenschaften",pathName:"Bild",pathNameCaption:"Überschrift",resetSize:"Grösse zurücksetzen",resizer:"Zum Vergrössern auswählen und ziehen",title:"Bild-Eigenschaften",uploadTab:"Hochladen",urlMissing:"Bildquellen-URL fehlt."});
+CKEDITOR.plugins.setLang("image2", "de-ch", {
+    alt: "Alternativer Text",
+    btnUpload: "Zum Server senden",
+    captioned: "Bild mit Überschrift",
+    captionPlaceholder: "Überschrift",
+    infoTab: "Bildinfo",
+    lockRatio: "Größenverhältnis beibehalten",
+    menu: "Bildeigenschaften",
+    pathName: "Bild",
+    pathNameCaption: "Überschrift",
+    resetSize: "Grösse zurücksetzen",
+    resizer: "Zum Vergrössern auswählen und ziehen",
+    title: "Bild-Eigenschaften",
+    uploadTab: "Hochladen",
+    urlMissing: "Bildquellen-URL fehlt.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/de.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","de",{alt:"Alternativer Text",btnUpload:"Zum Server senden",captioned:"Bild mit Überschrift",captionPlaceholder:"Überschrift",infoTab:"Bildinfo",lockRatio:"Größenverhältnis beibehalten",menu:"Bildeigenschaften",pathName:"Bild",pathNameCaption:"Überschrift",resetSize:"Größe zurücksetzen",resizer:"Zum Vergrößern auswählen und ziehen",title:"Bild-Eigenschaften",uploadTab:"Hochladen",urlMissing:"Bildquellen-URL fehlt."});
+CKEDITOR.plugins.setLang("image2", "de", {
+    alt: "Alternativer Text",
+    btnUpload: "Zum Server senden",
+    captioned: "Bild mit Überschrift",
+    captionPlaceholder: "Überschrift",
+    infoTab: "Bildinfo",
+    lockRatio: "Größenverhältnis beibehalten",
+    menu: "Bildeigenschaften",
+    pathName: "Bild",
+    pathNameCaption: "Überschrift",
+    resetSize: "Größe zurücksetzen",
+    resizer: "Zum Vergrößern auswählen und ziehen",
+    title: "Bild-Eigenschaften",
+    uploadTab: "Hochladen",
+    urlMissing: "Bildquellen-URL fehlt.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/el.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","el",{alt:"Εναλλακτικό Κείμενο",btnUpload:"Αποστολή στον Διακομιστή",captioned:"Εικόνα με λεζάντα",captionPlaceholder:"Λεζάντα",infoTab:"Πληροφορίες Εικόνας",lockRatio:"Κλείδωμα Αναλογίας",menu:"Ιδιότητες Εικόνας",pathName:"εικόνα",pathNameCaption:"λεζάντα",resetSize:"Επαναφορά Αρχικού Μεγέθους",resizer:"Κάνετε κλικ και σύρετε το ποντίκι για να αλλάξετε το μέγεθος",title:"Ιδιότητες Εικόνας",uploadTab:"Αποστολή",urlMissing:"Λείπει το πηγαίο URL της εικόνας."});
+CKEDITOR.plugins.setLang("image2", "el", {
+    alt: "Εναλλακτικό Κείμενο",
+    btnUpload: "Αποστολή στον Διακομιστή",
+    captioned: "Εικόνα με λεζάντα",
+    captionPlaceholder: "Λεζάντα",
+    infoTab: "Πληροφορίες Εικόνας",
+    lockRatio: "Κλείδωμα Αναλογίας",
+    menu: "Ιδιότητες Εικόνας",
+    pathName: "εικόνα",
+    pathNameCaption: "λεζάντα",
+    resetSize: "Επαναφορά Αρχικού Μεγέθους",
+    resizer: "Κάνετε κλικ και σύρετε το ποντίκι για να αλλάξετε το μέγεθος",
+    title: "Ιδιότητες Εικόνας",
+    uploadTab: "Αποστολή",
+    urlMissing: "Λείπει το πηγαίο URL της εικόνας.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/en-au.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","en-au",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "en-au", {
+    alt: "Alternative Text",
+    btnUpload: "Send it to the Server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Image Info",
+    lockRatio: "Lock Ratio",
+    menu: "Image Properties",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Reset Size",
+    resizer: "Click and drag to resize",
+    title: "Image Properties",
+    uploadTab: "Upload",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/en-ca.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","en-ca",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "en-ca", {
+    alt: "Alternative Text",
+    btnUpload: "Send it to the Server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Image Info",
+    lockRatio: "Lock Ratio",
+    menu: "Image Properties",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Reset Size",
+    resizer: "Click and drag to resize",
+    title: "Image Properties",
+    uploadTab: "Upload",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/en-gb.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","en-gb",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "en-gb", {
+    alt: "Alternative Text",
+    btnUpload: "Send it to the Server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Image Info",
+    lockRatio: "Lock Ratio",
+    menu: "Image Properties",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Reset Size",
+    resizer: "Click and drag to resize",
+    title: "Image Properties",
+    uploadTab: "Upload",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/en.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","en",{alt:"Alternative Text",btnUpload:"Send it to the Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Image Info",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Reset Size",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Upload",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "en", {
+    alt: "Alternative Text",
+    btnUpload: "Send it to the Server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Image Info",
+    lockRatio: "Lock Ratio",
+    menu: "Image Properties",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Reset Size",
+    resizer: "Click and drag to resize",
+    title: "Image Properties",
+    uploadTab: "Upload",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/eo.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","eo",{alt:"Anstataŭiga Teksto",btnUpload:"Sendu al Servilo",captioned:"Bildo kun apudskribo",captionPlaceholder:"Apudskribo",infoTab:"Informoj pri Bildo",lockRatio:"Konservi Proporcion",menu:"Atributoj de Bildo",pathName:"bildo",pathNameCaption:"apudskribo",resetSize:"Origina Grando",resizer:"Kliki kaj treni por ŝanĝi la grandon",title:"Atributoj de Bildo",uploadTab:"Alŝuti",urlMissing:"La fontretadreso de la bildo mankas."});
+CKEDITOR.plugins.setLang("image2", "eo", {
+    alt: "Anstataŭiga Teksto",
+    btnUpload: "Sendu al Servilo",
+    captioned: "Bildo kun apudskribo",
+    captionPlaceholder: "Apudskribo",
+    infoTab: "Informoj pri Bildo",
+    lockRatio: "Konservi Proporcion",
+    menu: "Atributoj de Bildo",
+    pathName: "bildo",
+    pathNameCaption: "apudskribo",
+    resetSize: "Origina Grando",
+    resizer: "Kliki kaj treni por ŝanĝi la grandon",
+    title: "Atributoj de Bildo",
+    uploadTab: "Alŝuti",
+    urlMissing: "La fontretadreso de la bildo mankas.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/es.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","es",{alt:"Texto Alternativo",btnUpload:"Enviar al Servidor",captioned:"Imagen subtitulada",captionPlaceholder:"Leyenda",infoTab:"Información de Imagen",lockRatio:"Proporcional",menu:"Propiedades de Imagen",pathName:"image",pathNameCaption:"subtítulo",resetSize:"Tamaño Original",resizer:"Dar clic y arrastrar para cambiar tamaño",title:"Propiedades de Imagen",uploadTab:"Cargar",urlMissing:"Debe indicar la URL de la imagen."});
+CKEDITOR.plugins.setLang("image2", "es", {
+    alt: "Texto Alternativo",
+    btnUpload: "Enviar al Servidor",
+    captioned: "Imagen subtitulada",
+    captionPlaceholder: "Leyenda",
+    infoTab: "Información de Imagen",
+    lockRatio: "Proporcional",
+    menu: "Propiedades de Imagen",
+    pathName: "image",
+    pathNameCaption: "subtítulo",
+    resetSize: "Tamaño Original",
+    resizer: "Dar clic y arrastrar para cambiar tamaño",
+    title: "Propiedades de Imagen",
+    uploadTab: "Cargar",
+    urlMissing: "Debe indicar la URL de la imagen.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/et.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","et",{alt:"Alternatiivne tekst",btnUpload:"Saada serverisse",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Pildi info",lockRatio:"Lukusta kuvasuhe",menu:"Pildi omadused",pathName:"image",pathNameCaption:"caption",resetSize:"Lähtesta suurus",resizer:"Click and drag to resize",title:"Pildi omadused",uploadTab:"Lae üles",urlMissing:"Pildi lähte-URL on puudu."});
+CKEDITOR.plugins.setLang("image2", "et", {
+    alt: "Alternatiivne tekst",
+    btnUpload: "Saada serverisse",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Pildi info",
+    lockRatio: "Lukusta kuvasuhe",
+    menu: "Pildi omadused",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Lähtesta suurus",
+    resizer: "Click and drag to resize",
+    title: "Pildi omadused",
+    uploadTab: "Lae üles",
+    urlMissing: "Pildi lähte-URL on puudu.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/eu.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","eu",{alt:"Ordezko testua",btnUpload:"Bidali zerbitzarira",captioned:"Argazki oina",captionPlaceholder:"Argazki oina",infoTab:"Irudiaren informazioa",lockRatio:"Blokeatu erlazioa",menu:"Irudiaren propietateak",pathName:"Irudia",pathNameCaption:"Argazki oina",resetSize:"Berrezarri tamaina",resizer:"Klikatu eta arrastatu tamainaz aldatzeko",title:"Irudiaren propietateak",uploadTab:"Kargatu",urlMissing:"Irudiaren iturburuaren URLa falta da."});
+CKEDITOR.plugins.setLang("image2", "eu", {
+    alt: "Ordezko testua",
+    btnUpload: "Bidali zerbitzarira",
+    captioned: "Argazki oina",
+    captionPlaceholder: "Argazki oina",
+    infoTab: "Irudiaren informazioa",
+    lockRatio: "Blokeatu erlazioa",
+    menu: "Irudiaren propietateak",
+    pathName: "Irudia",
+    pathNameCaption: "Argazki oina",
+    resetSize: "Berrezarri tamaina",
+    resizer: "Klikatu eta arrastatu tamainaz aldatzeko",
+    title: "Irudiaren propietateak",
+    uploadTab: "Kargatu",
+    urlMissing: "Irudiaren iturburuaren URLa falta da.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/fa.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","fa",{alt:"متن جایگزین",btnUpload:"به سرور بفرست",captioned:"تصویر زیرنویس شده",captionPlaceholder:"عنوان",infoTab:"اطلاعات تصویر",lockRatio:"قفل کردن نسبت",menu:"ویژگی​های تصویر",pathName:"تصویر",pathNameCaption:"عنوان",resetSize:"بازنشانی اندازه",resizer:"کلیک و کشیدن برای تغییر اندازه",title:"ویژگی​های تصویر",uploadTab:"بالاگذاری",urlMissing:"آدرس URL اصلی تصویر یافت نشد."});
+CKEDITOR.plugins.setLang("image2", "fa", {
+    alt: "متن جایگزین",
+    btnUpload: "به سرور بفرست",
+    captioned: "تصویر زیرنویس شده",
+    captionPlaceholder: "عنوان",
+    infoTab: "اطلاعات تصویر",
+    lockRatio: "قفل کردن نسبت",
+    menu: "ویژگی​های تصویر",
+    pathName: "تصویر",
+    pathNameCaption: "عنوان",
+    resetSize: "بازنشانی اندازه",
+    resizer: "کلیک و کشیدن برای تغییر اندازه",
+    title: "ویژگی​های تصویر",
+    uploadTab: "بالاگذاری",
+    urlMissing: "آدرس URL اصلی تصویر یافت نشد.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/fi.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","fi",{alt:"Vaihtoehtoinen teksti",btnUpload:"Lähetä palvelimelle",captioned:"Kuva kuvatekstillä",captionPlaceholder:"Kuvateksti",infoTab:"Kuvan tiedot",lockRatio:"Lukitse suhteet",menu:"Kuvan ominaisuudet",pathName:"kuva",pathNameCaption:"kuvateksti",resetSize:"Alkuperäinen koko",resizer:"Klikkaa ja raahaa muuttaaksesi kokoa",title:"Kuvan ominaisuudet",uploadTab:"Lisää tiedosto",urlMissing:"Kuvan lähdeosoite puuttuu."});
+CKEDITOR.plugins.setLang("image2", "fi", {
+    alt: "Vaihtoehtoinen teksti",
+    btnUpload: "Lähetä palvelimelle",
+    captioned: "Kuva kuvatekstillä",
+    captionPlaceholder: "Kuvateksti",
+    infoTab: "Kuvan tiedot",
+    lockRatio: "Lukitse suhteet",
+    menu: "Kuvan ominaisuudet",
+    pathName: "kuva",
+    pathNameCaption: "kuvateksti",
+    resetSize: "Alkuperäinen koko",
+    resizer: "Klikkaa ja raahaa muuttaaksesi kokoa",
+    title: "Kuvan ominaisuudet",
+    uploadTab: "Lisää tiedosto",
+    urlMissing: "Kuvan lähdeosoite puuttuu.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/fo.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","fo",{alt:"Alternativur tekstur",btnUpload:"Send til ambætaran",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Myndaupplýsingar",lockRatio:"Læs lutfallið",menu:"Myndaeginleikar",pathName:"image",pathNameCaption:"caption",resetSize:"Upprunastødd",resizer:"Click and drag to resize",title:"Myndaeginleikar",uploadTab:"Send til ambætaran",urlMissing:"URL til mynd manglar."});
+CKEDITOR.plugins.setLang("image2", "fo", {
+    alt: "Alternativur tekstur",
+    btnUpload: "Send til ambætaran",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Myndaupplýsingar",
+    lockRatio: "Læs lutfallið",
+    menu: "Myndaeginleikar",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Upprunastødd",
+    resizer: "Click and drag to resize",
+    title: "Myndaeginleikar",
+    uploadTab: "Send til ambætaran",
+    urlMissing: "URL til mynd manglar.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/fr-ca.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","fr-ca",{alt:"Texte alternatif",btnUpload:"Envoyer sur le serveur",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informations sur l'image2",lockRatio:"Verrouiller les proportions",menu:"Propriétés de l'image2",pathName:"image",pathNameCaption:"caption",resetSize:"Taille originale",resizer:"Click and drag to resize",title:"Propriétés de l'image2",uploadTab:"Téléverser",urlMissing:"L'URL de la source de l'image est manquant."});
+CKEDITOR.plugins.setLang("image2", "fr-ca", {
+    alt: "Texte alternatif",
+    btnUpload: "Envoyer sur le serveur",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Informations sur l'image2",
+    lockRatio: "Verrouiller les proportions",
+    menu: "Propriétés de l'image2",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Taille originale",
+    resizer: "Click and drag to resize",
+    title: "Propriétés de l'image2",
+    uploadTab: "Téléverser",
+    urlMissing: "L'URL de la source de l'image est manquant.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/fr.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","fr",{alt:"Texte alternatif",btnUpload:"Envoyer sur le serveur",captioned:"Image légendée",captionPlaceholder:"Légende",infoTab:"Informations sur l'image",lockRatio:"Conserver les proportions",menu:"Propriétés de l'image",pathName:"image",pathNameCaption:"légende",resetSize:"Réinitialiser la taille",resizer:"Cliquer et glisser pour redimensionner",title:"Propriétés de l'image",uploadTab:"Téléverser",urlMissing:"L'URL source de l'image est manquante."});
+CKEDITOR.plugins.setLang("image2", "fr", {
+    alt: "Texte alternatif",
+    btnUpload: "Envoyer sur le serveur",
+    captioned: "Image légendée",
+    captionPlaceholder: "Légende",
+    infoTab: "Informations sur l'image",
+    lockRatio: "Conserver les proportions",
+    menu: "Propriétés de l'image",
+    pathName: "image",
+    pathNameCaption: "légende",
+    resetSize: "Réinitialiser la taille",
+    resizer: "Cliquer et glisser pour redimensionner",
+    title: "Propriétés de l'image",
+    uploadTab: "Téléverser",
+    urlMissing: "L'URL source de l'image est manquante.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/gl.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","gl",{alt:"Texto alternativo",btnUpload:"Enviar ao servidor",captioned:"Imaxe con lenda",captionPlaceholder:"Lenda",infoTab:"Información da imaxe",lockRatio:"Proporcional",menu:"Propiedades da imaxe",pathName:"Imaxe",pathNameCaption:"lenda",resetSize:"Tamaño orixinal",resizer:"Prema e arrastre para axustar o tamaño",title:"Propiedades da imaxe",uploadTab:"Cargar",urlMissing:"Non se atopa o URL da imaxe."});
+CKEDITOR.plugins.setLang("image2", "gl", {
+    alt: "Texto alternativo",
+    btnUpload: "Enviar ao servidor",
+    captioned: "Imaxe con lenda",
+    captionPlaceholder: "Lenda",
+    infoTab: "Información da imaxe",
+    lockRatio: "Proporcional",
+    menu: "Propiedades da imaxe",
+    pathName: "Imaxe",
+    pathNameCaption: "lenda",
+    resetSize: "Tamaño orixinal",
+    resizer: "Prema e arrastre para axustar o tamaño",
+    title: "Propiedades da imaxe",
+    uploadTab: "Cargar",
+    urlMissing: "Non se atopa o URL da imaxe.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/gu.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","gu",{alt:"ઑલ્ટર્નટ ટેક્સ્ટ",btnUpload:"આ સર્વરને મોકલવું",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"ચિત્ર ની જાણકારી",lockRatio:"લૉક ગુણોત્તર",menu:"ચિત્રના ગુણ",pathName:"image",pathNameCaption:"caption",resetSize:"રીસેટ સાઇઝ",resizer:"Click and drag to resize",title:"ચિત્રના ગુણ",uploadTab:"અપલોડ",urlMissing:"ઈમેજની મૂળ URL છે નહી."});
+CKEDITOR.plugins.setLang("image2", "gu", {
+    alt: "ઑલ્ટર્નટ ટેક્સ્ટ",
+    btnUpload: "આ સર્વરને મોકલવું",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "ચિત્ર ની જાણકારી",
+    lockRatio: "લૉક ગુણોત્તર",
+    menu: "ચિત્રના ગુણ",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "રીસેટ સાઇઝ",
+    resizer: "Click and drag to resize",
+    title: "ચિત્રના ગુણ",
+    uploadTab: "અપલોડ",
+    urlMissing: "ઈમેજની મૂળ URL છે નહી.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/he.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","he",{alt:"טקסט חלופי",btnUpload:"שליחה לשרת",captioned:"כותרת תמונה",captionPlaceholder:"כותרת",infoTab:"מידע על התמונה",lockRatio:"נעילת היחס",menu:"תכונות התמונה",pathName:"תמונה",pathNameCaption:"כותרת",resetSize:"איפוס הגודל",resizer:"לחץ וגרור לשינוי הגודל",title:"מאפייני התמונה",uploadTab:"העלאה",urlMissing:"כתובת התמונה חסרה."});
+CKEDITOR.plugins.setLang("image2", "he", {
+    alt: "טקסט חלופי",
+    btnUpload: "שליחה לשרת",
+    captioned: "כותרת תמונה",
+    captionPlaceholder: "כותרת",
+    infoTab: "מידע על התמונה",
+    lockRatio: "נעילת היחס",
+    menu: "תכונות התמונה",
+    pathName: "תמונה",
+    pathNameCaption: "כותרת",
+    resetSize: "איפוס הגודל",
+    resizer: "לחץ וגרור לשינוי הגודל",
+    title: "מאפייני התמונה",
+    uploadTab: "העלאה",
+    urlMissing: "כתובת התמונה חסרה.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/hi.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","hi",{alt:"वैकल्पिक टेक्स्ट",btnUpload:"इसे सर्वर को भेजें",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"तस्वीर की जानकारी",lockRatio:"लॉक अनुपात",menu:"तस्वीर प्रॉपर्टीज़",pathName:"image",pathNameCaption:"caption",resetSize:"रीसॅट साइज़",resizer:"Click and drag to resize",title:"तस्वीर प्रॉपर्टीज़",uploadTab:"अपलोड",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "hi", {
+    alt: "वैकल्पिक टेक्स्ट",
+    btnUpload: "इसे सर्वर को भेजें",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "तस्वीर की जानकारी",
+    lockRatio: "लॉक अनुपात",
+    menu: "तस्वीर प्रॉपर्टीज़",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "रीसॅट साइज़",
+    resizer: "Click and drag to resize",
+    title: "तस्वीर प्रॉपर्टीज़",
+    uploadTab: "अपलोड",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/hr.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","hr",{alt:"Alternativni tekst",btnUpload:"Pošalji na server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info slike",lockRatio:"Zaključaj odnos",menu:"Svojstva slika",pathName:"image",pathNameCaption:"caption",resetSize:"Obriši veličinu",resizer:"Click and drag to resize",title:"Svojstva slika",uploadTab:"Pošalji",urlMissing:"Nedostaje URL slike."});
+CKEDITOR.plugins.setLang("image2", "hr", {
+    alt: "Alternativni tekst",
+    btnUpload: "Pošalji na server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Info slike",
+    lockRatio: "Zaključaj odnos",
+    menu: "Svojstva slika",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Obriši veličinu",
+    resizer: "Click and drag to resize",
+    title: "Svojstva slika",
+    uploadTab: "Pošalji",
+    urlMissing: "Nedostaje URL slike.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/hu.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","hu",{alt:"Buborék szöveg",btnUpload:"Küldés a szerverre",captioned:"Feliratozott kép",captionPlaceholder:"Képfelirat",infoTab:"Alaptulajdonságok",lockRatio:"Arány megtartása",menu:"Kép tulajdonságai",pathName:"kép",pathNameCaption:"felirat",resetSize:"Eredeti méret",resizer:"Kattints és húzz az átméretezéshez",title:"Kép tulajdonságai",uploadTab:"Feltöltés",urlMissing:"Hiányzik a kép URL-je"});
+CKEDITOR.plugins.setLang("image2", "hu", {
+    alt: "Buborék szöveg",
+    btnUpload: "Küldés a szerverre",
+    captioned: "Feliratozott kép",
+    captionPlaceholder: "Képfelirat",
+    infoTab: "Alaptulajdonságok",
+    lockRatio: "Arány megtartása",
+    menu: "Kép tulajdonságai",
+    pathName: "kép",
+    pathNameCaption: "felirat",
+    resetSize: "Eredeti méret",
+    resizer: "Kattints és húzz az átméretezéshez",
+    title: "Kép tulajdonságai",
+    uploadTab: "Feltöltés",
+    urlMissing: "Hiányzik a kép URL-je",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/id.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","id",{alt:"Teks alternatif",btnUpload:"Kirim ke Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info Gambar",lockRatio:"Lock Ratio",menu:"Image Properties",pathName:"image",pathNameCaption:"caption",resetSize:"Atur Ulang Ukuran",resizer:"Click and drag to resize",title:"Image Properties",uploadTab:"Unggah",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "id", {
+    alt: "Teks alternatif",
+    btnUpload: "Kirim ke Server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Info Gambar",
+    lockRatio: "Lock Ratio",
+    menu: "Image Properties",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Atur Ulang Ukuran",
+    resizer: "Click and drag to resize",
+    title: "Image Properties",
+    uploadTab: "Unggah",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/is.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","is",{alt:"Baklægur texti",btnUpload:"Hlaða upp",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Almennt",lockRatio:"Festa stærðarhlutfall",menu:"Eigindi myndar",pathName:"image",pathNameCaption:"caption",resetSize:"Reikna stærð",resizer:"Click and drag to resize",title:"Eigindi myndar",uploadTab:"Senda upp",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "is", {
+    alt: "Baklægur texti",
+    btnUpload: "Hlaða upp",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Almennt",
+    lockRatio: "Festa stærðarhlutfall",
+    menu: "Eigindi myndar",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Reikna stærð",
+    resizer: "Click and drag to resize",
+    title: "Eigindi myndar",
+    uploadTab: "Senda upp",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/it.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","it",{alt:"Testo alternativo",btnUpload:"Invia al server",captioned:"Immagine con didascalia",captionPlaceholder:"Didascalia",infoTab:"Informazioni immagine",lockRatio:"Blocca rapporto",menu:"Proprietà immagine",pathName:"immagine",pathNameCaption:"didascalia",resetSize:"Reimposta dimensione",resizer:"Fare clic e trascinare per ridimensionare",title:"Proprietà immagine",uploadTab:"Carica",urlMissing:"Manca l'URL dell'immagine."});
+CKEDITOR.plugins.setLang("image2", "it", {
+    alt: "Testo alternativo",
+    btnUpload: "Invia al server",
+    captioned: "Immagine con didascalia",
+    captionPlaceholder: "Didascalia",
+    infoTab: "Informazioni immagine",
+    lockRatio: "Blocca rapporto",
+    menu: "Proprietà immagine",
+    pathName: "immagine",
+    pathNameCaption: "didascalia",
+    resetSize: "Reimposta dimensione",
+    resizer: "Fare clic e trascinare per ridimensionare",
+    title: "Proprietà immagine",
+    uploadTab: "Carica",
+    urlMissing: "Manca l'URL dell'immagine.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ja.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ja",{alt:"代替テキスト",btnUpload:"サーバーに送信",captioned:"キャプションを付ける",captionPlaceholder:"キャプション",infoTab:"画像情報",lockRatio:"比率を固定",menu:"画像のプロパティ",pathName:"image",pathNameCaption:"caption",resetSize:"サイズをリセット",resizer:"ドラッグしてリサイズ",title:"画像のプロパティ",uploadTab:"アップロード",urlMissing:"画像のURLを入力してください。"});
+CKEDITOR.plugins.setLang("image2", "ja", {
+    alt: "代替テキスト",
+    btnUpload: "サーバーに送信",
+    captioned: "キャプションを付ける",
+    captionPlaceholder: "キャプション",
+    infoTab: "画像情報",
+    lockRatio: "比率を固定",
+    menu: "画像のプロパティ",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "サイズをリセット",
+    resizer: "ドラッグしてリサイズ",
+    title: "画像のプロパティ",
+    uploadTab: "アップロード",
+    urlMissing: "画像のURLを入力してください。",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ka.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ka",{alt:"სანაცვლო ტექსტი",btnUpload:"სერვერისთვის გაგზავნა",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"სურათის ინფორმცია",lockRatio:"პროპორციის შენარჩუნება",menu:"სურათის პარამეტრები",pathName:"image",pathNameCaption:"caption",resetSize:"ზომის დაბრუნება",resizer:"Click and drag to resize",title:"სურათის პარამეტრები",uploadTab:"აქაჩვა",urlMissing:"სურათის URL არაა შევსებული."});
+CKEDITOR.plugins.setLang("image2", "ka", {
+    alt: "სანაცვლო ტექსტი",
+    btnUpload: "სერვერისთვის გაგზავნა",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "სურათის ინფორმცია",
+    lockRatio: "პროპორციის შენარჩუნება",
+    menu: "სურათის პარამეტრები",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "ზომის დაბრუნება",
+    resizer: "Click and drag to resize",
+    title: "სურათის პარამეტრები",
+    uploadTab: "აქაჩვა",
+    urlMissing: "სურათის URL არაა შევსებული.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/km.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","km",{alt:"អត្ថបទជំនួស",btnUpload:"បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា",captioned:"រូប​ដែល​មាន​ចំណង​ជើង",captionPlaceholder:"Caption",infoTab:"ពត៌មានអំពីរូបភាព",lockRatio:"ចាក់​សោ​ផល​ធៀប",menu:"លក្ខណៈ​សម្បត្តិ​រូប​ភាព",pathName:"រូបភាព",pathNameCaption:"ចំណងជើង",resetSize:"កំណត់ទំហំឡើងវិញ",resizer:"ចុច​ហើយ​ទាញ​ដើម្បី​ប្ដូរ​ទំហំ",title:"លក្ខណៈ​សម្បត្តិ​រូប​ភាប",uploadTab:"ផ្ទុក​ឡើង",urlMissing:"ខ្វះ URL ប្រភព​រូប​ភាព។"});
+CKEDITOR.plugins.setLang("image2", "km", {
+    alt: "អត្ថបទជំនួស",
+    btnUpload: "បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា",
+    captioned: "រូប​ដែល​មាន​ចំណង​ជើង",
+    captionPlaceholder: "Caption",
+    infoTab: "ពត៌មានអំពីរូបភាព",
+    lockRatio: "ចាក់​សោ​ផល​ធៀប",
+    menu: "លក្ខណៈ​សម្បត្តិ​រូប​ភាព",
+    pathName: "រូបភាព",
+    pathNameCaption: "ចំណងជើង",
+    resetSize: "កំណត់ទំហំឡើងវិញ",
+    resizer: "ចុច​ហើយ​ទាញ​ដើម្បី​ប្ដូរ​ទំហំ",
+    title: "លក្ខណៈ​សម្បត្តិ​រូប​ភាប",
+    uploadTab: "ផ្ទុក​ឡើង",
+    urlMissing: "ខ្វះ URL ប្រភព​រូប​ភាព។",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ko.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ko",{alt:"대체 문자열",btnUpload:"서버로 전송",captioned:"이미지 설명 넣기",captionPlaceholder:"설명",infoTab:"이미지 정보",lockRatio:"비율 유지",menu:"이미지 속성",pathName:"이미지",pathNameCaption:"설명",resetSize:"원래 크기로",resizer:"크기를 조절하려면 클릭 후 드래그 하세요",title:"이미지 속성",uploadTab:"업로드",urlMissing:"이미지 원본 주소(URL)가 없습니다."});
+CKEDITOR.plugins.setLang("image2", "ko", {
+    alt: "대체 문자열",
+    btnUpload: "서버로 전송",
+    captioned: "이미지 설명 넣기",
+    captionPlaceholder: "설명",
+    infoTab: "이미지 정보",
+    lockRatio: "비율 유지",
+    menu: "이미지 속성",
+    pathName: "이미지",
+    pathNameCaption: "설명",
+    resetSize: "원래 크기로",
+    resizer: "크기를 조절하려면 클릭 후 드래그 하세요",
+    title: "이미지 속성",
+    uploadTab: "업로드",
+    urlMissing: "이미지 원본 주소(URL)가 없습니다.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ku.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ku",{alt:"جێگرەوەی دەق",btnUpload:"ناردنی بۆ ڕاژه",captioned:"وێنەی بەسەردێر",captionPlaceholder:"سەردێر",infoTab:"زانیاری وێنه",lockRatio:"داخستنی ڕێژه",menu:"خاسیەتی وێنه",pathName:"وێنە",pathNameCaption:"سەردێر",resetSize:"ڕێکخستنەوەی قەباره",resizer:"کرتەبکە و ڕایبکێشە بۆ قەبارە گۆڕین",title:"خاسیەتی وێنه",uploadTab:"بارکردن",urlMissing:"سەرچاوەی بەستەری وێنه بزره"});
+CKEDITOR.plugins.setLang("image2", "ku", {
+    alt: "جێگرەوەی دەق",
+    btnUpload: "ناردنی بۆ ڕاژه",
+    captioned: "وێنەی بەسەردێر",
+    captionPlaceholder: "سەردێر",
+    infoTab: "زانیاری وێنه",
+    lockRatio: "داخستنی ڕێژه",
+    menu: "خاسیەتی وێنه",
+    pathName: "وێنە",
+    pathNameCaption: "سەردێر",
+    resetSize: "ڕێکخستنەوەی قەباره",
+    resizer: "کرتەبکە و ڕایبکێشە بۆ قەبارە گۆڕین",
+    title: "خاسیەتی وێنه",
+    uploadTab: "بارکردن",
+    urlMissing: "سەرچاوەی بەستەری وێنه بزره",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/lt.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","lt",{alt:"Alternatyvus Tekstas",btnUpload:"Siųsti į serverį",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Vaizdo informacija",lockRatio:"Išlaikyti proporciją",menu:"Vaizdo savybės",pathName:"image",pathNameCaption:"caption",resetSize:"Atstatyti dydį",resizer:"Click and drag to resize",title:"Vaizdo savybės",uploadTab:"Siųsti",urlMissing:"Paveiksliuko nuorodos nėra."});
+CKEDITOR.plugins.setLang("image2", "lt", {
+    alt: "Alternatyvus Tekstas",
+    btnUpload: "Siųsti į serverį",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Vaizdo informacija",
+    lockRatio: "Išlaikyti proporciją",
+    menu: "Vaizdo savybės",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Atstatyti dydį",
+    resizer: "Click and drag to resize",
+    title: "Vaizdo savybės",
+    uploadTab: "Siųsti",
+    urlMissing: "Paveiksliuko nuorodos nėra.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/lv.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","lv",{alt:"Alternatīvais teksts",btnUpload:"Nosūtīt serverim",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informācija par attēlu",lockRatio:"Nemainīga Augstuma/Platuma attiecība",menu:"Attēla īpašības",pathName:"image",pathNameCaption:"caption",resetSize:"Atjaunot sākotnējo izmēru",resizer:"Click and drag to resize",title:"Attēla īpašības",uploadTab:"Augšupielādēt",urlMissing:"Trūkst attēla atrašanās adrese."});
+CKEDITOR.plugins.setLang("image2", "lv", {
+    alt: "Alternatīvais teksts",
+    btnUpload: "Nosūtīt serverim",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Informācija par attēlu",
+    lockRatio: "Nemainīga Augstuma/Platuma attiecība",
+    menu: "Attēla īpašības",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Atjaunot sākotnējo izmēru",
+    resizer: "Click and drag to resize",
+    title: "Attēla īpašības",
+    uploadTab: "Augšupielādēt",
+    urlMissing: "Trūkst attēla atrašanās adrese.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/mk.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","mk",{alt:"Алтернативен текст",btnUpload:"Прикачи на сервер",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Информации за сликата",lockRatio:"Зачувај пропорција",menu:"Својства на сликата",pathName:"image",pathNameCaption:"caption",resetSize:"Ресетирај големина",resizer:"Click and drag to resize",title:"Својства на сликата",uploadTab:"Прикачи",urlMissing:"Недостасува URL-то на сликата."});
+CKEDITOR.plugins.setLang("image2", "mk", {
+    alt: "Алтернативен текст",
+    btnUpload: "Прикачи на сервер",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Информации за сликата",
+    lockRatio: "Зачувај пропорција",
+    menu: "Својства на сликата",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Ресетирај големина",
+    resizer: "Click and drag to resize",
+    title: "Својства на сликата",
+    uploadTab: "Прикачи",
+    urlMissing: "Недостасува URL-то на сликата.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/mn.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","mn",{alt:"Зургийг орлох бичвэр",btnUpload:"Үүнийг сервэррүү илгээ",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Зурагны мэдээлэл",lockRatio:"Радио түгжих",menu:"Зураг",pathName:"image",pathNameCaption:"caption",resetSize:"хэмжээ дахин оноох",resizer:"Click and drag to resize",title:"Зураг",uploadTab:"Илгээж ачаалах",urlMissing:"Зургийн эх сурвалжийн хаяг (URL) байхгүй байна."});
+CKEDITOR.plugins.setLang("image2", "mn", {
+    alt: "Зургийг орлох бичвэр",
+    btnUpload: "Үүнийг сервэррүү илгээ",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Зурагны мэдээлэл",
+    lockRatio: "Радио түгжих",
+    menu: "Зураг",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "хэмжээ дахин оноох",
+    resizer: "Click and drag to resize",
+    title: "Зураг",
+    uploadTab: "Илгээж ачаалах",
+    urlMissing: "Зургийн эх сурвалжийн хаяг (URL) байхгүй байна.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ms.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ms",{alt:"Text Alternatif",btnUpload:"Hantar ke Server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info Imej",lockRatio:"Tetapkan Nisbah",menu:"Ciri-ciri Imej",pathName:"image",pathNameCaption:"caption",resetSize:"Saiz Set Semula",resizer:"Click and drag to resize",title:"Ciri-ciri Imej",uploadTab:"Muat Naik",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "ms", {
+    alt: "Text Alternatif",
+    btnUpload: "Hantar ke Server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Info Imej",
+    lockRatio: "Tetapkan Nisbah",
+    menu: "Ciri-ciri Imej",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Saiz Set Semula",
+    resizer: "Click and drag to resize",
+    title: "Ciri-ciri Imej",
+    uploadTab: "Muat Naik",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/nb.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","nb",{alt:"Alternativ tekst",btnUpload:"Send det til serveren",captioned:"Bilde med bildetekst",captionPlaceholder:"Bildetekst",infoTab:"Bildeinformasjon",lockRatio:"Lås forhold",menu:"Bildeegenskaper",pathName:"bilde",pathNameCaption:"bildetekst",resetSize:"Tilbakestill størrelse",resizer:"Klikk og dra for å endre størrelse",title:"Bildeegenskaper",uploadTab:"Last opp",urlMissing:"Bildets adresse mangler."});
+CKEDITOR.plugins.setLang("image2", "nb", {
+    alt: "Alternativ tekst",
+    btnUpload: "Send det til serveren",
+    captioned: "Bilde med bildetekst",
+    captionPlaceholder: "Bildetekst",
+    infoTab: "Bildeinformasjon",
+    lockRatio: "Lås forhold",
+    menu: "Bildeegenskaper",
+    pathName: "bilde",
+    pathNameCaption: "bildetekst",
+    resetSize: "Tilbakestill størrelse",
+    resizer: "Klikk og dra for å endre størrelse",
+    title: "Bildeegenskaper",
+    uploadTab: "Last opp",
+    urlMissing: "Bildets adresse mangler.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/nl.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","nl",{alt:"Alternatieve tekst",btnUpload:"Naar server verzenden",captioned:"Afbeelding met onderschrift",captionPlaceholder:"Onderschrift",infoTab:"Afbeeldingsinformatie",lockRatio:"Verhouding vergrendelen",menu:"Eigenschappen afbeelding",pathName:"afbeelding",pathNameCaption:"onderschrift",resetSize:"Afmetingen herstellen",resizer:"Klik en sleep om te herschalen",title:"Afbeeldingseigenschappen",uploadTab:"Uploaden",urlMissing:"De URL naar de afbeelding ontbreekt."});
+CKEDITOR.plugins.setLang("image2", "nl", {
+    alt: "Alternatieve tekst",
+    btnUpload: "Naar server verzenden",
+    captioned: "Afbeelding met onderschrift",
+    captionPlaceholder: "Onderschrift",
+    infoTab: "Afbeeldingsinformatie",
+    lockRatio: "Verhouding vergrendelen",
+    menu: "Eigenschappen afbeelding",
+    pathName: "afbeelding",
+    pathNameCaption: "onderschrift",
+    resetSize: "Afmetingen herstellen",
+    resizer: "Klik en sleep om te herschalen",
+    title: "Afbeeldingseigenschappen",
+    uploadTab: "Uploaden",
+    urlMissing: "De URL naar de afbeelding ontbreekt.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/no.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","no",{alt:"Alternativ tekst",btnUpload:"Send det til serveren",captioned:"Bilde med bildetekst",captionPlaceholder:"Caption",infoTab:"Bildeinformasjon",lockRatio:"Lås forhold",menu:"Bildeegenskaper",pathName:"bilde",pathNameCaption:"bildetekst",resetSize:"Tilbakestill størrelse",resizer:"Klikk og dra for å endre størrelse",title:"Bildeegenskaper",uploadTab:"Last opp",urlMissing:"Bildets adresse mangler."});
+CKEDITOR.plugins.setLang("image2", "no", {
+    alt: "Alternativ tekst",
+    btnUpload: "Send det til serveren",
+    captioned: "Bilde med bildetekst",
+    captionPlaceholder: "Caption",
+    infoTab: "Bildeinformasjon",
+    lockRatio: "Lås forhold",
+    menu: "Bildeegenskaper",
+    pathName: "bilde",
+    pathNameCaption: "bildetekst",
+    resetSize: "Tilbakestill størrelse",
+    resizer: "Klikk og dra for å endre størrelse",
+    title: "Bildeegenskaper",
+    uploadTab: "Last opp",
+    urlMissing: "Bildets adresse mangler.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/pl.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","pl",{alt:"Tekst zastępczy",btnUpload:"Wyślij",captioned:"Obrazek z podpisem",captionPlaceholder:"Podpis",infoTab:"Informacje o obrazku",lockRatio:"Zablokuj proporcje",menu:"Właściwości obrazka",pathName:"obrazek",pathNameCaption:"podpis",resetSize:"Przywróć rozmiar",resizer:"Kliknij i przeciągnij, by zmienić rozmiar.",title:"Właściwości obrazka",uploadTab:"Wyślij",urlMissing:"Podaj adres URL obrazka."});
+CKEDITOR.plugins.setLang("image2", "pl", {
+    alt: "Tekst zastępczy",
+    btnUpload: "Wyślij",
+    captioned: "Obrazek z podpisem",
+    captionPlaceholder: "Podpis",
+    infoTab: "Informacje o obrazku",
+    lockRatio: "Zablokuj proporcje",
+    menu: "Właściwości obrazka",
+    pathName: "obrazek",
+    pathNameCaption: "podpis",
+    resetSize: "Przywróć rozmiar",
+    resizer: "Kliknij i przeciągnij, by zmienić rozmiar.",
+    title: "Właściwości obrazka",
+    uploadTab: "Wyślij",
+    urlMissing: "Podaj adres URL obrazka.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/pt-br.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","pt-br",{alt:"Texto Alternativo",btnUpload:"Enviar para o Servidor",captioned:"Legenda da Imagem",captionPlaceholder:"Legenda",infoTab:"Informações da Imagem",lockRatio:"Travar Proporções",menu:"Formatar Imagem",pathName:"Imagem",pathNameCaption:"Legenda",resetSize:"Redefinir para o Tamanho Original",resizer:"Click e arraste para redimensionar",title:"Formatar Imagem",uploadTab:"Enviar ao Servidor",urlMissing:"URL da imagem está faltando."});
+CKEDITOR.plugins.setLang("image2", "pt-br", {
+    alt: "Texto Alternativo",
+    btnUpload: "Enviar para o Servidor",
+    captioned: "Legenda da Imagem",
+    captionPlaceholder: "Legenda",
+    infoTab: "Informações da Imagem",
+    lockRatio: "Travar Proporções",
+    menu: "Formatar Imagem",
+    pathName: "Imagem",
+    pathNameCaption: "Legenda",
+    resetSize: "Redefinir para o Tamanho Original",
+    resizer: "Click e arraste para redimensionar",
+    title: "Formatar Imagem",
+    uploadTab: "Enviar ao Servidor",
+    urlMissing: "URL da imagem está faltando.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/pt.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","pt",{alt:"Texto alternativo",btnUpload:"Enviar para o servidor",captioned:"Imagem legendada",captionPlaceholder:"Legenda",infoTab:"Informação da imagem",lockRatio:"Proporcional",menu:"Propriedades da imagem",pathName:"imagem",pathNameCaption:"legenda",resetSize:"Tamanho original",resizer:"Clique e arraste para redimensionar",title:"Propriedades da imagem",uploadTab:"Carregar",urlMissing:"O URL da fonte da imagem está em falta."});
+CKEDITOR.plugins.setLang("image2", "pt", {
+    alt: "Texto alternativo",
+    btnUpload: "Enviar para o servidor",
+    captioned: "Imagem legendada",
+    captionPlaceholder: "Legenda",
+    infoTab: "Informação da imagem",
+    lockRatio: "Proporcional",
+    menu: "Propriedades da imagem",
+    pathName: "imagem",
+    pathNameCaption: "legenda",
+    resetSize: "Tamanho original",
+    resizer: "Clique e arraste para redimensionar",
+    title: "Propriedades da imagem",
+    uploadTab: "Carregar",
+    urlMissing: "O URL da fonte da imagem está em falta.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ro.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ro",{alt:"Text alternativ",btnUpload:"Trimite la server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informaţii despre imagine",lockRatio:"Păstrează proporţiile",menu:"Proprietăţile imaginii",pathName:"image",pathNameCaption:"caption",resetSize:"Resetează mărimea",resizer:"Click and drag to resize",title:"Proprietăţile imaginii",uploadTab:"Încarcă",urlMissing:"Sursa URL a imaginii lipsește."});
+CKEDITOR.plugins.setLang("image2", "ro", {
+    alt: "Text alternativ",
+    btnUpload: "Trimite la server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Informaţii despre imagine",
+    lockRatio: "Păstrează proporţiile",
+    menu: "Proprietăţile imaginii",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Resetează mărimea",
+    resizer: "Click and drag to resize",
+    title: "Proprietăţile imaginii",
+    uploadTab: "Încarcă",
+    urlMissing: "Sursa URL a imaginii lipsește.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ru.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ru",{alt:"Альтернативный текст",btnUpload:"Загрузить на сервер",captioned:"Отображать название",captionPlaceholder:"Название",infoTab:"Данные об изображении",lockRatio:"Сохранять пропорции",menu:"Свойства изображения",pathName:"изображение",pathNameCaption:"название",resetSize:"Вернуть обычные размеры",resizer:"Нажмите и растяните",title:"Свойства изображения",uploadTab:"Загрузка файла",urlMissing:"Не указана ссылка на изображение."});
+CKEDITOR.plugins.setLang("image2", "ru", {
+    alt: "Альтернативный текст",
+    btnUpload: "Загрузить на сервер",
+    captioned: "Отображать название",
+    captionPlaceholder: "Название",
+    infoTab: "Данные об изображении",
+    lockRatio: "Сохранять пропорции",
+    menu: "Свойства изображения",
+    pathName: "изображение",
+    pathNameCaption: "название",
+    resetSize: "Вернуть обычные размеры",
+    resizer: "Нажмите и растяните",
+    title: "Свойства изображения",
+    uploadTab: "Загрузка файла",
+    urlMissing: "Не указана ссылка на изображение.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/si.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","si",{alt:"විකල්ප ",btnUpload:"සේවාදායකය වෙත යොමුකිරිම",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"රුපයේ තොරතුරු",lockRatio:"නවතන අනුපාතය ",menu:"රුපයේ ගුණ",pathName:"image",pathNameCaption:"caption",resetSize:"නැවතත් විශාලත්වය වෙනස් කිරීම",resizer:"Click and drag to resize",title:"රුපයේ ",uploadTab:"උඩුගතකිරීම",urlMissing:"රුප මුලාශ්‍ර URL නැත."});
+CKEDITOR.plugins.setLang("image2", "si", {
+    alt: "විකල්ප ",
+    btnUpload: "සේවාදායකය වෙත යොමුකිරිම",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "රුපයේ තොරතුරු",
+    lockRatio: "නවතන අනුපාතය ",
+    menu: "රුපයේ ගුණ",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "නැවතත් විශාලත්වය වෙනස් කිරීම",
+    resizer: "Click and drag to resize",
+    title: "රුපයේ ",
+    uploadTab: "උඩුගතකිරීම",
+    urlMissing: "රුප මුලාශ්‍ර URL නැත.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/sk.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","sk",{alt:"Alternatívny text",btnUpload:"Odoslať to na server",captioned:"Opísaný obrázok",captionPlaceholder:"Popis",infoTab:"Informácie o obrázku",lockRatio:"Pomer zámky",menu:"Vlastnosti obrázka",pathName:"obrázok",pathNameCaption:"popis",resetSize:"Pôvodná veľkosť",resizer:"Kliknite a potiahnite pre zmenu veľkosti",title:"Vlastnosti obrázka",uploadTab:"Nahrať",urlMissing:"Chýba URL zdroja obrázka."});
+CKEDITOR.plugins.setLang("image2", "sk", {
+    alt: "Alternatívny text",
+    btnUpload: "Odoslať to na server",
+    captioned: "Opísaný obrázok",
+    captionPlaceholder: "Popis",
+    infoTab: "Informácie o obrázku",
+    lockRatio: "Pomer zámky",
+    menu: "Vlastnosti obrázka",
+    pathName: "obrázok",
+    pathNameCaption: "popis",
+    resetSize: "Pôvodná veľkosť",
+    resizer: "Kliknite a potiahnite pre zmenu veľkosti",
+    title: "Vlastnosti obrázka",
+    uploadTab: "Nahrať",
+    urlMissing: "Chýba URL zdroja obrázka.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/sl.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","sl",{alt:"Nadomestno besedilo",btnUpload:"Pošlji na strežnik",captioned:"Slika z napisom",captionPlaceholder:"Napis",infoTab:"Podatki o sliki",lockRatio:"Zakleni razmerje",menu:"Lastnosti slike",pathName:"slika",pathNameCaption:"napis",resetSize:"Ponastavi velikost",resizer:"Kliknite in povlecite, da spremenite velikost",title:"Lastnosti slike",uploadTab:"Naloži",urlMissing:"Manjka vir (URL) slike."});
+CKEDITOR.plugins.setLang("image2", "sl", {
+    alt: "Nadomestno besedilo",
+    btnUpload: "Pošlji na strežnik",
+    captioned: "Slika z napisom",
+    captionPlaceholder: "Napis",
+    infoTab: "Podatki o sliki",
+    lockRatio: "Zakleni razmerje",
+    menu: "Lastnosti slike",
+    pathName: "slika",
+    pathNameCaption: "napis",
+    resetSize: "Ponastavi velikost",
+    resizer: "Kliknite in povlecite, da spremenite velikost",
+    title: "Lastnosti slike",
+    uploadTab: "Naloži",
+    urlMissing: "Manjka vir (URL) slike.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/sq.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","sq",{alt:"Tekst Alternativ",btnUpload:"Dërgo në server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Informacione mbi Fotografinë",lockRatio:"Mbyll Racionin",menu:"Karakteristikat e Fotografisë",pathName:"foto",pathNameCaption:"caption",resetSize:"Rikthe Madhësinë",resizer:"Click and drag to resize",title:"Karakteristikat e Fotografisë",uploadTab:"Ngarko",urlMissing:"Mungon URL e burimit të fotografisë."});
+CKEDITOR.plugins.setLang("image2", "sq", {
+    alt: "Tekst Alternativ",
+    btnUpload: "Dërgo në server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Informacione mbi Fotografinë",
+    lockRatio: "Mbyll Racionin",
+    menu: "Karakteristikat e Fotografisë",
+    pathName: "foto",
+    pathNameCaption: "caption",
+    resetSize: "Rikthe Madhësinë",
+    resizer: "Click and drag to resize",
+    title: "Karakteristikat e Fotografisë",
+    uploadTab: "Ngarko",
+    urlMissing: "Mungon URL e burimit të fotografisë.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/sr-latn.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","sr-latn",{alt:"Alternativni tekst",btnUpload:"Pošalji na server",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Info slike",lockRatio:"Zaključaj odnos",menu:"Osobine slika",pathName:"image",pathNameCaption:"caption",resetSize:"Resetuj veličinu",resizer:"Click and drag to resize",title:"Osobine slika",uploadTab:"Pošalji",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "sr-latn", {
+    alt: "Alternativni tekst",
+    btnUpload: "Pošalji na server",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Info slike",
+    lockRatio: "Zaključaj odnos",
+    menu: "Osobine slika",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Resetuj veličinu",
+    resizer: "Click and drag to resize",
+    title: "Osobine slika",
+    uploadTab: "Pošalji",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/sr.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","sr",{alt:"Алтернативни текст",btnUpload:"Пошаљи на сервер",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"Инфо слике",lockRatio:"Закључај однос",menu:"Особине слика",pathName:"image",pathNameCaption:"caption",resetSize:"Ресетуј величину",resizer:"Click and drag to resize",title:"Особине слика",uploadTab:"Пошаљи",urlMissing:"Недостаје УРЛ слике."});
+CKEDITOR.plugins.setLang("image2", "sr", {
+    alt: "Алтернативни текст",
+    btnUpload: "Пошаљи на сервер",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "Инфо слике",
+    lockRatio: "Закључај однос",
+    menu: "Особине слика",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "Ресетуј величину",
+    resizer: "Click and drag to resize",
+    title: "Особине слика",
+    uploadTab: "Пошаљи",
+    urlMissing: "Недостаје УРЛ слике.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/sv.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","sv",{alt:"Alternativ text",btnUpload:"Skicka till server",captioned:"Rubricerad bild",captionPlaceholder:"Bildtext",infoTab:"Bildinformation",lockRatio:"Lås höjd/bredd förhållanden",menu:"Bildegenskaper",pathName:"bild",pathNameCaption:"rubrik",resetSize:"Återställ storlek",resizer:"Klicka och drag för att ändra storlek",title:"Bildegenskaper",uploadTab:"Ladda upp",urlMissing:"Bildkällans URL saknas."});
+CKEDITOR.plugins.setLang("image2", "sv", {
+    alt: "Alternativ text",
+    btnUpload: "Skicka till server",
+    captioned: "Rubricerad bild",
+    captionPlaceholder: "Bildtext",
+    infoTab: "Bildinformation",
+    lockRatio: "Lås höjd/bredd förhållanden",
+    menu: "Bildegenskaper",
+    pathName: "bild",
+    pathNameCaption: "rubrik",
+    resetSize: "Återställ storlek",
+    resizer: "Klicka och drag för att ändra storlek",
+    title: "Bildegenskaper",
+    uploadTab: "Ladda upp",
+    urlMissing: "Bildkällans URL saknas.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/th.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","th",{alt:"คำประกอบรูปภาพ",btnUpload:"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)",captioned:"Captioned image",captionPlaceholder:"Caption",infoTab:"ข้อมูลของรูปภาพ",lockRatio:"กำหนดอัตราส่วน กว้าง-สูง แบบคงที่",menu:"คุณสมบัติของ รูปภาพ",pathName:"image",pathNameCaption:"caption",resetSize:"กำหนดรูปเท่าขนาดจริง",resizer:"Click and drag to resize",title:"คุณสมบัติของ รูปภาพ",uploadTab:"อัพโหลดไฟล์",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "th", {
+    alt: "คำประกอบรูปภาพ",
+    btnUpload: "อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)",
+    captioned: "Captioned image",
+    captionPlaceholder: "Caption",
+    infoTab: "ข้อมูลของรูปภาพ",
+    lockRatio: "กำหนดอัตราส่วน กว้าง-สูง แบบคงที่",
+    menu: "คุณสมบัติของ รูปภาพ",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "กำหนดรูปเท่าขนาดจริง",
+    resizer: "Click and drag to resize",
+    title: "คุณสมบัติของ รูปภาพ",
+    uploadTab: "อัพโหลดไฟล์",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/tr.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","tr",{alt:"Alternatif Yazı",btnUpload:"Sunucuya Yolla",captioned:"Başlıklı resim",captionPlaceholder:"Başlık",infoTab:"Resim Bilgisi",lockRatio:"Oranı Kilitle",menu:"Resim Özellikleri",pathName:"Resim",pathNameCaption:"başlık",resetSize:"Boyutu Başa Döndür",resizer:"Boyutlandırmak için, tıklayın ve sürükleyin",title:"Resim Özellikleri",uploadTab:"Karşıya Yükle",urlMissing:"Resmin URL kaynağı bulunamadı."});
+CKEDITOR.plugins.setLang("image2", "tr", {
+    alt: "Alternatif Yazı",
+    btnUpload: "Sunucuya Yolla",
+    captioned: "Başlıklı resim",
+    captionPlaceholder: "Başlık",
+    infoTab: "Resim Bilgisi",
+    lockRatio: "Oranı Kilitle",
+    menu: "Resim Özellikleri",
+    pathName: "Resim",
+    pathNameCaption: "başlık",
+    resetSize: "Boyutu Başa Döndür",
+    resizer: "Boyutlandırmak için, tıklayın ve sürükleyin",
+    title: "Resim Özellikleri",
+    uploadTab: "Karşıya Yükle",
+    urlMissing: "Resmin URL kaynağı bulunamadı.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/tt.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","tt",{alt:"Альтернатив текст",btnUpload:"Серверга җибәрү",captioned:"Исеме куелган рәсем",captionPlaceholder:"Исем",infoTab:"Рәсем тасвирламасы",lockRatio:"Lock Ratio",menu:"Рәсем үзлекләре",pathName:"рәсем",pathNameCaption:"исем",resetSize:"Баштагы зурлык",resizer:"Күчереп куер өчен басып шудырыгыз",title:"Рәсем үзлекләре",uploadTab:"Йөкләү",urlMissing:"Image source URL is missing."});
+CKEDITOR.plugins.setLang("image2", "tt", {
+    alt: "Альтернатив текст",
+    btnUpload: "Серверга җибәрү",
+    captioned: "Исеме куелган рәсем",
+    captionPlaceholder: "Исем",
+    infoTab: "Рәсем тасвирламасы",
+    lockRatio: "Lock Ratio",
+    menu: "Рәсем үзлекләре",
+    pathName: "рәсем",
+    pathNameCaption: "исем",
+    resetSize: "Баштагы зурлык",
+    resizer: "Күчереп куер өчен басып шудырыгыз",
+    title: "Рәсем үзлекләре",
+    uploadTab: "Йөкләү",
+    urlMissing: "Image source URL is missing.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/ug.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","ug",{alt:"تېكىست ئالماشتۇر",btnUpload:"مۇلازىمېتىرغا يۈكلە",captioned:"ماۋزۇلۇق سۈرەت",captionPlaceholder:"Caption",infoTab:"سۈرەت",lockRatio:"نىسبەتنى قۇلۇپلا",menu:"سۈرەت خاسلىقى",pathName:"image",pathNameCaption:"caption",resetSize:"ئەسلى چوڭلۇق",resizer:"Click and drag to resize",title:"سۈرەت خاسلىقى",uploadTab:"يۈكلە",urlMissing:"سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم"});
+CKEDITOR.plugins.setLang("image2", "ug", {
+    alt: "تېكىست ئالماشتۇر",
+    btnUpload: "مۇلازىمېتىرغا يۈكلە",
+    captioned: "ماۋزۇلۇق سۈرەت",
+    captionPlaceholder: "Caption",
+    infoTab: "سۈرەت",
+    lockRatio: "نىسبەتنى قۇلۇپلا",
+    menu: "سۈرەت خاسلىقى",
+    pathName: "image",
+    pathNameCaption: "caption",
+    resetSize: "ئەسلى چوڭلۇق",
+    resizer: "Click and drag to resize",
+    title: "سۈرەت خاسلىقى",
+    uploadTab: "يۈكلە",
+    urlMissing: "سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/uk.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","uk",{alt:"Альтернативний текст",btnUpload:"Надіслати на сервер",captioned:"Підписане зображення",captionPlaceholder:"Заголовок",infoTab:"Інформація про зображення",lockRatio:"Зберегти пропорції",menu:"Властивості зображення",pathName:"Зображення",pathNameCaption:"заголовок",resetSize:"Очистити поля розмірів",resizer:"Клікніть та потягніть для зміни розмірів",title:"Властивості зображення",uploadTab:"Надіслати",urlMissing:"Вкажіть URL зображення."});
+CKEDITOR.plugins.setLang("image2", "uk", {
+    alt: "Альтернативний текст",
+    btnUpload: "Надіслати на сервер",
+    captioned: "Підписане зображення",
+    captionPlaceholder: "Заголовок",
+    infoTab: "Інформація про зображення",
+    lockRatio: "Зберегти пропорції",
+    menu: "Властивості зображення",
+    pathName: "Зображення",
+    pathNameCaption: "заголовок",
+    resetSize: "Очистити поля розмірів",
+    resizer: "Клікніть та потягніть для зміни розмірів",
+    title: "Властивості зображення",
+    uploadTab: "Надіслати",
+    urlMissing: "Вкажіть URL зображення.",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/vi.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","vi",{alt:"Chú thích ảnh",btnUpload:"Tải lên máy chủ",captioned:"Ảnh có chú thích",captionPlaceholder:"Nhãn",infoTab:"Thông tin của ảnh",lockRatio:"Giữ nguyên tỷ lệ",menu:"Thuộc tính của ảnh",pathName:"ảnh",pathNameCaption:"chú thích",resetSize:"Kích thước gốc",resizer:"Kéo rê để thay đổi kích cỡ",title:"Thuộc tính của ảnh",uploadTab:"Tải lên",urlMissing:"Thiếu đường dẫn hình ảnh"});
+CKEDITOR.plugins.setLang("image2", "vi", {
+    alt: "Chú thích ảnh",
+    btnUpload: "Tải lên máy chủ",
+    captioned: "Ảnh có chú thích",
+    captionPlaceholder: "Nhãn",
+    infoTab: "Thông tin của ảnh",
+    lockRatio: "Giữ nguyên tỷ lệ",
+    menu: "Thuộc tính của ảnh",
+    pathName: "ảnh",
+    pathNameCaption: "chú thích",
+    resetSize: "Kích thước gốc",
+    resizer: "Kéo rê để thay đổi kích cỡ",
+    title: "Thuộc tính của ảnh",
+    uploadTab: "Tải lên",
+    urlMissing: "Thiếu đường dẫn hình ảnh",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/zh-cn.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","zh-cn",{alt:"替换文本",btnUpload:"上传到服务器",captioned:"带标题图像",captionPlaceholder:"标题",infoTab:"图像信息",lockRatio:"锁定比例",menu:"图像属性",pathName:"图像",pathNameCaption:"标题",resetSize:"原始尺寸",resizer:"点击并拖拽以改变尺寸",title:"图像属性",uploadTab:"上传",urlMissing:"缺少图像源文件地址"});
+CKEDITOR.plugins.setLang("image2", "zh-cn", {
+    alt: "替换文本",
+    btnUpload: "上传到服务器",
+    captioned: "带标题图像",
+    captionPlaceholder: "标题",
+    infoTab: "图像信息",
+    lockRatio: "锁定比例",
+    menu: "图像属性",
+    pathName: "图像",
+    pathNameCaption: "标题",
+    resetSize: "原始尺寸",
+    resizer: "点击并拖拽以改变尺寸",
+    title: "图像属性",
+    uploadTab: "上传",
+    urlMissing: "缺少图像源文件地址",
+    responsive: 'Is responsive'
+});

+ 17 - 1
app/Resources/public/assets/ckeditor/plugins/image2/lang/zh.js

@@ -1 +1,17 @@
-CKEDITOR.plugins.setLang("image2","zh",{alt:"替代文字",btnUpload:"傳送至伺服器",captioned:"已加標題之圖片",captionPlaceholder:"標題",infoTab:"影像資訊",lockRatio:"固定比例",menu:"影像屬性",pathName:"圖片",pathNameCaption:"標題",resetSize:"重設大小",resizer:"拖曳以改變大小",title:"影像屬性",uploadTab:"上傳",urlMissing:"遺失圖片來源之 URL "});
+CKEDITOR.plugins.setLang("image2", "zh", {
+    alt: "替代文字",
+    btnUpload: "傳送至伺服器",
+    captioned: "已加標題之圖片",
+    captionPlaceholder: "標題",
+    infoTab: "影像資訊",
+    lockRatio: "固定比例",
+    menu: "影像屬性",
+    pathName: "圖片",
+    pathNameCaption: "標題",
+    resetSize: "重設大小",
+    resizer: "拖曳以改變大小",
+    title: "影像屬性",
+    uploadTab: "上傳",
+    urlMissing: "遺失圖片來源之 URL ",
+    responsive: 'Is responsive'
+});

+ 1711 - 31
app/Resources/public/assets/ckeditor/plugins/image2/plugin.js

@@ -1,31 +1,1711 @@
-/*
- Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
- For licensing, see LICENSE.md or http://ckeditor.com/license
-*/
-(function(){function D(a){function b(){this.deflated||(a.widgets.focused==this.widget&&(this.focused=!0),a.widgets.destroy(this.widget),this.deflated=!0)}function c(){var d=a.editable(),e=a.document;if(this.deflated)this.widget=a.widgets.initOn(this.element,"image",this.widget.data),this.widget.inline&&!(new CKEDITOR.dom.elementPath(this.widget.wrapper,d)).block&&(d=e.createElement(a.activeEnterMode==CKEDITOR.ENTER_P?"p":"div"),d.replace(this.widget.wrapper),this.widget.wrapper.move(d)),this.focused&&
-(this.widget.focus(),delete this.focused),delete this.deflated;else{var b=this.widget,d=g,e=b.wrapper,c=b.data.align,b=b.data.hasCaption;if(d){for(var l=3;l--;)e.removeClass(d[l]);"center"==c?b&&e.addClass(d[1]):"none"!=c&&e.addClass(d[q[c]])}else"center"==c?(b?e.setStyle("text-align","center"):e.removeStyle("text-align"),e.removeStyle("float")):("none"==c?e.removeStyle("float"):e.setStyle("float",c),e.removeStyle("text-align"))}}var g=a.config.image2_alignClasses,f=a.config.image2_captionedClass;
-return{allowedContent:E(a),requiredContent:"img[src,alt]",features:F(a),styleableElements:"img figure",contentTransformations:[["img[width]: sizeToAttribute"]],editables:{caption:{selector:"figcaption",allowedContent:"br em strong sub sup u s; a[!href,target]"}},parts:{image:"img",caption:"figcaption"},dialog:"image2",template:'\x3cimg alt\x3d"" src\x3d"" /\x3e',data:function(){var d=this.features;this.data.hasCaption&&!a.filter.checkFeature(d.caption)&&(this.data.hasCaption=!1);"none"==this.data.align||
-a.filter.checkFeature(d.align)||(this.data.align="none");this.shiftState({widget:this,element:this.element,oldData:this.oldData,newData:this.data,deflate:b,inflate:c});this.data.link?this.parts.link||(this.parts.link=this.parts.image.getParent()):this.parts.link&&delete this.parts.link;this.parts.image.setAttributes({src:this.data.src,"data-cke-saved-src":this.data.src,alt:this.data.alt});if(this.oldData&&!this.oldData.hasCaption&&this.data.hasCaption)for(var e in this.data.classes)this.parts.image.removeClass(e);
-if(a.filter.checkFeature(d.dimension)){d=this.data;d={width:d.width,height:d.height};e=this.parts.image;for(var g in d)d[g]?e.setAttribute(g,d[g]):e.removeAttribute(g)}this.oldData=CKEDITOR.tools.extend({},this.data)},init:function(){var d=CKEDITOR.plugins.image2,b=this.parts.image,c={hasCaption:!!this.parts.caption,src:b.getAttribute("src"),alt:b.getAttribute("alt")||"",width:b.getAttribute("width")||"",height:b.getAttribute("height")||"",lock:this.ready?d.checkHasNaturalRatio(b):!0},f=b.getAscendant("a");
-f&&this.wrapper.contains(f)&&(this.parts.link=f);c.align||(b=c.hasCaption?this.element:b,g?(b.hasClass(g[0])?c.align="left":b.hasClass(g[2])&&(c.align="right"),c.align?b.removeClass(g[q[c.align]]):c.align="none"):(c.align=b.getStyle("float")||"none",b.removeStyle("float")));a.plugins.link&&this.parts.link&&(c.link=d.getLinkAttributesParser()(a,this.parts.link),(b=c.link.advanced)&&b.advCSSClasses&&(b.advCSSClasses=CKEDITOR.tools.trim(b.advCSSClasses.replace(/cke_\S+/,""))));this.wrapper[(c.hasCaption?
-"remove":"add")+"Class"]("cke_image_nocaption");this.setData(c);a.filter.checkFeature(this.features.dimension)&&!0!==a.config.image2_disableResizer&&G(this);this.shiftState=d.stateShifter(this.editor);this.on("contextMenu",function(a){a.data.image=CKEDITOR.TRISTATE_OFF;if(this.parts.link||this.wrapper.getAscendant("a"))a.data.link=a.data.unlink=CKEDITOR.TRISTATE_OFF});this.on("dialog",function(a){a.data.widget=this},this)},addClass:function(a){m(this).addClass(a)},hasClass:function(a){return m(this).hasClass(a)},
-removeClass:function(a){m(this).removeClass(a)},getClasses:function(){var a=new RegExp("^("+[].concat(f,g).join("|")+")$");return function(){var b=this.repository.parseElementClasses(m(this).getAttribute("class")),c;for(c in b)a.test(c)&&delete b[c];return b}}(),upcast:H(a),downcast:I(a),getLabel:function(){return this.editor.lang.widget.label.replace(/%1/,(this.data.alt||"")+" "+this.pathName)}}}function H(a){var b=n(a),c=a.config.image2_captionedClass;return function(a,f){var d={width:1,height:1},
-e=a.name,h;if(!a.attributes["data-cke-realelement"]&&(b(a)?("div"==e&&(h=a.getFirst("figure"))&&(a.replaceWith(h),a=h),f.align="center",h=a.getFirst("img")||a.getFirst("a").getFirst("img")):"figure"==e&&a.hasClass(c)?h=a.getFirst("img")||a.getFirst("a").getFirst("img"):r(a)&&(h="a"==a.name?a.children[0]:a),h)){for(var C in d)(d=h.attributes[C])&&d.match(J)&&delete h.attributes[C];return a}}}function I(a){var b=a.config.image2_alignClasses;return function(a){var g="a"==a.name?a.getFirst():a,f=g.attributes,
-d=this.data.align;if(!this.inline){var e=a.getFirst("span");e&&e.replaceWith(e.getFirst({img:1,a:1}))}d&&"none"!=d&&(e=CKEDITOR.tools.parseCssText(f.style||""),"center"==d&&"figure"==a.name?a=a.wrapWith(new CKEDITOR.htmlParser.element("div",b?{"class":b[1]}:{style:"text-align:center"})):d in{left:1,right:1}&&(b?g.addClass(b[q[d]]):e["float"]=d),b||CKEDITOR.tools.isEmpty(e)||(f.style=CKEDITOR.tools.writeCssText(e)));return a}}function n(a){var b=a.config.image2_captionedClass,c=a.config.image2_alignClasses,
-g={figure:1,a:1,img:1};return function(f){if(!(f.name in{div:1,p:1}))return!1;var d=f.children;if(1!==d.length)return!1;d=d[0];if(!(d.name in g))return!1;if("p"==f.name){if(!r(d))return!1}else if("figure"==d.name){if(!d.hasClass(b))return!1}else if(a.enterMode==CKEDITOR.ENTER_P||!r(d))return!1;return(c?f.hasClass(c[1]):"center"==CKEDITOR.tools.parseCssText(f.attributes.style||"",!0)["text-align"])?!0:!1}}function r(a){return"img"==a.name?!0:"a"==a.name?1==a.children.length&&a.getFirst("img"):!1}function G(a){var b=
-a.editor,c=b.editable(),g=b.document,f=a.resizer=g.createElement("span");f.addClass("cke_image_resizer");f.setAttribute("title",b.lang.image2.resizer);f.append(new CKEDITOR.dom.text("​",g));if(a.inline)a.wrapper.append(f);else{var d=a.parts.link||a.parts.image,e=d.getParent(),h=g.createElement("span");h.addClass("cke_image_resizer_wrapper");h.append(d);h.append(f);a.element.append(h,!0);e.is("span")&&e.remove()}f.on("mousedown",function(d){function l(a,b,d){var l=CKEDITOR.document,c=[];g.equals(l)||
-c.push(l.on(a,b));c.push(g.on(a,b));if(d)for(a=c.length;a--;)d.push(c.pop())}function e(){t=m+A*x;u=Math.round(t/v)}function w(){u=q-p;t=Math.round(u*v)}var h=a.parts.image,A="right"==a.data.align?-1:1,k=d.data.$.screenX,K=d.data.$.screenY,m=h.$.clientWidth,q=h.$.clientHeight,v=m/q,n=[],r="cke_image_s"+(~A?"e":"w"),B,t,u,z,x,p,y;b.fire("saveSnapshot");l("mousemove",function(a){B=a.data.$;x=B.screenX-k;p=K-B.screenY;y=Math.abs(x/p);1==A?0>=x?0>=p?e():y>=v?e():w():0>=p?y>=v?w():e():w():0>=x?0>=p?y>=
-v?w():e():w():0>=p?e():y>=v?e():w();15<=t&&15<=u?(h.setAttributes({width:t,height:u}),z=!0):z=!1},n);l("mouseup",function(){for(var d;d=n.pop();)d.removeListener();c.removeClass(r);f.removeClass("cke_image_resizing");z&&(a.setData({width:t,height:u}),b.fire("saveSnapshot"));z=!1},n);c.addClass(r);f.addClass("cke_image_resizing")});a.on("data",function(){f["right"==a.data.align?"addClass":"removeClass"]("cke_image_resizer_left")})}function L(a){var b=[],c;return function(g){var f=a.getCommand("justify"+
-g);if(f){b.push(function(){f.refresh(a,a.elementPath())});if(g in{right:1,left:1,center:1})f.on("exec",function(d){var c=k(a);if(c){c.setData("align",g);for(c=b.length;c--;)b[c]();d.cancel()}});f.on("refresh",function(b){var f=k(a),h={right:1,left:1,center:1};f&&(void 0===c&&(c=a.filter.checkFeature(a.widgets.registered.image.features.align)),c?this.setState(f.data.align==g?CKEDITOR.TRISTATE_ON:g in h?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED):this.setState(CKEDITOR.TRISTATE_DISABLED),b.cancel())})}}}
-function M(a){a.plugins.link&&(CKEDITOR.on("dialogDefinition",function(b){b=b.data;if("link"==b.name){b=b.definition;var c=b.onShow,g=b.onOk;b.onShow=function(){var b=k(a),d=this.getContentElement("info","linkDisplayText").getElement().getParent().getParent();b&&(b.inline?!b.wrapper.getAscendant("a"):1)?(this.setupContent(b.data.link||{}),d.hide()):(d.show(),c.apply(this,arguments))};b.onOk=function(){var b=k(a);if(b&&(b.inline?!b.wrapper.getAscendant("a"):1)){var c={};this.commitContent(c);b.setData("link",
-c)}else g.apply(this,arguments)}}}),a.getCommand("unlink").on("exec",function(b){var c=k(a);c&&c.parts.link&&(c.setData("link",null),this.refresh(a,a.elementPath()),b.cancel())}),a.getCommand("unlink").on("refresh",function(b){var c=k(a);c&&(this.setState(c.data.link||c.wrapper.getAscendant("a")?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),b.cancel())}))}function k(a){return(a=a.widgets.focused)&&"image"==a.name?a:null}function E(a){var b=a.config.image2_alignClasses;a={div:{match:n(a)},p:{match:n(a)},
-img:{attributes:"!src,alt,width,height"},figure:{classes:"!"+a.config.image2_captionedClass},figcaption:!0};b?(a.div.classes=b[1],a.p.classes=a.div.classes,a.img.classes=b[0]+","+b[2],a.figure.classes+=","+a.img.classes):(a.div.styles="text-align",a.p.styles="text-align",a.img.styles="float",a.figure.styles="float,display");return a}function F(a){a=a.config.image2_alignClasses;return{dimension:{requiredContent:"img[width,height]"},align:{requiredContent:"img"+(a?"("+a[0]+")":"{float}")},caption:{requiredContent:"figcaption"}}}
-function m(a){return a.data.hasCaption?a.element:a.parts.image}var N=new CKEDITOR.template('\x3cfigure class\x3d"{captionedClass}"\x3e\x3cimg alt\x3d"" src\x3d"" /\x3e\x3cfigcaption\x3e{captionPlaceholder}\x3c/figcaption\x3e\x3c/figure\x3e'),q={left:0,center:1,right:2},J=/^\s*(\d+\%)\s*$/i;CKEDITOR.plugins.add("image2",{lang:"af,ar,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn",
-requires:"widget,dialog",icons:"image",hidpi:!0,onLoad:function(){CKEDITOR.addCss(".cke_image_nocaption{line-height:0}.cke_editable.cke_image_sw, .cke_editable.cke_image_sw *{cursor:sw-resize !important}.cke_editable.cke_image_se, .cke_editable.cke_image_se *{cursor:se-resize !important}.cke_image_resizer{display:none;position:absolute;width:10px;height:10px;bottom:-5px;right:-5px;background:#000;outline:1px solid #fff;line-height:0;cursor:se-resize;}.cke_image_resizer_wrapper{position:relative;display:inline-block;line-height:0;}.cke_image_resizer.cke_image_resizer_left{right:auto;left:-5px;cursor:sw-resize;}.cke_widget_wrapper:hover .cke_image_resizer,.cke_image_resizer.cke_image_resizing{display:block}.cke_widget_wrapper\x3ea{display:inline-block}")},
-init:function(a){var b=a.config,c=a.lang.image2,g=D(a);b.filebrowserImage2BrowseUrl=b.filebrowserImageBrowseUrl;b.filebrowserImage2UploadUrl=b.filebrowserImageUploadUrl;g.pathName=c.pathName;g.editables.caption.pathName=c.pathNameCaption;a.widgets.add("image",g);a.ui.addButton&&a.ui.addButton("Image",{label:a.lang.common.image,command:"image",toolbar:"insert,10"});a.contextMenu&&(a.addMenuGroup("image",10),a.addMenuItem("image",{label:c.menu,command:"image",group:"image"}));CKEDITOR.dialog.add("image2",
-this.path+"dialogs/image2.js")},afterInit:function(a){var b={left:1,right:1,center:1,block:1},c=L(a),g;for(g in b)c(g);M(a)}});CKEDITOR.plugins.image2={stateShifter:function(a){function b(a,b){var d={};f?d.attributes={"class":f[1]}:d.styles={"text-align":"center"};d=g.createElement(a.activeEnterMode==CKEDITOR.ENTER_P?"p":"div",d);c(d,b);b.move(d);return d}function c(b,d){if(d.getParent()){var c=a.createRange();c.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d.remove();e.insertElementIntoRange(b,
-c)}else b.replace(d)}var g=a.document,f=a.config.image2_alignClasses,d=a.config.image2_captionedClass,e=a.editable(),h=["hasCaption","align","link"],k={align:function(d,c,g){var e=d.element;d.changed.align?d.newData.hasCaption||("center"==g&&(d.deflate(),d.element=b(a,e)),d.changed.hasCaption||"center"!=c||"center"==g||(d.deflate(),c=e.findOne("a,img"),c.replace(e),d.element=c)):"center"==g&&d.changed.hasCaption&&!d.newData.hasCaption&&(d.deflate(),d.element=b(a,e));!f&&e.is("figure")&&("center"==
-g?e.setStyle("display","inline-block"):e.removeStyle("display"))},hasCaption:function(b,e,f){b.changed.hasCaption&&(e=b.element.is({img:1,a:1})?b.element:b.element.findOne("a,img"),b.deflate(),f?(f=CKEDITOR.dom.element.createFromHtml(N.output({captionedClass:d,captionPlaceholder:a.lang.image2.captionPlaceholder}),g),c(f,b.element),e.replace(f.findOne("img")),b.element=f):(e.replace(b.element),b.element=e))},link:function(b,d,c){if(b.changed.link){var e=b.element.is("img")?b.element:b.element.findOne("img"),
-f=b.element.is("a")?b.element:b.element.findOne("a"),h=b.element.is("a")&&!c||b.element.is("img")&&c,k;h&&b.deflate();c?(d||(k=g.createElement("a",{attributes:{href:b.newData.link.url}}),k.replace(e),e.move(k)),c=CKEDITOR.plugins.image2.getLinkAttributesGetter()(a,c),CKEDITOR.tools.isEmpty(c.set)||(k||f).setAttributes(c.set),c.removed.length&&(k||f).removeAttributes(c.removed)):(c=f.findOne("img"),c.replace(f),k=c);h&&(b.element=k)}}};return function(a){var b,c;a.changed={};for(c=0;c<h.length;c++)b=
-h[c],a.changed[b]=a.oldData?a.oldData[b]!==a.newData[b]:!1;for(c=0;c<h.length;c++)b=h[c],k[b](a,a.oldData?a.oldData[b]:null,a.newData[b]);a.inflate()}},checkHasNaturalRatio:function(a){var b=a.$;a=this.getNatural(a);return Math.round(b.clientWidth/a.width*a.height)==b.clientHeight||Math.round(b.clientHeight/a.height*a.width)==b.clientWidth},getNatural:function(a){if(a.$.naturalWidth)a={width:a.$.naturalWidth,height:a.$.naturalHeight};else{var b=new Image;b.src=a.getAttribute("src");a={width:b.width,
-height:b.height}}return a},getLinkAttributesGetter:function(){return CKEDITOR.plugins.link.getLinkAttributes},getLinkAttributesParser:function(){return CKEDITOR.plugins.link.parseLinkAttributes}}})();CKEDITOR.config.image2_captionedClass="image";
+/**
+ * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+'use strict';
+
+( function() {
+
+    var template = '<img alt="" src="" />',
+        templateBlock = new CKEDITOR.template(
+            '<figure class="{captionedClass}">' +
+            template +
+            '<figcaption>{captionPlaceholder}</figcaption>' +
+            '</figure>' ),
+        alignmentsObj = { left: 0, center: 1, right: 2 },
+        regexPercent = /^\s*(\d+\%)\s*$/i;
+
+    CKEDITOR.plugins.add( 'image2', {
+        // jscs:disable maximumLineLength
+        lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%
+        // jscs:enable maximumLineLength
+        requires: 'widget,dialog',
+        icons: 'image',
+        hidpi: true,
+
+        onLoad: function() {
+            CKEDITOR.addCss(
+                '.cke_image_nocaption{' +
+                // This is to remove unwanted space so resize
+                // wrapper is displayed property.
+                'line-height:0' +
+                '}' +
+                '.cke_editable.cke_image_sw, .cke_editable.cke_image_sw *{cursor:sw-resize !important}' +
+                '.cke_editable.cke_image_se, .cke_editable.cke_image_se *{cursor:se-resize !important}' +
+                '.cke_image_resizer{' +
+                'display:none;' +
+                'position:absolute;' +
+                'width:10px;' +
+                'height:10px;' +
+                'bottom:-5px;' +
+                'right:-5px;' +
+                'background:#000;' +
+                'outline:1px solid #fff;' +
+                // Prevent drag handler from being misplaced (#11207).
+                'line-height:0;' +
+                'cursor:se-resize;' +
+                '}' +
+                '.cke_image_resizer_wrapper{' +
+                'position:relative;' +
+                'display:inline-block;' +
+                'line-height:0;' +
+                '}' +
+                // Bottom-left corner style of the resizer.
+                '.cke_image_resizer.cke_image_resizer_left{' +
+                'right:auto;' +
+                'left:-5px;' +
+                'cursor:sw-resize;' +
+                '}' +
+                '.cke_widget_wrapper:hover .cke_image_resizer,' +
+                '.cke_image_resizer.cke_image_resizing{' +
+                'display:block' +
+                '}' +
+                // Expand widget wrapper when linked inline image.
+                '.cke_widget_wrapper>a{' +
+                'display:inline-block' +
+                '}' );
+        },
+
+        init: function( editor ) {
+            // Adapts configuration from original image plugin. Should be removed
+            // when we'll rename image2 to image.
+            var config = editor.config,
+                lang = editor.lang.image2,
+                image = widgetDef( editor );
+
+            // Since filebrowser plugin discovers config properties by dialog (plugin?)
+            // names (sic!), this hack will be necessary as long as Image2 is not named
+            // Image. And since Image2 will never be Image, for sure some filebrowser logic
+            // got to be refined.
+            config.filebrowserImage2BrowseUrl = config.filebrowserImageBrowseUrl;
+            config.filebrowserImage2UploadUrl = config.filebrowserImageUploadUrl;
+
+            // Add custom elementspath names to widget definition.
+            image.pathName = lang.pathName;
+            image.editables.caption.pathName = lang.pathNameCaption;
+
+            // Register the widget.
+            editor.widgets.add( 'image', image );
+
+            // Add toolbar button for this plugin.
+            editor.ui.addButton && editor.ui.addButton( 'Image', {
+                label: editor.lang.common.image,
+                command: 'image',
+                toolbar: 'insert,10'
+            } );
+
+            // Register context menu option for editing widget.
+            if ( editor.contextMenu ) {
+                editor.addMenuGroup( 'image', 10 );
+
+                editor.addMenuItem( 'image', {
+                    label: lang.menu,
+                    command: 'image',
+                    group: 'image'
+                } );
+            }
+
+            CKEDITOR.dialog.add( 'image2', this.path + 'dialogs/image2.js' );
+        },
+
+        afterInit: function( editor ) {
+            // Integrate with align commands (justify plugin).
+            var align = { left: 1, right: 1, center: 1, block: 1 },
+                integrate = alignCommandIntegrator( editor );
+
+            for ( var value in align )
+                integrate( value );
+
+            // Integrate with link commands (link plugin).
+            linkCommandIntegrator( editor );
+        }
+    } );
+
+    // Wiget states (forms) depending on alignment and configuration.
+    //
+    // Non-captioned widget (inline styles)
+    // 		┌──────┬───────────────────────────────┬─────────────────────────────┐
+    // 		│Align │Internal form                  │Data                         │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│none  │<wrapper>                      │<img />                      │
+    // 		│      │ <img />                       │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│left  │<wrapper style=”float:left”>   │<img style=”float:left” />   │
+    // 		│      │ <img />                       │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│center│<wrapper>                      │<p style=”text-align:center”>│
+    // 		│      │ <p style=”text-align:center”> │  <img />                    │
+    // 		│      │   <img />                     │</p>                         │
+    // 		│      │ </p>                          │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│right │<wrapper style=”float:right”>  │<img style=”float:right” />  │
+    // 		│      │ <img />                       │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		└──────┴───────────────────────────────┴─────────────────────────────┘
+    //
+    // Non-captioned widget (config.image2_alignClasses defined)
+    // 		┌──────┬───────────────────────────────┬─────────────────────────────┐
+    // 		│Align │Internal form                  │Data                         │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│none  │<wrapper>                      │<img />                      │
+    // 		│      │ <img />                       │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│left  │<wrapper class=”left”>         │<img class=”left” />         │
+    // 		│      │ <img />                       │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│center│<wrapper>                      │<p class=”center”>           │
+    // 		│      │ <p class=”center”>            │ <img />                     │
+    // 		│      │   <img />                     │</p>                         │
+    // 		│      │ </p>                          │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		├──────┼───────────────────────────────┼─────────────────────────────┤
+    // 		│right │<wrapper class=”right”>        │<img class=”right” />        │
+    // 		│      │ <img />                       │                             │
+    // 		│      │</wrapper>                     │                             │
+    // 		└──────┴───────────────────────────────┴─────────────────────────────┘
+    //
+    // Captioned widget (inline styles)
+    // 		┌──────┬────────────────────────────────────────┬────────────────────────────────────────┐
+    // 		│Align │Internal form                           │Data                                    │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│none  │<wrapper>                               │<figure />                              │
+    // 		│      │ <figure />                             │                                        │
+    // 		│      │</wrapper>                              │                                        │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│left  │<wrapper style=”float:left”>            │<figure style=”float:left” />           │
+    // 		│      │ <figure />                             │                                        │
+    // 		│      │</wrapper>                              │                                        │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│center│<wrapper style=”text-align:center”>     │<div style=”text-align:center”>         │
+    // 		│      │ <figure style=”display:inline-block” />│ <figure style=”display:inline-block” />│
+    // 		│      │</wrapper>                              │</p>                                    │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│right │<wrapper style=”float:right”>           │<figure style=”float:right” />          │
+    // 		│      │ <figure />                             │                                        │
+    // 		│      │</wrapper>                              │                                        │
+    // 		└──────┴────────────────────────────────────────┴────────────────────────────────────────┘
+    //
+    // Captioned widget (config.image2_alignClasses defined)
+    // 		┌──────┬────────────────────────────────────────┬────────────────────────────────────────┐
+    // 		│Align │Internal form                           │Data                                    │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│none  │<wrapper>                               │<figure />                              │
+    // 		│      │ <figure />                             │                                        │
+    // 		│      │</wrapper>                              │                                        │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│left  │<wrapper class=”left”>                  │<figure class=”left” />                 │
+    // 		│      │ <figure />                             │                                        │
+    // 		│      │</wrapper>                              │                                        │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│center│<wrapper class=”center”>                │<div class=”center”>                    │
+    // 		│      │ <figure />                             │ <figure />                             │
+    // 		│      │</wrapper>                              │</p>                                    │
+    // 		├──────┼────────────────────────────────────────┼────────────────────────────────────────┤
+    // 		│right │<wrapper class=”right”>                 │<figure class=”right” />                │
+    // 		│      │ <figure />                             │                                        │
+    // 		│      │</wrapper>                              │                                        │
+    // 		└──────┴────────────────────────────────────────┴────────────────────────────────────────┘
+    //
+    // @param {CKEDITOR.editor}
+    // @returns {Object}
+    function widgetDef( editor ) {
+        var alignClasses = editor.config.image2_alignClasses,
+            captionedClass = editor.config.image2_captionedClass;
+
+        function deflate() {
+            if ( this.deflated )
+                return;
+
+            // Remember whether widget was focused before destroyed.
+            if ( editor.widgets.focused == this.widget )
+                this.focused = true;
+
+            editor.widgets.destroy( this.widget );
+
+            // Mark widget was destroyed.
+            this.deflated = true;
+        }
+
+        function inflate() {
+            var editable = editor.editable(),
+                doc = editor.document;
+
+            // Create a new widget. This widget will be either captioned
+            // non-captioned, block or inline according to what is the
+            // new state of the widget.
+            if ( this.deflated ) {
+                this.widget = editor.widgets.initOn( this.element, 'image', this.widget.data );
+
+                // Once widget was re-created, it may become an inline element without
+                // block wrapper (i.e. when unaligned, end not captioned). Let's do some
+                // sort of autoparagraphing here (#10853).
+                if ( this.widget.inline && !( new CKEDITOR.dom.elementPath( this.widget.wrapper, editable ).block ) ) {
+                    var block = doc.createElement( editor.activeEnterMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
+                    block.replace( this.widget.wrapper );
+                    this.widget.wrapper.move( block );
+                }
+
+                // The focus must be transferred from the old one (destroyed)
+                // to the new one (just created).
+                if ( this.focused ) {
+                    this.widget.focus();
+                    delete this.focused;
+                }
+
+                delete this.deflated;
+            }
+
+            // If now widget was destroyed just update wrapper's alignment.
+            // According to the new state.
+            else {
+                setWrapperAlign( this.widget, alignClasses );
+            }
+        }
+
+        return {
+            allowedContent: getWidgetAllowedContent( editor ),
+
+            requiredContent: 'img[src,alt]',
+
+            features: getWidgetFeatures( editor ),
+
+            styleableElements: 'img figure',
+
+            // This widget converts style-driven dimensions to attributes.
+            contentTransformations: [
+                [ 'img[width]: sizeToAttribute' ]
+            ],
+
+            // This widget has an editable caption.
+            editables: {
+                caption: {
+                    selector: 'figcaption',
+                    allowedContent: 'br em strong sub sup u s; a[!href,target]'
+                }
+            },
+
+            parts: {
+                image: 'img',
+                caption: 'figcaption'
+                // parts#link defined in widget#init
+            },
+
+            // The name of this widget's dialog.
+            dialog: 'image2',
+
+            // Template of the widget: plain image.
+            template: template,
+
+            data: function() {
+                var features = this.features;
+
+                // Image can't be captioned when figcaption is disallowed (#11004).
+                if ( this.data.hasCaption && !editor.filter.checkFeature( features.caption ) )
+                    this.data.hasCaption = false;
+
+                // Image can't be aligned when floating is disallowed (#11004).
+                if ( this.data.align != 'none' && !editor.filter.checkFeature( features.align ) )
+                    this.data.align = 'none';
+
+                // Convert the internal form of the widget from the old state to the new one.
+                this.shiftState( {
+                    widget: this,
+                    element: this.element,
+                    oldData: this.oldData,
+                    newData: this.data,
+                    deflate: deflate,
+                    inflate: inflate
+                } );
+
+                // Update widget.parts.link since it will not auto-update unless widget
+                // is destroyed and re-inited.
+                if ( !this.data.link ) {
+                    if ( this.parts.link )
+                        delete this.parts.link;
+                } else {
+                    if ( !this.parts.link )
+                        this.parts.link = this.parts.image.getParent();
+                }
+
+                this.parts.image.setAttributes( {
+                    src: this.data.src,
+                    class: this.data.isResponsive ? 'img-responsive' : '',
+
+                    // This internal is required by the editor.
+                    'data-cke-saved-src': this.data.src,
+
+                    alt: this.data.alt
+                } );
+
+                // If shifting non-captioned -> captioned, remove classes
+                // related to styles from <img/>.
+                if ( this.oldData && !this.oldData.hasCaption && this.data.hasCaption ) {
+                    for ( var c in this.data.classes )
+                        this.parts.image.removeClass( c );
+                }
+
+                // Set dimensions of the image according to gathered data.
+                // Do it only when the attributes are allowed (#11004).
+                if ( editor.filter.checkFeature( features.dimension ) )
+                    setDimensions( this );
+
+                // Cache current data.
+                this.oldData = CKEDITOR.tools.extend( {}, this.data );
+            },
+
+            init: function() {
+                var helpers = CKEDITOR.plugins.image2,
+                    image = this.parts.image,
+                    data = {
+                        hasCaption: !!this.parts.caption,
+                        src: image.getAttribute( 'src' ),
+                        alt: image.getAttribute( 'alt' ) || '',
+                        width: image.getAttribute( 'width' ) || '',
+                        height: image.getAttribute( 'height' ) || '',
+                        isResponsive: !!image.$.className.match(/img-responsive/i),
+
+                        // Lock ratio is on by default (#10833).
+                        lock: this.ready ? helpers.checkHasNaturalRatio( image ) : true
+                    };
+
+                // If we used 'a' in widget#parts definition, it could happen that
+                // selected element is a child of widget.parts#caption. Since there's no clever
+                // way to solve it with CSS selectors, it's done like that. (#11783).
+                var link = image.getAscendant( 'a' );
+
+                if ( link && this.wrapper.contains( link ) )
+                    this.parts.link = link;
+
+                // Depending on configuration, read style/class from element and
+                // then remove it. Removed style/class will be set on wrapper in #data listener.
+                // Note: Center alignment is detected during upcast, so only left/right cases
+                // are checked below.
+                if ( !data.align ) {
+                    var alignElement = data.hasCaption ? this.element : image;
+
+                    // Read the initial left/right alignment from the class set on element.
+                    if ( alignClasses ) {
+                        if ( alignElement.hasClass( alignClasses[ 0 ] ) ) {
+                            data.align = 'left';
+                        } else if ( alignElement.hasClass( alignClasses[ 2 ] ) ) {
+                            data.align = 'right';
+                        }
+
+                        if ( data.align ) {
+                            alignElement.removeClass( alignClasses[ alignmentsObj[ data.align ] ] );
+                        } else {
+                            data.align = 'none';
+                        }
+                    }
+                    // Read initial float style from figure/image and then remove it.
+                    else {
+                        data.align = alignElement.getStyle( 'float' ) || 'none';
+                        alignElement.removeStyle( 'float' );
+                    }
+                }
+
+                // Update data.link object with attributes if the link has been discovered.
+                if ( editor.plugins.link && this.parts.link ) {
+                    data.link = helpers.getLinkAttributesParser()( editor, this.parts.link );
+
+                    // Get rid of cke_widget_* classes in data. Otherwise
+                    // they might appear in link dialog.
+                    var advanced = data.link.advanced;
+                    if ( advanced && advanced.advCSSClasses ) {
+                        advanced.advCSSClasses = CKEDITOR.tools.trim( advanced.advCSSClasses.replace( /cke_\S+/, '' ) );
+                    }
+                }
+
+                // Get rid of extra vertical space when there's no caption.
+                // It will improve the look of the resizer.
+                this.wrapper[ ( data.hasCaption ? 'remove' : 'add' ) + 'Class' ]( 'cke_image_nocaption' );
+
+                this.setData( data );
+
+                // Setup dynamic image resizing with mouse.
+                // Don't initialize resizer when dimensions are disallowed (#11004).
+                if ( editor.filter.checkFeature( this.features.dimension ) && editor.config.image2_disableResizer !== true )
+                    setupResizer( this );
+
+                this.shiftState = helpers.stateShifter( this.editor );
+
+                // Add widget editing option to its context menu.
+                this.on( 'contextMenu', function( evt ) {
+                    evt.data.image = CKEDITOR.TRISTATE_OFF;
+
+                    // Integrate context menu items for link.
+                    // Note that widget may be wrapped in a link, which
+                    // does not belong to that widget (#11814).
+                    if ( this.parts.link || this.wrapper.getAscendant( 'a' ) )
+                        evt.data.link = evt.data.unlink = CKEDITOR.TRISTATE_OFF;
+                } );
+
+                // Pass the reference to this widget to the dialog.
+                this.on( 'dialog', function( evt ) {
+                    evt.data.widget = this;
+                }, this );
+            },
+
+            // Overrides default method to handle internal mutability of Image2.
+            // @see CKEDITOR.plugins.widget#addClass
+            addClass: function( className ) {
+                getStyleableElement( this ).addClass( className );
+            },
+
+            // Overrides default method to handle internal mutability of Image2.
+            // @see CKEDITOR.plugins.widget#hasClass
+            hasClass: function( className ) {
+                return getStyleableElement( this ).hasClass( className );
+            },
+
+            // Overrides default method to handle internal mutability of Image2.
+            // @see CKEDITOR.plugins.widget#removeClass
+            removeClass: function( className ) {
+                getStyleableElement( this ).removeClass( className );
+            },
+
+            // Overrides default method to handle internal mutability of Image2.
+            // @see CKEDITOR.plugins.widget#getClasses
+            getClasses: ( function() {
+                var classRegex = new RegExp( '^(' + [].concat( captionedClass, alignClasses ).join( '|' ) + ')$' );
+
+                return function() {
+                    var classes = this.repository.parseElementClasses( getStyleableElement( this ).getAttribute( 'class' ) );
+
+                    // Neither config.image2_captionedClass nor config.image2_alignClasses
+                    // do not belong to style classes.
+                    for ( var c in classes ) {
+                        if ( classRegex.test( c ) )
+                            delete classes[ c ];
+                    }
+
+                    return classes;
+                };
+            } )(),
+
+            upcast: upcastWidgetElement( editor ),
+            downcast: downcastWidgetElement( editor ),
+
+            getLabel: function() {
+                var label = ( this.data.alt || '' ) + ' ' + this.pathName;
+
+                return this.editor.lang.widget.label.replace( /%1/, label );
+            }
+        };
+    }
+
+    /**
+     * A set of Enhanced Image (image2) plugin helpers.
+     *
+     * @class
+     * @singleton
+     */
+    CKEDITOR.plugins.image2 = {
+        stateShifter: function( editor ) {
+            // Tag name used for centering non-captioned widgets.
+            var doc = editor.document,
+                alignClasses = editor.config.image2_alignClasses,
+                captionedClass = editor.config.image2_captionedClass,
+                editable = editor.editable(),
+
+                // The order that stateActions get executed. It matters!
+                shiftables = [ 'hasCaption', 'align', 'link' ];
+
+            // Atomic procedures, one per state variable.
+            var stateActions = {
+                align: function( shift, oldValue, newValue ) {
+                    var el = shift.element;
+
+                    // Alignment changed.
+                    if ( shift.changed.align ) {
+                        // No caption in the new state.
+                        if ( !shift.newData.hasCaption ) {
+                            // Changed to "center" (non-captioned).
+                            if ( newValue == 'center' ) {
+                                shift.deflate();
+                                shift.element = wrapInCentering( editor, el );
+                            }
+
+                            // Changed to "non-center" from "center" while caption removed.
+                            if ( !shift.changed.hasCaption && oldValue == 'center' && newValue != 'center' ) {
+                                shift.deflate();
+                                shift.element = unwrapFromCentering( el );
+                            }
+                        }
+                    }
+
+                    // Alignment remains and "center" removed caption.
+                    else if ( newValue == 'center' && shift.changed.hasCaption && !shift.newData.hasCaption ) {
+                        shift.deflate();
+                        shift.element = wrapInCentering( editor, el );
+                    }
+
+                    // Finally set display for figure.
+                    if ( !alignClasses && el.is( 'figure' ) ) {
+                        if ( newValue == 'center' )
+                            el.setStyle( 'display', 'inline-block' );
+                        else
+                            el.removeStyle( 'display' );
+                    }
+                },
+
+                isResponsive: function (shift, oldValue, newValue) {
+                    if (!shift.changed.isResponsive) {
+                        return;
+                    }
+
+                    console.log(oldValue, newValue);
+
+                    var image = shift.element.find('img');
+                },
+
+                hasCaption:	function( shift, oldValue, newValue ) {
+                    // This action is for real state change only.
+                    if ( !shift.changed.hasCaption )
+                        return;
+
+                    // Get <img/> or <a><img/></a> from widget. Note that widget element might itself
+                    // be what we're looking for. Also element can be <p style="text-align:center"><a>...</a></p>.
+                    var imageOrLink;
+                    if ( shift.element.is( { img: 1, a: 1 } ) )
+                        imageOrLink = shift.element;
+                    else
+                        imageOrLink =  shift.element.findOne( 'a,img' );
+
+                    // Switching hasCaption always destroys the widget.
+                    shift.deflate();
+
+                    // There was no caption, but the caption is to be added.
+                    if ( newValue ) {
+                        // Create new <figure> from widget template.
+                        var figure = CKEDITOR.dom.element.createFromHtml( templateBlock.output( {
+                            captionedClass: captionedClass,
+                            captionPlaceholder: editor.lang.image2.captionPlaceholder
+                        } ), doc );
+
+                        // Replace element with <figure>.
+                        replaceSafely( figure, shift.element );
+
+                        // Use old <img/> or <a><img/></a> instead of the one from the template,
+                        // so we won't lose additional attributes.
+                        imageOrLink.replace( figure.findOne( 'img' ) );
+
+                        // Update widget's element.
+                        shift.element = figure;
+                    }
+
+                    // The caption was present, but now it's to be removed.
+                    else {
+                        // Unwrap <img/> or <a><img/></a> from figure.
+                        imageOrLink.replace( shift.element );
+
+                        // Update widget's element.
+                        shift.element = imageOrLink;
+                    }
+                },
+
+                link: function( shift, oldValue, newValue ) {
+                    if ( shift.changed.link ) {
+                        var img = shift.element.is( 'img' ) ?
+                                shift.element : shift.element.findOne( 'img' ),
+                            link = shift.element.is( 'a' ) ?
+                                shift.element : shift.element.findOne( 'a' ),
+                            // Why deflate:
+                            // If element is <img/>, it will be wrapped into <a>,
+                            // which becomes a new widget.element.
+                            // If element is <a><img/></a>, it will be unlinked
+                            // so <img/> becomes a new widget.element.
+                            needsDeflate = ( shift.element.is( 'a' ) && !newValue ) || ( shift.element.is( 'img' ) && newValue ),
+                            newEl;
+
+                        if ( needsDeflate )
+                            shift.deflate();
+
+                        // If unlinked the image, returned element is <img>.
+                        if ( !newValue )
+                            newEl = unwrapFromLink( link );
+                        else {
+                            // If linked the image, returned element is <a>.
+                            if ( !oldValue )
+                                newEl = wrapInLink( img, shift.newData.link );
+
+                            // Set and remove all attributes associated with this state.
+                            var attributes = CKEDITOR.plugins.image2.getLinkAttributesGetter()( editor, newValue );
+
+                            if ( !CKEDITOR.tools.isEmpty( attributes.set ) )
+                                ( newEl || link ).setAttributes( attributes.set );
+
+                            if ( attributes.removed.length )
+                                ( newEl || link ).removeAttributes( attributes.removed );
+                        }
+
+                        if ( needsDeflate )
+                            shift.element = newEl;
+                    }
+                }
+            };
+
+            function wrapInCentering( editor, element ) {
+                var attribsAndStyles = {};
+
+                if ( alignClasses )
+                    attribsAndStyles.attributes = { 'class': alignClasses[ 1 ] };
+                else
+                    attribsAndStyles.styles = { 'text-align': 'center' };
+
+                // There's no gentle way to center inline element with CSS, so create p/div
+                // that wraps widget contents and does the trick either with style or class.
+                var center = doc.createElement(
+                    editor.activeEnterMode == CKEDITOR.ENTER_P ? 'p' : 'div', attribsAndStyles );
+
+                // Replace element with centering wrapper.
+                replaceSafely( center, element );
+                element.move( center );
+
+                return center;
+            }
+
+            function unwrapFromCentering( element ) {
+                var imageOrLink = element.findOne( 'a,img' );
+
+                imageOrLink.replace( element );
+
+                return imageOrLink;
+            }
+
+            // Wraps <img/> -> <a><img/></a>.
+            // Returns reference to <a>.
+            //
+            // @param {CKEDITOR.dom.element} img
+            // @param {Object} linkData
+            // @returns {CKEDITOR.dom.element}
+            function wrapInLink( img, linkData ) {
+                var link = doc.createElement( 'a', {
+                    attributes: {
+                        href: linkData.url
+                    }
+                } );
+
+                link.replace( img );
+                img.move( link );
+
+                return link;
+            }
+
+            // De-wraps <a><img/></a> -> <img/>.
+            // Returns the reference to <img/>
+            //
+            // @param {CKEDITOR.dom.element} link
+            // @returns {CKEDITOR.dom.element}
+            function unwrapFromLink( link ) {
+                var img = link.findOne( 'img' );
+
+                img.replace( link );
+
+                return img;
+            }
+
+            function replaceSafely( replacing, replaced ) {
+                if ( replaced.getParent() ) {
+                    var range = editor.createRange();
+
+                    range.moveToPosition( replaced, CKEDITOR.POSITION_BEFORE_START );
+
+                    // Remove old element. Do it before insertion to avoid a case when
+                    // element is moved from 'replaced' element before it, what creates
+                    // a tricky case which insertElementIntorRange does not handle.
+                    replaced.remove();
+
+                    editable.insertElementIntoRange( replacing, range );
+                }
+                else {
+                    replacing.replace( replaced );
+                }
+            }
+
+            return function( shift ) {
+                var name, i;
+
+                shift.changed = {};
+
+                for ( i = 0; i < shiftables.length; i++ ) {
+                    name = shiftables[ i ];
+
+                    shift.changed[ name ] = shift.oldData ?
+                    shift.oldData[ name ] !== shift.newData[ name ] : false;
+                }
+
+                // Iterate over possible state variables.
+                for ( i = 0; i < shiftables.length; i++ ) {
+                    name = shiftables[ i ];
+
+                    stateActions[ name ]( shift,
+                        shift.oldData ? shift.oldData[ name ] : null,
+                        shift.newData[ name ] );
+                }
+
+                shift.inflate();
+            };
+        },
+
+        /**
+         * Checks whether the current image ratio matches the natural one
+         * by comparing dimensions.
+         *
+         * @param {CKEDITOR.dom.element} image
+         * @returns {Boolean}
+         */
+        checkHasNaturalRatio: function( image ) {
+            var $ = image.$,
+                natural = this.getNatural( image );
+
+            // The reason for two alternative comparisons is that the rounding can come from
+            // both dimensions, e.g. there are two cases:
+            // 	1. height is computed as a rounded relation of the real height and the value of width,
+            //	2. width is computed as a rounded relation of the real width and the value of heigh.
+            return Math.round( $.clientWidth / natural.width * natural.height ) == $.clientHeight ||
+                Math.round( $.clientHeight / natural.height * natural.width ) == $.clientWidth;
+        },
+
+        /**
+         * Returns natural dimensions of the image. For modern browsers
+         * it uses natural(Width|Height). For old ones (IE8) it creates
+         * a new image and reads the dimensions.
+         *
+         * @param {CKEDITOR.dom.element} image
+         * @returns {Object}
+         */
+        getNatural: function( image ) {
+            var dimensions;
+
+            if ( image.$.naturalWidth ) {
+                dimensions = {
+                    width: image.$.naturalWidth,
+                    height: image.$.naturalHeight
+                };
+            } else {
+                var img = new Image();
+                img.src = image.getAttribute( 'src' );
+
+                dimensions = {
+                    width: img.width,
+                    height: img.height
+                };
+            }
+
+            return dimensions;
+        },
+
+        /**
+         * Returns an attribute getter function. Default getter comes from the Link plugin
+         * and is documented by {@link CKEDITOR.plugins.link#getLinkAttributes}.
+         *
+         * **Note:** It is possible to override this method and use a custom getter e.g.
+         * in the absence of the Link plugin.
+         *
+         * **Note:** If a custom getter is used, a data model format it produces
+         * must be compatible with {@link CKEDITOR.plugins.link#getLinkAttributes}.
+         *
+         * **Note:** A custom getter must understand the data model format produced by
+         * {@link #getLinkAttributesParser} to work correctly.
+         *
+         * @returns {Function} A function that gets (composes) link attributes.
+         * @since 4.5.5
+         */
+        getLinkAttributesGetter: function() {
+            // #13885
+            return CKEDITOR.plugins.link.getLinkAttributes;
+        },
+
+        /**
+         * Returns an attribute parser function. Default parser comes from the Link plugin
+         * and is documented by {@link CKEDITOR.plugins.link#parseLinkAttributes}.
+         *
+         * **Note:** It is possible to override this method and use a custom parser e.g.
+         * in the absence of the Link plugin.
+         *
+         * **Note:** If a custom parser is used, a data model format produced by the parser
+         * must be compatible with {@link #getLinkAttributesGetter}.
+         *
+         * **Note:** If a custom parser is used, it should be compatible with the
+         * {@link CKEDITOR.plugins.link#parseLinkAttributes} data model format. Otherwise the
+         * Link plugin dialog may not be populated correctly with parsed data. However
+         * as long as Enhanced Image is **not** used with the Link plugin dialog, any custom data model
+         * will work, being stored as an internal property of Enhanced Image widget's data only.
+         *
+         * @returns {Function} A function that parses attributes.
+         * @since 4.5.5
+         */
+        getLinkAttributesParser: function() {
+            // #13885
+            return CKEDITOR.plugins.link.parseLinkAttributes;
+        }
+    };
+
+    function setWrapperAlign( widget, alignClasses ) {
+        var wrapper = widget.wrapper,
+            align = widget.data.align,
+            hasCaption = widget.data.hasCaption;
+
+        if ( alignClasses ) {
+            // Remove all align classes first.
+            for ( var i = 3; i--; )
+                wrapper.removeClass( alignClasses[ i ] );
+
+            if ( align == 'center' ) {
+                // Avoid touching non-captioned, centered widgets because
+                // they have the class set on the element instead of wrapper:
+                //
+                // 	<div class="cke_widget_wrapper">
+                // 		<p class="center-class">
+                // 			<img />
+                // 		</p>
+                // 	</div>
+                if ( hasCaption ) {
+                    wrapper.addClass( alignClasses[ 1 ] );
+                }
+            } else if ( align != 'none' ) {
+                wrapper.addClass( alignClasses[ alignmentsObj[ align ] ] );
+            }
+        } else {
+            if ( align == 'center' ) {
+                if ( hasCaption )
+                    wrapper.setStyle( 'text-align', 'center' );
+                else
+                    wrapper.removeStyle( 'text-align' );
+
+                wrapper.removeStyle( 'float' );
+            }
+            else {
+                if ( align == 'none' )
+                    wrapper.removeStyle( 'float' );
+                else
+                    wrapper.setStyle( 'float', align );
+
+                wrapper.removeStyle( 'text-align' );
+            }
+        }
+    }
+
+    // Returns a function that creates widgets from all <img> and
+    // <figure class="{config.image2_captionedClass}"> elements.
+    //
+    // @param {CKEDITOR.editor} editor
+    // @returns {Function}
+    function upcastWidgetElement( editor ) {
+        var isCenterWrapper = centerWrapperChecker( editor ),
+            captionedClass = editor.config.image2_captionedClass;
+
+        // @param {CKEDITOR.htmlParser.element} el
+        // @param {Object} data
+        return function( el, data ) {
+            var dimensions = { width: 1, height: 1 },
+                name = el.name,
+                image;
+
+            // #11110 Don't initialize on pasted fake objects.
+            if ( el.attributes[ 'data-cke-realelement' ] )
+                return;
+
+            // If a center wrapper is found, there are 3 possible cases:
+            //
+            // 1. <div style="text-align:center"><figure>...</figure></div>.
+            //    In this case centering is done with a class set on widget.wrapper.
+            //    Simply replace centering wrapper with figure (it's no longer necessary).
+            //
+            // 2. <p style="text-align:center"><img/></p>.
+            //    Nothing to do here: <p> remains for styling purposes.
+            //
+            // 3. <div style="text-align:center"><img/></div>.
+            //    Nothing to do here (2.) but that case is only possible in enterMode different
+            //    than ENTER_P.
+            if ( isCenterWrapper( el ) ) {
+                if ( name == 'div' ) {
+                    var figure = el.getFirst( 'figure' );
+
+                    // Case #1.
+                    if ( figure ) {
+                        el.replaceWith( figure );
+                        el = figure;
+                    }
+                }
+                // Cases #2 and #3 (handled transparently)
+
+                // If there's a centering wrapper, save it in data.
+                data.align = 'center';
+
+                // Image can be wrapped in link <a><img/></a>.
+                image = el.getFirst( 'img' ) || el.getFirst( 'a' ).getFirst( 'img' );
+            }
+
+            // No center wrapper has been found.
+            else if ( name == 'figure' && el.hasClass( captionedClass ) ) {
+                image = el.getFirst( 'img' ) || el.getFirst( 'a' ).getFirst( 'img' );
+
+                // Upcast linked image like <a><img/></a>.
+            } else if ( isLinkedOrStandaloneImage( el ) ) {
+                image = el.name == 'a' ? el.children[ 0 ] : el;
+            }
+
+            if ( !image )
+                return;
+
+            // If there's an image, then cool, we got a widget.
+            // Now just remove dimension attributes expressed with %.
+            for ( var d in dimensions ) {
+                var dimension = image.attributes[ d ];
+
+                if ( dimension && dimension.match( regexPercent ) )
+                    delete image.attributes[ d ];
+            }
+
+            return el;
+        };
+    }
+
+    // Returns a function which transforms the widget to the external format
+    // according to the current configuration.
+    //
+    // @param {CKEDITOR.editor}
+    function downcastWidgetElement( editor ) {
+        var alignClasses = editor.config.image2_alignClasses;
+
+        // @param {CKEDITOR.htmlParser.element} el
+        return function( el ) {
+            // In case of <a><img/></a>, <img/> is the element to hold
+            // inline styles or classes (image2_alignClasses).
+            var attrsHolder = el.name == 'a' ? el.getFirst() : el,
+                attrs = attrsHolder.attributes,
+                align = this.data.align;
+
+            // De-wrap the image from resize handle wrapper.
+            // Only block widgets have one.
+            if ( !this.inline ) {
+                var resizeWrapper = el.getFirst( 'span' );
+
+                if ( resizeWrapper )
+                    resizeWrapper.replaceWith( resizeWrapper.getFirst( { img: 1, a: 1 } ) );
+            }
+
+            if ( align && align != 'none' ) {
+                var styles = CKEDITOR.tools.parseCssText( attrs.style || '' );
+
+                // When the widget is captioned (<figure>) and internally centering is done
+                // with widget's wrapper style/class, in the external data representation,
+                // <figure> must be wrapped with an element holding an style/class:
+                //
+                // 	<div style="text-align:center">
+                // 		<figure class="image" style="display:inline-block">...</figure>
+                // 	</div>
+                // or
+                // 	<div class="some-center-class">
+                // 		<figure class="image">...</figure>
+                // 	</div>
+                //
+                if ( align == 'center' && el.name == 'figure' ) {
+                    el = el.wrapWith( new CKEDITOR.htmlParser.element( 'div',
+                        alignClasses ? { 'class': alignClasses[ 1 ] } : { style: 'text-align:center' } ) );
+                }
+
+                // If left/right, add float style to the downcasted element.
+                else if ( align in { left: 1, right: 1 } ) {
+                    if ( alignClasses )
+                        attrsHolder.addClass( alignClasses[ alignmentsObj[ align ] ] );
+                    else
+                        styles[ 'float' ] = align;
+                }
+
+                // Update element styles.
+                if ( !alignClasses && !CKEDITOR.tools.isEmpty( styles ) )
+                    attrs.style = CKEDITOR.tools.writeCssText( styles );
+            }
+
+            return el;
+        };
+    }
+
+    // Returns a function that checks if an element is a centering wrapper.
+    //
+    // @param {CKEDITOR.editor} editor
+    // @returns {Function}
+    function centerWrapperChecker( editor ) {
+        var captionedClass = editor.config.image2_captionedClass,
+            alignClasses = editor.config.image2_alignClasses,
+            validChildren = { figure: 1, a: 1, img: 1 };
+
+        return function( el ) {
+            // Wrapper must be either <div> or <p>.
+            if ( !( el.name in { div: 1, p: 1 } ) )
+                return false;
+
+            var children = el.children;
+
+            // Centering wrapper can have only one child.
+            if ( children.length !== 1 )
+                return false;
+
+            var child = children[ 0 ];
+
+            // Only <figure> or <img /> can be first (only) child of centering wrapper,
+            // regardless of its type.
+            if ( !( child.name in validChildren ) )
+                return false;
+
+            // If centering wrapper is <p>, only <img /> can be the child.
+            //   <p style="text-align:center"><img /></p>
+            if ( el.name == 'p' ) {
+                if ( !isLinkedOrStandaloneImage( child ) )
+                    return false;
+            }
+            // Centering <div> can hold <img/> or <figure>, depending on enterMode.
+            else {
+                // If a <figure> is the first (only) child, it must have a class.
+                //   <div style="text-align:center"><figure>...</figure><div>
+                if ( child.name == 'figure' ) {
+                    if ( !child.hasClass( captionedClass ) )
+                        return false;
+                } else {
+                    // Centering <div> can hold <img/> or <a><img/></a> only when enterMode
+                    // is ENTER_(BR|DIV).
+                    //   <div style="text-align:center"><img /></div>
+                    //   <div style="text-align:center"><a><img /></a></div>
+                    if ( editor.enterMode == CKEDITOR.ENTER_P )
+                        return false;
+
+                    // Regardless of enterMode, a child which is not <figure> must be
+                    // either <img/> or <a><img/></a>.
+                    if ( !isLinkedOrStandaloneImage( child ) )
+                        return false;
+                }
+            }
+
+            // Centering wrapper got to be... centering. If image2_alignClasses are defined,
+            // check for centering class. Otherwise, check the style.
+            if ( alignClasses ? el.hasClass( alignClasses[ 1 ] ) :
+                CKEDITOR.tools.parseCssText( el.attributes.style || '', true )[ 'text-align' ] == 'center' )
+                return true;
+
+            return false;
+        };
+    }
+
+    // Checks whether element is <img/> or <a><img/></a>.
+    //
+    // @param {CKEDITOR.htmlParser.element}
+    function isLinkedOrStandaloneImage( el ) {
+        if ( el.name == 'img' )
+            return true;
+        else if ( el.name == 'a' )
+            return el.children.length == 1 && el.getFirst( 'img' );
+
+        return false;
+    }
+
+    // Sets width and height of the widget image according to current widget data.
+    //
+    // @param {CKEDITOR.plugins.widget} widget
+    function setDimensions( widget ) {
+        var data = widget.data,
+            dimensions = { width: data.width, height: data.height },
+            image = widget.parts.image;
+
+        for ( var d in dimensions ) {
+            if ( dimensions[ d ] )
+                image.setAttribute( d, dimensions[ d ] );
+            else
+                image.removeAttribute( d );
+        }
+    }
+
+    // Defines all features related to drag-driven image resizing.
+    //
+    // @param {CKEDITOR.plugins.widget} widget
+    function setupResizer( widget ) {
+        var editor = widget.editor,
+            editable = editor.editable(),
+            doc = editor.document,
+
+            // Store the resizer in a widget for testing (#11004).
+            resizer = widget.resizer = doc.createElement( 'span' );
+
+        resizer.addClass( 'cke_image_resizer' );
+        resizer.setAttribute( 'title', editor.lang.image2.resizer );
+        resizer.append( new CKEDITOR.dom.text( '\u200b', doc ) );
+
+        // Inline widgets don't need a resizer wrapper as an image spans the entire widget.
+        if ( !widget.inline ) {
+            var imageOrLink = widget.parts.link || widget.parts.image,
+                oldResizeWrapper = imageOrLink.getParent(),
+                resizeWrapper = doc.createElement( 'span' );
+
+            resizeWrapper.addClass( 'cke_image_resizer_wrapper' );
+            resizeWrapper.append( imageOrLink );
+            resizeWrapper.append( resizer );
+            widget.element.append( resizeWrapper, true );
+
+            // Remove the old wrapper which could came from e.g. pasted HTML
+            // and which could be corrupted (e.g. resizer span has been lost).
+            if ( oldResizeWrapper.is( 'span' ) )
+                oldResizeWrapper.remove();
+        } else {
+            widget.wrapper.append( resizer );
+        }
+
+        // Calculate values of size variables and mouse offsets.
+        resizer.on( 'mousedown', function( evt ) {
+            var image = widget.parts.image,
+
+                // "factor" can be either 1 or -1. I.e.: For right-aligned images, we need to
+                // subtract the difference to get proper width, etc. Without "factor",
+                // resizer starts working the opposite way.
+                factor = widget.data.align == 'right' ? -1 : 1,
+
+                // The x-coordinate of the mouse relative to the screen
+                // when button gets pressed.
+                startX = evt.data.$.screenX,
+                startY = evt.data.$.screenY,
+
+                // The initial dimensions and aspect ratio of the image.
+                startWidth = image.$.clientWidth,
+                startHeight = image.$.clientHeight,
+                ratio = startWidth / startHeight,
+
+                listeners = [],
+
+                // A class applied to editable during resizing.
+                cursorClass = 'cke_image_s' + ( !~factor ? 'w' : 'e' ),
+
+                nativeEvt, newWidth, newHeight, updateData,
+                moveDiffX, moveDiffY, moveRatio;
+
+            // Save the undo snapshot first: before resizing.
+            editor.fire( 'saveSnapshot' );
+
+            // Mousemove listeners are removed on mouseup.
+            attachToDocuments( 'mousemove', onMouseMove, listeners );
+
+            // Clean up the mousemove listener. Update widget data if valid.
+            attachToDocuments( 'mouseup', onMouseUp, listeners );
+
+            // The entire editable will have the special cursor while resizing goes on.
+            editable.addClass( cursorClass );
+
+            // This is to always keep the resizer element visible while resizing.
+            resizer.addClass( 'cke_image_resizing' );
+
+            // Attaches an event to a global document if inline editor.
+            // Additionally, if classic (`iframe`-based) editor, also attaches the same event to `iframe`'s document.
+            function attachToDocuments( name, callback, collection ) {
+                var globalDoc = CKEDITOR.document,
+                    listeners = [];
+
+                if ( !doc.equals( globalDoc ) )
+                    listeners.push( globalDoc.on( name, callback ) );
+
+                listeners.push( doc.on( name, callback ) );
+
+                if ( collection ) {
+                    for ( var i = listeners.length; i--; )
+                        collection.push( listeners.pop() );
+                }
+            }
+
+            // Calculate with first, and then adjust height, preserving ratio.
+            function adjustToX() {
+                newWidth = startWidth + factor * moveDiffX;
+                newHeight = Math.round( newWidth / ratio );
+            }
+
+            // Calculate height first, and then adjust width, preserving ratio.
+            function adjustToY() {
+                newHeight = startHeight - moveDiffY;
+                newWidth = Math.round( newHeight * ratio );
+            }
+
+            // This is how variables refer to the geometry.
+            // Note: x corresponds to moveOffset, this is the position of mouse
+            // Note: o corresponds to [startX, startY].
+            //
+            // 	+--------------+--------------+
+            // 	|              |              |
+            // 	|      I       |      II      |
+            // 	|              |              |
+            // 	+------------- o -------------+ _ _ _
+            // 	|              |              |      ^
+            // 	|      VI      |     III      |      | moveDiffY
+            // 	|              |         x _ _ _ _ _ v
+            // 	+--------------+---------|----+
+            // 	               |         |
+            // 	                <------->
+            // 	                moveDiffX
+            function onMouseMove( evt ) {
+                nativeEvt = evt.data.$;
+
+                // This is how far the mouse is from the point the button was pressed.
+                moveDiffX = nativeEvt.screenX - startX;
+                moveDiffY = startY - nativeEvt.screenY;
+
+                // This is the aspect ratio of the move difference.
+                moveRatio = Math.abs( moveDiffX / moveDiffY );
+
+                // Left, center or none-aligned widget.
+                if ( factor == 1 ) {
+                    if ( moveDiffX <= 0 ) {
+                        // Case: IV.
+                        if ( moveDiffY <= 0 )
+                            adjustToX();
+
+                        // Case: I.
+                        else {
+                            if ( moveRatio >= ratio )
+                                adjustToX();
+                            else
+                                adjustToY();
+                        }
+                    } else {
+                        // Case: III.
+                        if ( moveDiffY <= 0 ) {
+                            if ( moveRatio >= ratio )
+                                adjustToY();
+                            else
+                                adjustToX();
+                        }
+
+                        // Case: II.
+                        else {
+                            adjustToY();
+                        }
+                    }
+                }
+
+                // Right-aligned widget. It mirrors behaviours, so I becomes II,
+                // IV becomes III and vice-versa.
+                else {
+                    if ( moveDiffX <= 0 ) {
+                        // Case: IV.
+                        if ( moveDiffY <= 0 ) {
+                            if ( moveRatio >= ratio )
+                                adjustToY();
+                            else
+                                adjustToX();
+                        }
+
+                        // Case: I.
+                        else {
+                            adjustToY();
+                        }
+                    } else {
+                        // Case: III.
+                        if ( moveDiffY <= 0 )
+                            adjustToX();
+
+                        // Case: II.
+                        else {
+                            if ( moveRatio >= ratio ) {
+                                adjustToX();
+                            } else {
+                                adjustToY();
+                            }
+                        }
+                    }
+                }
+
+                // Don't update attributes if less than 10.
+                // This is to prevent images to visually disappear.
+                if ( newWidth >= 15 && newHeight >= 15 ) {
+                    image.setAttributes( { width: newWidth, height: newHeight } );
+                    updateData = true;
+                } else {
+                    updateData = false;
+                }
+            }
+
+            function onMouseUp() {
+                var l;
+
+                while ( ( l = listeners.pop() ) )
+                    l.removeListener();
+
+                // Restore default cursor by removing special class.
+                editable.removeClass( cursorClass );
+
+                // This is to bring back the regular behaviour of the resizer.
+                resizer.removeClass( 'cke_image_resizing' );
+
+                if ( updateData ) {
+                    widget.setData( { width: newWidth, height: newHeight } );
+
+                    // Save another undo snapshot: after resizing.
+                    editor.fire( 'saveSnapshot' );
+                }
+
+                // Don't update data twice or more.
+                updateData = false;
+            }
+        } );
+
+        // Change the position of the widget resizer when data changes.
+        widget.on( 'data', function() {
+            resizer[ widget.data.align == 'right' ? 'addClass' : 'removeClass' ]( 'cke_image_resizer_left' );
+        } );
+    }
+
+    // Integrates widget alignment setting with justify
+    // plugin's commands (execution and refreshment).
+    // @param {CKEDITOR.editor} editor
+    // @param {String} value 'left', 'right', 'center' or 'block'
+    function alignCommandIntegrator( editor ) {
+        var execCallbacks = [],
+            enabled;
+
+        return function( value ) {
+            var command = editor.getCommand( 'justify' + value );
+
+            // Most likely, the justify plugin isn't loaded.
+            if ( !command )
+                return;
+
+            // This command will be manually refreshed along with
+            // other commands after exec.
+            execCallbacks.push( function() {
+                command.refresh( editor, editor.elementPath() );
+            } );
+
+            if ( value in { right: 1, left: 1, center: 1 } ) {
+                command.on( 'exec', function( evt ) {
+                    var widget = getFocusedWidget( editor );
+
+                    if ( widget ) {
+                        widget.setData( 'align', value );
+
+                        // Once the widget changed its align, all the align commands
+                        // must be refreshed: the event is to be cancelled.
+                        for ( var i = execCallbacks.length; i--; )
+                            execCallbacks[ i ]();
+
+                        evt.cancel();
+                    }
+                } );
+            }
+
+            command.on( 'refresh', function( evt ) {
+                var widget = getFocusedWidget( editor ),
+                    allowed = { right: 1, left: 1, center: 1 };
+
+                if ( !widget )
+                    return;
+
+                // Cache "enabled" on first use. This is because filter#checkFeature may
+                // not be available during plugin's afterInit in the future — a moment when
+                // alignCommandIntegrator is called.
+                if ( enabled === undefined )
+                    enabled = editor.filter.checkFeature( editor.widgets.registered.image.features.align );
+
+                // Don't allow justify commands when widget alignment is disabled (#11004).
+                if ( !enabled )
+                    this.setState( CKEDITOR.TRISTATE_DISABLED );
+                else {
+                    this.setState(
+                        ( widget.data.align == value ) ? (
+                            CKEDITOR.TRISTATE_ON
+                        ) : (
+                            ( value in allowed ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
+                        )
+                    );
+                }
+
+                evt.cancel();
+            } );
+        };
+    }
+
+    function linkCommandIntegrator( editor ) {
+        // Nothing to integrate with if link is not loaded.
+        if ( !editor.plugins.link )
+            return;
+
+        CKEDITOR.on( 'dialogDefinition', function( evt ) {
+            var dialog = evt.data;
+
+            if ( dialog.name == 'link' ) {
+                var def = dialog.definition;
+
+                var onShow = def.onShow,
+                    onOk = def.onOk;
+
+                def.onShow = function() {
+                    var widget = getFocusedWidget( editor ),
+                        displayTextField = this.getContentElement( 'info', 'linkDisplayText' ).getElement().getParent().getParent();
+
+                    // Widget cannot be enclosed in a link, i.e.
+                    //		<a>foo<inline widget/>bar</a>
+                    if ( widget && ( widget.inline ? !widget.wrapper.getAscendant( 'a' ) : 1 ) ) {
+                        this.setupContent( widget.data.link || {} );
+
+                        // Hide the display text in case of linking image2 widget.
+                        displayTextField.hide();
+                    } else {
+                        // Make sure that display text is visible, as it might be hidden by image2 integration
+                        // before.
+                        displayTextField.show();
+                        onShow.apply( this, arguments );
+                    }
+                };
+
+                // Set widget data if linking the widget using
+                // link dialog (instead of default action).
+                // State shifter handles data change and takes
+                // care of internal DOM structure of linked widget.
+                def.onOk = function() {
+                    var widget = getFocusedWidget( editor );
+
+                    // Widget cannot be enclosed in a link, i.e.
+                    //		<a>foo<inline widget/>bar</a>
+                    if ( widget && ( widget.inline ? !widget.wrapper.getAscendant( 'a' ) : 1 ) ) {
+                        var data = {};
+
+                        // Collect data from fields.
+                        this.commitContent( data );
+
+                        // Set collected data to widget.
+                        widget.setData( 'link', data );
+                    } else {
+                        onOk.apply( this, arguments );
+                    }
+                };
+            }
+        } );
+
+        // Overwrite default behaviour of unlink command.
+        editor.getCommand( 'unlink' ).on( 'exec', function( evt ) {
+            var widget = getFocusedWidget( editor );
+
+            // Override unlink only when link truly belongs to the widget.
+            // If wrapped inline widget in a link, let default unlink work (#11814).
+            if ( !widget || !widget.parts.link )
+                return;
+
+            widget.setData( 'link', null );
+
+            // Selection (which is fake) may not change if unlinked image in focused widget,
+            // i.e. if captioned image. Let's refresh command state manually here.
+            this.refresh( editor, editor.elementPath() );
+
+            evt.cancel();
+        } );
+
+        // Overwrite default refresh of unlink command.
+        editor.getCommand( 'unlink' ).on( 'refresh', function( evt ) {
+            var widget = getFocusedWidget( editor );
+
+            if ( !widget )
+                return;
+
+            // Note that widget may be wrapped in a link, which
+            // does not belong to that widget (#11814).
+            this.setState( widget.data.link || widget.wrapper.getAscendant( 'a' ) ?
+                CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
+
+            evt.cancel();
+        } );
+    }
+
+    // Returns the focused widget, if of the type specific for this plugin.
+    // If no widget is focused, `null` is returned.
+    //
+    // @param {CKEDITOR.editor}
+    // @returns {CKEDITOR.plugins.widget}
+    function getFocusedWidget( editor ) {
+        var widget = editor.widgets.focused;
+
+        if ( widget && widget.name == 'image' )
+            return widget;
+
+        return null;
+    }
+
+    // Returns a set of widget allowedContent rules, depending
+    // on configurations like config#image2_alignClasses or
+    // config#image2_captionedClass.
+    //
+    // @param {CKEDITOR.editor}
+    // @returns {Object}
+    function getWidgetAllowedContent( editor ) {
+        var alignClasses = editor.config.image2_alignClasses,
+            rules = {
+                // Widget may need <div> or <p> centering wrapper.
+                div: {
+                    match: centerWrapperChecker( editor )
+                },
+                p: {
+                    match: centerWrapperChecker( editor )
+                },
+                img: {
+                    attributes: '!src,alt,width,height'
+                },
+                figure: {
+                    classes: '!' + editor.config.image2_captionedClass
+                },
+                figcaption: true
+            };
+
+        if ( alignClasses ) {
+            // Centering class from the config.
+            rules.div.classes = alignClasses[ 1 ];
+            rules.p.classes = rules.div.classes;
+
+            // Left/right classes from the config.
+            rules.img.classes = alignClasses[ 0 ] + ',' + alignClasses[ 2 ];
+            rules.figure.classes += ',' + rules.img.classes;
+        } else {
+            // Centering with text-align.
+            rules.div.styles = 'text-align';
+            rules.p.styles = 'text-align';
+
+            rules.img.styles = 'float';
+            rules.figure.styles = 'float,display';
+        }
+
+        return rules;
+    }
+
+    // Returns a set of widget feature rules, depending
+    // on editor configuration. Note that the following may not cover
+    // all the possible cases since requiredContent supports a single
+    // tag only.
+    //
+    // @param {CKEDITOR.editor}
+    // @returns {Object}
+    function getWidgetFeatures( editor ) {
+        var alignClasses = editor.config.image2_alignClasses,
+            features = {
+                dimension: {
+                    requiredContent: 'img[width,height]'
+                },
+                align: {
+                    requiredContent: 'img' +
+                    ( alignClasses ? '(' + alignClasses[ 0 ] + ')' : '{float}' )
+                },
+                caption: {
+                    requiredContent: 'figcaption'
+                }
+            };
+
+        return features;
+    }
+
+    // Returns element which is styled, considering current
+    // state of the widget.
+    //
+    // @see CKEDITOR.plugins.widget#applyStyle
+    // @param {CKEDITOR.plugins.widget} widget
+    // @returns {CKEDITOR.dom.element}
+    function getStyleableElement( widget ) {
+        return widget.data.hasCaption ? widget.element : widget.parts.image;
+    }
+} )();
+
+/**
+ * A CSS class applied to the `<figure>` element of a captioned image.
+ *
+ * Read more in the [documentation](#!/guide/dev_captionedimage) and see the
+ * [SDK sample](http://sdk.ckeditor.com/samples/captionedimage.html).
+ *
+ *		// Changes the class to "captionedImage".
+ *		config.image2_captionedClass = 'captionedImage';
+ *
+ * @cfg {String} [image2_captionedClass='image']
+ * @member CKEDITOR.config
+ */
+CKEDITOR.config.image2_captionedClass = 'image';
+
+/**
+ * Determines whether dimension inputs should be automatically filled when the image URL changes in the Enhanced Image
+ * plugin dialog window.
+ *
+ * Read more in the [documentation](#!/guide/dev_captionedimage) and see the
+ * [SDK sample](http://sdk.ckeditor.com/samples/captionedimage.html).
+ *
+ *		config.image2_prefillDimensions = false;
+ *
+ * @since 4.5
+ * @cfg {Boolean} [image2_prefillDimensions=true]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * Disables the image resizer. By default the resizer is enabled.
+ *
+ * Read more in the [documentation](#!/guide/dev_captionedimage) and see the
+ * [SDK sample](http://sdk.ckeditor.com/samples/captionedimage.html).
+ *
+ *		config.image2_disableResizer = true;
+ *
+ * @since 4.5
+ * @cfg {Boolean} [image2_disableResizer=false]
+ * @member CKEDITOR.config
+ */
+
+/**
+ * CSS classes applied to aligned images. Useful to take control over the way
+ * the images are aligned, i.e. to customize output HTML and integrate external stylesheets.
+ *
+ * Classes should be defined in an array of three elements, containing left, center, and right
+ * alignment classes, respectively. For example:
+ *
+ *		config.image2_alignClasses = [ 'align-left', 'align-center', 'align-right' ];
+ *
+ * **Note**: Once this configuration option is set, the plugin will no longer produce inline
+ * styles for alignment. It means that e.g. the following HTML will be produced:
+ *
+ *		<img alt="My image" class="custom-center-class" src="foo.png" />
+ *
+ * instead of:
+ *
+ *		<img alt="My image" style="float:left" src="foo.png" />
+ *
+ * **Note**: Once this configuration option is set, corresponding style definitions
+ * must be supplied to the editor:
+ *
+ * * For [classic editor](#!/guide/dev_framed) it can be done by defining additional
+ * styles in the {@link CKEDITOR.config#contentsCss stylesheets loaded by the editor}. The same
+ * styles must be provided on the target page where the content will be loaded.
+ * * For [inline editor](#!/guide/dev_inline) the styles can be defined directly
+ * with `<style> ... <style>` or `<link href="..." rel="stylesheet">`, i.e. within the `<head>`
+ * of the page.
+ *
+ * For example, considering the following configuration:
+ *
+ *		config.image2_alignClasses = [ 'align-left', 'align-center', 'align-right' ];
+ *
+ * CSS rules can be defined as follows:
+ *
+ *		.align-left {
+ *			float: left;
+ *		}
+ *
+ *		.align-right {
+ *			float: right;
+ *		}
+ *
+ *		.align-center {
+ *			text-align: center;
+ *		}
+ *
+ *		.align-center > figure {
+ *			display: inline-block;
+ *		}
+ *
+ * Read more in the [documentation](#!/guide/dev_captionedimage) and see the
+ * [SDK sample](http://sdk.ckeditor.com/samples/captionedimage.html).
+ *
+ * @since 4.4
+ * @cfg {String[]} [image2_alignClasses=null]
+ * @member CKEDITOR.config
+ */

+ 67 - 10
documentation/changelog.html

@@ -44,38 +44,94 @@
 </ul>
 <h1>Chamilo&nbsp;Changelog</h1>
 <p>This is our technical changelog, aimed at providing you a list of the new features, small changes and bug fixes as well as the security issues, style changes and known issues that remain present. This changelog is provided version by version, latest versions first and helps you locate when a specific feature has been made available in Chamilo. If you would like a shorter list of features or a list of overall features, please check our website: <a href="http://www.chamilo.org/">http://www.chamilo.org/</a></p>
-<p><i>Note: most #wxyz references are issue numbers you can find in <a href="http://support.chamilo.org/projects/chamilo-18/issues" target="_blank">our public bug tracking system</a>. Some references marked BT#xyz are developments made externally for BeezNest customers and integrated into Chamilo. The details of these tasks cannot be seen for confidentiality reasons, but the code change is public and can be reviewed by anyone.</i></p>
+<p><i>Note: most #wxyz references are issue numbers you can find in
+    <a href="http://support.chamilo.org/projects/chamilo-18/issues"
+       target="_blank">our public bug tracking system</a> or
+    <a href="https://github.com/chamilo/chamilo-lms/issues">on Github</a>.
+    Some references marked BT#xyz are developments made externally for BeezNest
+    customers and integrated into Chamilo. The details of these tasks cannot
+    be seen for confidentiality reasons, but the code change is public and can
+    be reviewed by anyone <a href="https://github.com/chamilo/chamilo-lms/commits">on Github</a>.</i></p>
 <p>&nbsp;</p>
 
     <a name="1.11.2"></a>
 
-    <h1>Chamilo 1.11.2 - , 28th of October 2016</h1>
+    <h1>Chamilo 1.11.2 - Bari, 1st of November 2016</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.11.2 is a minor, bugfix release of the 1.11.x branch, with a few bugfixes on top of 1.11.0.</p>
     <h3>Release name</h3>
-    <p><a href=""></a> .</p>
+    <p><a href="https://en.wikipedia.org/wiki/Bari" title="Wikipedia page for Bari, Italy">Bari</a> is the capital city of the Metropolitan City of Bari and of the Apulia region, on the Adriatic Sea, in Italy. It is just a few hundred kilometers North of Lecce, the city which gave the name to our previous version. A bit more modern and a bit larger, it also hosts the infamous Basilica of Saint Nicholas, known as the "Wonderworker" for its miracles. Given 1.11.2 is just a perfecting release on top of 1.11.0, we felt the name of Bari was well suited for this version.</p>
     <h3>Security fixes</h3>
-    <ul>
-        <li>Several security fixes were applied to this version. Please update as soon as possible. You can find details of the vulnerability on <a href="https://support.chamilo.org/projects/chamilo-18/wiki/Security_issues">Chamilo's security page</a></li>
-    </ul>
+    <p>None in this version.</p>
     <h3>Possibly breaking changes</h3>
     <p>None in this version.</p>
     <h3>Notable new Features</h3>
     <h4>For end-users, teachers and Chamilo admins</h4>
+    <ul>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f7872b7d42764849c6ce94511adff5f337944f53">f7872b7d</a>) Add configuration setting to decide whether to let registered users access open courses content (if not subscribed to the course) or not</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e826fda7e2c37caff757b7ed93d7ab29d975bfa1">e826fda7</a> - <a href="https://task.beeznest.com/issues/11371">BT#11371</a>) Added geolocalization coordinates extra field</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/eb63311995407d3ded57c046e77153c9dc70b5f9">eb633119</a> - <a href="https://support.chamilo.org/issues/8470">CT#8470</a>) Add option to show image in responsive mode in ckeditor plugin</li>
+    </ul>
     <p>None in this version.</p>
     <h4>For developers and sysadmins</h4>
     <ul>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/641c865ad7b6c0623fe2f0c92e946fcbbd2e93de">641c865a</a>) Add configuration block_quiz_mail_notification_general_coach</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a4075d3933346095a24c6e55ce6c911fb186355a">a4075d39</a>) Add functions to get default status and priority codes in tickets</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7899fe2899ff46524c3a66ebce40d16b7b1245bc">7899fe28</a>) Add MinText validation to QuickForm rules to check for the minimum length of a text</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/0aa20ed57c373abcfcf51427148397a58340d014">0aa20ed5</a> - <a href="https://task.beeznest.com/issues/11905">BT#11905</a>) Add learnpath_item_view_id in url</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ca1a2335688a7002d71d277e244ef1b5a6608688">ca1a2335</a>) Block installation if already installed.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6094eee880b724bc772187ccf7ea73e16ec7d8ee">6094eee8</a>) Add block_quiz_mail_notification_general_coach in configuration.php</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/fe6864713a079c8415261635cf03bce23a75ceb2">fe686471</a> - <a href="https://task.beeznest.com/issues/11890">BT#11890</a>) Add new config hide_my_certificate_link</li>
     </ul>
     <h3>Improvements (minor features) and debug</h3>
     <ul>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c3ddad3164920551d3a4723333fd8948b4e7f753">c3ddad31</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1492">GH#1492</a>) Fix issue using course code instead of course ID in mySpace student time tracking page</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3151b8a099fbd9b27dcccbee6db57c6d64a6d98d">3151b8a0</a>) Replace _api_get_timezone with api_get_timezone</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d86e341f666e23bcd23ea18920d4f1b297a8dd7d">d86e341f</a>) Add missing entity (from ofaj)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7e6069b54d9f371e52111c22ed87ce76769205bb">7e6069b5</a>) Add redirection + show deleted user info.</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/6d851da2ef30bbcb63fb7520e59be9ac54ff970c">6d851da2</a>) Fix time display + adding api_get_cidreq</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2223d36b251010c62a48f017f5d13830e4008534">2223d36b</a>) Fix include file + use markdown in readme</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/908d802cadef83827bff8aabd8f9704b671afc42">908d802c</a>) Validate auth/sso/sso file existence or throw Exception</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/66a92ef48b1181e028f34eed059c206c59cad47b">66a92ef4</a>) Remove double ";"</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b9a0f956c4942a32b85b3413b51bc7bc481c84b7">b9a0f956</a> - <a href="https://support.chamilo.org/issues/8432">CT#8432</a>) Fix BBB plugin DB error when installing/uninstalling plugin</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bbaac7e4860be6d2595ce9e45b86e6cb94ecfaa8">bbaac7e4</a>) Use api_get_utc_datetime()</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a4ddadc93e8e21971d9ef346abdd30991c245566">a4ddadc9</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1486">GH#1486</a>) Fix sql error on ambiguous c_id in stats</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b45215f417901b63f2fa80676e2281a0bc53a54a">b45215f4</a> - <a href="https://support.chamilo.org/issues/8475">CT#8475</a>) Fix create course permission, improve api_is_allowed_to_create_course</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d9208bb7b10f6e025623336d267459f5b8a85053">d9208bb7</a>) Update from ofaj (attendee pass didnt work).</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d830c714dff1a3bd6ee0587be4c0816777d8963a">d830c714</a>) Remove email_canonical unique (email is not unique)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/4917d9be7e1dfc4209e9f4dea47345b071734e6c">4917d9be</a>) Add function Display::dateToStringAgoAndLongDate()</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d71b876ed6276b2ea1da144d576d09f68291400d">d71b876e</a> - <a href="https://support.chamilo.org/issues/8476">CT#8476</a>) Use datetimepicker instead of date</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d308e0bb5e5150d5bfbda652cd652e78fb15251f">d308e0bb</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1475">GH#1475</a>) Add primary key as auto increment in c_student_publication_comment (fixes issue with migration from previous versions)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/12435f1e19e843c9e69c408859231da6df1b0444">12435f1e</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1475">GH#1475</a>) Fix migration for c_student_publication_comment</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2d00681c1f72d9e24997a5394255df462340c691">2d00681c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1481">GH#1481</a>) Avoid double course in courses list for HRM</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5c290c35924667d183eeb8d2fb3f8a23bcccb565">5c290c35</a>) Replace visible wih visible_to_self</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7ee7e9a1545f55e84cd33e6d371a3d4a2604cab3">7ee7e9a1</a> - <a href="https://support.chamilo.org/issues/8481">CT#8481</a>) Fix BBB plugin activation</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e9908466e5b554e533e555da19a1be69e6a6bde3">e9908466</a>) Fix calendar importcsv update</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/290b41221236dfb4cacb924a89780f8120a892c1">290b4122</a>) Fix query "is_course_model" not available for $extraFieldValue</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/44330d3a33c1af91475eb797598e7fc7de69b1a9">44330d3a</a>) Add logs + fix condition</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/62d9026f6be703ed8bdf852e1b744e10b92133ee">62d9026f</a> - <a href="https://task.beeznest.com/issues/11594">BT#11594</a>) Fix calendar import static</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/825aebbde1e3db5ae5fa6fafe2fac5410c3407a2">825aebbd</a>) Add only validated users</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5509c0e0813ad37e29e70d01dd3844f38bfd729e">5509c0e0</a>) Fix calendar import</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/eec1b7f00b549b02ad78673e906460f5e203a7bb">eec1b7f0</a>) Fix parameter function SessionManager::relation_session_course_exist</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/1d928c9fe2149726416f90c76859029ba51f144c">1d928c9f</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1484">GH#1484</a>) Only count users who are admin, reader, moderator or HRM (not pending)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/d6af6d89d93b65ca1be24e148c2e3f31ef055d60">d6af6d89</a>) Add message with course link</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a63150045d10e6f6bd186d3eeb9f253b65c85e1a">a6315004</a>) Fix more MySQL errors in tickets tool</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/ddccfa79ad6ec422b0823f6e3aca12ddec07b1bd">ddccfa79</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1483">GH#1483</a>) Fix user id</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b3ce209ab8ed9fcd2026f678f312cf84b514a1ef">b3ce209a</a>) Format code + fix sql error</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e82059c382a72e9b1ca444112b1a15810f627f40">e82059c3</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1482">GH#1482</a>) Fix MySQL ticket delete error (foreign keys violation when removing course)</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/2035d8595ceccc034bb7ca9c9ebd80846552d9ea">2035d859</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1480">GH#1480</a>) Remove references to Chat-Call in global chat</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/5a145fedabf4cab5f68bd745279cc5abdb73a5ae">5a145fed</a>) Set session id</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/27739204c35ddbea54b595c42dd35331d7dbcac8">27739204</a>) Use c_id instead of course_code function "get_tutor_in_course_status"</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/b51ae92cd70eb1653cfdd25ca289ad7a7d70903b">b51ae92c</a> - <a href="https://task.beeznest.com/issues/11019">BT#11019</a>) Update certificate field created_at when user details are updated</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/eeb64180a3928f002df9f2e18cbddffedc86c3df">eeb64180</a>) Fix Grade Models form UI</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/3ee7a38cb88328299f70454131d0be4910068530">3ee7a38c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/1478">GH#1478</a>) Fix Grade Models form UI</li>
+        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/c0c25950c5325e6d95c1c44b31d448eee6707835">c0c25950</a> - <a href="https://task.beeznest.com/issues/11636">BT#11636</a>) Remove E_NOTICE when getting videoconference list</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/7055a50530d1b5049d03def4248555f6b8b1d191">7055a505</a> - <a href="https://task.beeznest.com/issues/11636">BT#11636</a>) Show participants emails on videoconference admin view</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a3feab412d34e0254cb60c3f8a02e059479e76f8">a3feab41</a> - <a href="https://task.beeznest.com/issues/11636">BT#11636</a>) Fix show links for videoconference</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/e6887301cbedc0bc1353d95450c7e303c5d74240">e6887301</a>) Restoring missing "database" and "language" notes in installation guide</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/bc319badbff4b425595d815c2b6066f1ec2fb501">bc319bad</a> - <a href="https://task.beeznest.com/issues/11860">BT#11860</a>) Fix teacher can't access LP</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/8f40f7d803dbc595abdebd0c4f76fe7185257bbd">8f40f7d8</a> - <a href="https://task.beeznest.com/issues/11879">BT#11879</a>) Lp build: Load forums as in the forum tool</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a12383d866b718499f73e79a996a532afc0d6b5c">a12383d8</a>) Add user object in tpl $tplContent->assign('new_user', $user);</li>
-        <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/fe6864713a079c8415261635cf03bce23a75ceb2">fe686471</a> - <a href="https://task.beeznest.com/issues/11890">BT#11890</a>) Add new config hide_my_certificate_link</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/f6a1adb81323fa82a174d1455b886c1577b813e7">f6a1adb8</a>) Add missing fos_group* tables on upgrade from 1.10</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/938c4ed30a5a950348cd0dbf1147c9c91cabf427">938c4ed3</a>) Add missing database changes on upgrade from 1.10 on message.votes column and ticket tables</li>
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/57cfd396830f117506035316bba44567a78babcd">57cfd396</a>) Update upgrade section in installation guide.</li>
@@ -92,13 +148,14 @@
         <li>(<a href="https://github.com/chamilo/chamilo-lms/commit/a0665ba22eab4dde9daf7bf6f68c0dc003fce45c">a0665ba2</a>) Fix migration errors with extra_field table type</li>
     </ul>
     <h3>Stylesheets and theming</h3>
-    <p>None in this version.</p>
+        <p>None in this version.</p>
     <h3>Web services</h3>
-    <p>None in this version.</p>
+        <p>None in this version.</p>
     <h3>Removals</h3>
-    <p>None in this version.</p>
+        <p>None in this version.</p>
     <h3>Known issues</h3>
     <ul>
+        <li>An issue has been reported with the Wiris plugin and a fix has been submitted to Wiris by our team. See <a href="https://support.chamilo.org/issues/8480">CT#8480</a> if you need the fix</li>
         <li>IMS/QTI import/export has minor issues</li>
         <li>In Internet Explorer 9, learning paths might not show other pages than the first to be opened. We lacked computers with IE9 at the time of release of 1.10.8. Guaranteeing IE9 support will likely require additional services. See <a href="https://support.chamilo.org/issues/8075">the corresponding bug report</a></li>
         <li>The Xapian search module is broken. We'll fix that soon, but not a lot of people use it</li>

+ 1 - 1
documentation/credits.html

@@ -60,7 +60,7 @@ In the following credits, when possible, we tried to put the latest contributors
 <a name="core-developers"></a>
 <h1>Core contributors / Core team</h1>
 <p>The core contributors are the people who contributed most to the Chamilo software. We are eternally thankful to them for having demonstrated a very high level of commitment, contributing their time and ideas to the project. Since version 1.9, we also include non-developer contributors as we consider their help is essential to the success of our project. This list is updated with each version.</p>
-<h2>Chamilo LMS 1.10.*</h2>
+<h2>Chamilo LMS 1.11.*</h2>
 <ul>
   <li>Yannick Warnier (yannick.warnier@beeznest.com) - Technical coordinator, Project Leader - BeezNest, Belgium/Peru</li>
   <li>Julio Montoya (gugli100@gmail.com) - Lead developer - BeezNest, France</li>

+ 4 - 3
documentation/dependencies.html

@@ -64,16 +64,17 @@ We recommend using HTML5-compatible technology.
   <li>We recommend a Pentium-I as a minimum processor capability for PCs</li>
   <li>Works on Windows XP (SP3 recommended) and later versions, Linux (any version with a graphical interface), Mac OS (any version), FreeBSD, Android, iOS and pretty much any other operating system with a graphical interface you might think about</li>
   <li>Any modern browser (IE8 and inferior *excluded*).</li>
-  <li>Optional: Flash plugin (only required for a few features like the hotspot image question type and the audio recorder)</li>
-  <li>Optional: Java applet capability (only required in case you don't use the Flash version of the audio recorder)</li>
+  <li>Optional: Flash plugin (only required for a few features like the videoconference plugins)</li>
+  <li>Optional: Java applet capability (only required for some plugins)</li>
 </ul>
 
 <h2>Dependencies - server-side</h2>
 <ul>
   <li>Apache 2+</li>
-  <li> PHP 5.4 or higher with MySQL bindings (mysqlnd is recommended) and php-gd extension to allow Chamilo to resize pictures. Not tested with PHP 7.0 yet</li>
+  <li> PHP 5.4 or higher with MySQL bindings (mysqlnd is recommended) and php-gd extension to allow Chamilo to resize pictures. Now also supports PHP 7.0</li>
   <li>MySQL 5.1+ or any version of MariaDB database server</li>
   <li>php5-intl package (for international behaviour support)</li>
+  <li>php5-mbstring package (for international behaviour support)</li>
   <li>php5-imagick</li>
   <li>php5-curl (only required for a feature in the links tool and an optional installer check)</li>
   <li>php5-mcrypt (only required for a feature in the survey tool)</li>

+ 3 - 3
documentation/index.html

@@ -35,12 +35,12 @@
 <div class="container">
     <div class="row">
         <div class="hero-unit">
-            <h1>Chamilo 1.10 - Documentation</h1>
+            <h1>Chamilo 1.11 - Documentation</h1>
             <br />
 
             <a class="btn btn-primary btn-large" href="installation_guide.html">English installation guide</a>
-            <a class="btn btn-primary btn-large"  href="installation_guide_es_ES.html">Spanish installation guide (outdated)</a>
-            <a class="btn btn-primary btn-large" href="installation_guide_fr_FR.html">French installation guide (outdated)</a>
+            <a class="btn btn-primary btn-large"  href="installation_guide_es_ES.html">Spanish installation guide (slightly outdated)</a>
+            <a class="btn btn-primary btn-large" href="installation_guide_fr_FR.html">French installation guide (slightly outdated)</a>
             <a class="btn btn-primary btn-large"  href="installation_guide_it_IT.html">Italian installation guide (outdated)</a>
             <a class="btn btn-large"  href="http://www.chamilo.org/forum">Chamilo Forum</a>
             <br />

+ 105 - 57
documentation/installation_guide.html

@@ -3,10 +3,9 @@
     <meta charset="utf-8" />
     <title>Chamilo Installation Guide</title>
     <link rel="stylesheet" href="../web/assets/bootstrap/dist/css/bootstrap.css" type="text/css" media="screen,projection" />
+    <link rel="stylesheet" href="../web/assets/fontawesome/css/font-awesome.min.css" type="text/css" media="screen,projection" />
     <link rel="stylesheet" href="default.css" type="text/css" media="screen,projection" />
     <link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" />
-    <link href="js/prettify.css" type="text/css" rel="stylesheet" />
-    <script src="js/prettify.js" type="text/javascript"></script>
 </head>
 <body>
 <nav class="navbar navbar-default navbar-fixed-top">
@@ -103,6 +102,35 @@ only a specific database. Please refer to the MySQL or MariaDB documentation in
 <br />
 <span class="text-muted">Chamilo versions prior to 1.9.0 required to choose between multiple databases and a deprecated single-database mode.
     This has been cleaned up and simplified to one single database.</span><br />
+
+<h3><span style="font-weight: bold;">Apache's redirects</span></h3>
+    <p>
+        Since version 1.10, Chamilo requires the web server to be able to deal with redirects. This is now very common within web platforms (be them CMS, LMS, ERP, etc) and allows them, between other things, to use URLs in an efficient and user-friendly manner.<br />
+        If you don't use Apache as a web server, go to section "Rewrite configurations" at the end of this document.<br />
+        If you do use Apache, configuring redirects is done in two small steps:
+    <ul>
+        <li>Enable the "rewrite" module in Apache (on the command line, run "<i>sudo a2enmod rewrite</i>")</li>
+        <li>Configure the Apache's VirtualHost for your Chamilo to include the following block, which will allow .htaccess files within Chamilo to be interpreted</li>
+    </ul>
+    For Apache <=2.2:
+    <pre>
+    &lt;Directory /&gt;
+        AllowOverride All
+        Order allow,deny
+        allow from all
+    &lt;/Directory&gt;
+    </pre>
+    and for Apache >=2.4:
+    <pre>
+    &lt;Directory /&gt;
+        AllowOverride All
+        Require all granted
+    &lt;/Directory&gt;
+    </pre>
+    <br />
+    Once configured (and maybe this has already been done by your hosting provider), you can simply restart the web server to enable the change.
+    </p>
+
 <hr style="width: 100%; height: 2px;" />
 <h2><a name="2._Installation_of_Chamilo_LMS"></a><span style="font-weight: bold;">2. Installation of Chamilo LMS</span></h2>
 <p>
@@ -123,25 +151,42 @@ This guide only covers these 2 last methods. For other methods, you can always a
   <li><a href="https://chamilo.org/chamilo-lms/">Download Chamilo LMS</a></li>
   <li>Unzip it</li>
   <li>Copy the Chamilo directory in your web server's root directory. This can be
-    <span style="font-weight: bold;">C:\xampp\htdocs\</span> on a Windows server or <span style="font-weight: bold;">/var/www/html/</span> (or /var/www/chamilo/) on a Linux server</li>
+    <span style="font-weight: bold;">C:\xampp\htdocs\</span> on a Windows server or <span style="font-weight: bold;">/var/www/html/chamilo</span> (or /var/www/chamilo/) on a Linux server (You need to create the folder "chamilo")</li>
   <li>Verify your web server supports .htaccess files (see Rewrite section below)</li>
-  <li>Open your web browser (Internet Explorer, Firefox...) and type
-    <span style="font-weight: bold;">http://localhost/chamilo/</span> if you install locally or
-    <span style="font-weight: bold;">http://www.domain.com/chamilo/</span> if you install remotely*
+  <li>Open your web browser and type
+    <span style="font-weight: bold;">http://localhost/chamilo/</span> if you install locally for test purposes or
+    <span style="font-weight: bold;">http://www.your-chamilo-domain.com</span> if you install remotely*
     </li>
   <li>Follow the web installation process. You can accept all default values. Consider changing the admin password to remember it.&nbsp;</li>
 </ol>
 
-    <span class="text-muted">* We recommend defining a specific Virtual Host for this installation if you have the skills to do so</span>
-<br /><br />
+<h3>Recommendations</h3>
+<ul>
+    <li>We recommend defining a specific Virtual Host for this installation.</li>
+    <li>If you have to install multiple Chamilo instances, avoid the installation of Chamilo in a inside a folder, instead prefer the use of different domains or using subdomains examples:
+        <ol>
+            <li>http://www.my-domain.com/ (<i class="fa fa-check" aria-hidden="true"></i> recommended)</li>
+            <li>http://chamilo.my-domain.com (<i class="fa fa-check" aria-hidden="true"></i> recommended)</li>
+            <li>http://chamilo2.my-domain.com (<i class="fa fa-check" aria-hidden="true"></i> recommended)</li>
+            <li>http://www.my-domain.com/chamilo (<i class="fa fa-times" aria-hidden="true"></i> not recommended)</li>
+            <li>http://www.my-domain.com/chamilo2 (<i class="fa fa-times" aria-hidden="true"></i> not recommended)</li>
+            <li>http://chamilo.my-domain.com/my-chamilo/ (<i class="fa fa-times" aria-hidden="true"></i> not recommended)</li>
+        </ol>
+    </li>
+</ul>
+
+<br />
 <span class="text-muted">
     Note: if installing Chamilo locally using localhost or the IP address of your computer during the installation, you might get issues
     while accessing from another computer. To avoid this, you can
     <a href="https://beeznest.com/blog/2013/01/15/answering-to-different-addresses-with-chamilo/">apply a little change to your configuration file</a>.
 </span>
-<br /><br />
-The following directories need to be <b>readable, writeable and executable</b> by your web server.
-<span class="text-muted">This usually requires no specific action on Windows servers, but will require a "chmod" under Linux and Mac. See instructions below.</span><br /><br />
+
+
+<h3>Permissions</h3>
+
+<p>The following directories need to be <b>readable, writeable and executable</b> by your web server.
+This usually requires no specific action on Windows servers, but will require a "chmod" under Linux and Mac. See instructions below.</p>
     Replace [chamilo] with the directory where your Chamilo installation is located):
 <ul>
     <li>[chamilo]/app/</li>
@@ -154,12 +199,11 @@ enable sub-languages definition:
 <ul>
   <li>[chamilo]/main/lang/</li>
 </ul>
-<br />
-<span class="text-muted">If you find a tests/ directory at the root of your package, please delete it.
+<p>
+If you find a tests/ directory at the root of your package, please delete it.
 This is a development directory that has not been checked for security issues,
-an it should *never* be accessible to final users on a production server.</span>
-<br /><br />
-
+an it should *never* be accessible to final users on a production server.
+</p>
 <p><span class="text-muted">On Linux, Mac OS X and BSD operating systems you can use the <em>chmod 0775</em> command for this (although we recommend you seek advice from an
 experienced system administrator to avoid security issues). On Windows, you may need to check the properties of the folders (by right-clicking on them).</span></p>
 
@@ -200,25 +244,24 @@ To get the best out of Chamilo, you need to finetune your PHP settings. Consider
   <li>search the word "_max" and increase the following values to optimise the server</li>
 </ul>
 
-<div class="code">
-      max_execution_time = 300 ;Maximum execution time of each script, in seconds<br />
-      max_input_time = 600 ;Maximum amount of time each script may spend parsing request data<br />
-      memory_limit = 256M ;Maximum amount of memory a script may consume (128MB)<br />
-      post_max_size = 100M<br />
-      upload_max_filesize = 100M;<br />
-      short_open_tag       = Off<br />
-      safe_mode            = Off<br />
-      magic_quotes_gpc     = Off<br />
-      magic_quotes_runtime = Off<br />
-</div>
-<br />
+<pre>
+    max_execution_time = 300; Maximum execution time of each script, in seconds
+    max_input_time = 600; Maximum amount of time each script may spend parsing request data
+    memory_limit = 256M; Maximum amount of memory a script may consume (128MB)
+    post_max_size = 100M
+    upload_max_filesize = 100M;
+    short_open_tag       = Off
+    safe_mode            = Off
+    magic_quotes_gpc     = Off
+    magic_quotes_runtime = Off</pre>
+
 <p><strong>Important:</strong> You need to set
 your <em>date.timezone</em> setting to whatever your server's timezone is. For example, if your server is in the 'America/New_York' timezone,
     set the date.timezone parameter to this value in your php.ini:</p>
 
-<div class="code">
+<pre>
 date.timezone = 'America/New_York'
-</div>
+</pre>
 <br />
 <p><strong>Note:</strong> <span class="text-muted">PHP 5.3.9 introduces a new setting "max_input_vars", which limits the number of elements you can send in one single form. If you are dealing with numerous users or very long learning paths (many items), make sure you set this setting higher than its default value of 1000.</span></p>
 
@@ -261,7 +304,7 @@ need, we highly recommend you contact them (see reference below).</div>
 <br />
 <div class="text-muted"> NOTE: This version of Chamilo can only be used to upgrade
 from earlier versions of Chamilo 1.9.*. You cannot use the normal
-upgrade scripts from Chamilo 1.10 to upgrade from Chamilo 1.8.* or even Dok€os 2.0
+upgrade scripts from Chamilo 1.11 to upgrade from Chamilo 1.8.* or even Dok€os 2.0
 (which was born after the split with Chamilo). If you need this, please contact one
 of the Chamilo Association's <a href="https://chamilo.org/providers">official providers</a>)</div>
 <p></p>
@@ -323,9 +366,9 @@ some manual work, but the upgrade procedure will not touch sublanguages directly
 <ul>
   <li> make sure you don't have tables from previous versions of Chamilo still hanging around. These can cause the upgrade to fail. In particular, tables from versions 1.8.* could have multiple tables for each course, resulting in many tables with the same prefix. Only tables without prefix or with a "c_" prefix exist in 1.9 and superior versions. Make sure none of these tables persist. Take a backup of your database (just in case) and delete these prefixed tables (drop table ...).</li>
   <li> check that you haven't left any customised stylesheet or image <span class="text-muted">(if you have, make sure you keep a copy on the side*)</span></li>
-  <li> download the Chamilo 1.10 install package from the <a href="http://www.chamilo.org/download">Chamilo download page</a></li>
-  <li> unzip the new files of Chamilo 1.10 over the files of the older version (or unzip the files in one folder and then copy the files from there to the older version's directory)</li>
-  <li> make *absolutely sure* that the .htaccess file of version 1.10 is copied as well</li>
+  <li> download the Chamilo 1.11 install package from the <a href="http://www.chamilo.org/download">Chamilo download page</a></li>
+  <li> unzip the new files of Chamilo 1.11 over the files of the older version (or unzip the files in one folder and then copy the files from there to the older version's directory)</li>
+  <li> make *absolutely sure* that the .htaccess file of version 1.11 is copied as well</li>
   <li> make sure "AllowOverride All" is present in your Apache configuration, as interpreting the .htaccess files is very important for Chamilo to work (note that the Order-Allow directive has been replaced by "Require all granted" in Apache 2.4)</li>
   <li> point your browser on your portal URL + main/install/</li>
   <li> click&nbsp;<span style="font-style: italic;">Install</span>, then choose <span style="font-style: italic;">Upgrade from 1.9.*</span></li>
@@ -355,7 +398,7 @@ Do not delete the previous Chamilo installation directory before installing
 the new one. The upgrade process should take care of all unrequired folders.</p>
 
 <h3>3.4 Upgrading from Chamilo 1.8.x</h3>
-To upgrade from version of Chamilo prior to 1.9.0, you will need to first upgrade them to 1.9.10.x, then upgrade again (separately) to 1.10.x.
+To upgrade from version of Chamilo prior to 1.9.0, you will need to first upgrade them to 1.9.10.x, then upgrade again (separately) to 1.11.x.
 You can find the 1.9.10.x packages here: <a href="https://github.com/chamilo/chamilo-lms/releases">https://github.com/chamilo/chamilo-lms/releases</a>
 
 <p></p>
@@ -383,14 +426,10 @@ In Windows, you may need to check the properties of the folders.
 <h2><a name="4._Troubleshooting"></a>4. Troubleshooting</h2>
 
 
-<p>If you have&nbsp;problems, go to the <a href="https://chamilo.org">Chamilo website</a> and ask a question on the
+<p>If you have problems, go to the <a href="https://chamilo.org">Chamilo website</a> and ask a question on the
 <a href="https://chamilo.org/forum">support forum</a>. Please read the previous messages first to see if there is
 already an answer to your question.</p>
 
-
-<h2></h2>
-
-
 <hr style="width: 100%; height: 2px;" />
 <h2><a name="5._Administration_section"></a>5. Administration section</h2>
 
@@ -419,16 +458,16 @@ Newer distributions also allow downloading rpms for additional packages.</p>
 <p class="text-muted">Note: Please check
 the LDAP configuration settings inside Chamilo to learn the details.</p>
 
-<p>
-In [Chamilo folder]/app/config/configuration.php, around line 93, you'll find settings like the following: <br />
 
-// -> Uncomment the two lines below to activate LDAP AND edit main/inc/conf/auth.conf.php for configuration<br />
-// $extAuthSource["extldap"]["login"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/login.ldap.php";<br />
-// $extAuthSource["extldap"]["newUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/newUser.ldap.php";<br />
-<br />
+In [Chamilo folder]/app/config/configuration.php, around line 93, you'll find settings like the following: <br />
+<pre>
+// -> Uncomment the two lines below to activate LDAP AND edit main/inc/conf/auth.conf.php for configuration
+// $extAuthSource["extldap"]["login"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/login.ldap.php";
+// $extAuthSource["extldap"]["newUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/newUser.ldap.php";
+</pre>
 
 remove the // from the last two lines to activate LDAP.<br />
-</p>
+
 
 
 <h3><b>Settings</b></h3>
@@ -595,8 +634,10 @@ This can easily be modified by editing the app/config/configuration.php file, fi
 Feel free to change this to<br />
 <pre>// Custom name_order_conventions
 $_configuration['name_order_conventions'] = array(
- 'french' => array('format' => 'first_name last_name', 'sort_by' => 'last_name')
-);</pre><br />
+  'french' => array('format' => 'first_name last_name', 'sort_by' => 'last_name')
+);
+</pre>
+<br />
 for example. The effect should be immediate.
 </p>
 Please note that, although Chamilo allows you to define its position, the "title" field does not exist at this time, so no need to worry about it.
@@ -632,7 +673,7 @@ If you have issues with files taking a long time to download, make sure you reco
 <hr style="width: 100%; height: 2px;" />
     <h2><a name="16._Rewrite"></a>Rewrite</h2>
     <p>
-    Chamilo LMS 1.10 is the first version to require the web server to allow redirections of requests.<br />
+    Chamilo LMS 1.10 is the first version to require the web server to allow redirections of requests (and so 1.11 does as well).<br />
     For Apache, this is done through enabling the Rewrite module and either allowing overrides (through .htaccess) or adding a specific configuration section to the VirtualHost defined for Apache.<br />
     For Nginx, this is done through specific redirection rules in the corresponding virtual host (server clause).<br /><br />
     To make sure this isn't too complex for anyone, we recommend a configuration below to help you out in both cases.
@@ -643,19 +684,23 @@ If you have issues with files taking a long time to download, make sure you reco
     <p>
         To enable .htaccess on Apache, you just need to check 1 thing: In a &lt;Directory&gt; block of the root folder of Chamilo, ensure the following lines are present:
         <pre>
+    &lt;Directory /&gt;
         AllowOverride All
 		Order allow,deny
 		allow from all
-        </pre>
+    &lt;/Directory&gt;
+    </pre>
     or, if you are working with Apache 2.4, that syntax changed a little and looks more like this:
     <pre>
+    &lt;Directory /&gt;
         AllowOverride All
         Require all granted
+    &lt;/Directory&gt;
     </pre>
     </p>
     <h3>Apache RewriteRules</h3>
     <pre>
-          &lt;LocationMatch "/.git*"&gt;
+  &lt;LocationMatch "/.git*"&gt;
 	order deny,allow
 	deny from all
   &lt;/LocationMatch&gt;
@@ -672,15 +717,20 @@ If you have issues with files taking a long time to download, make sure you reco
 	RewriteRule ^certificates/$ certificates/index.php?id=%1 [L]
 	RewriteRule ^courses/([^/]+)/$ main/course_home/course_home.php?cDir=$1 [QSA,L]
 	RewriteRule ^courses/([^/]+)/index.php$ main/course_home/course_home.php?cDir=$1 [QSA,L]
+	RewriteRule ^courses/([^/]+)/document/certificates/(.*)$ app/courses/$1/document/certificates/$2 [QSA,L]
 	RewriteRule ^courses/([^/]+)/document/(.*)$ main/document/download.php?doc_url=/$2&cDir=$1 [QSA,L]
+	RewriteRule ^courses/([^/]+)/scorm/(.*)$ main/document/download_scorm.php?doc_url=/$2&cDir=$1 [QSA,L]
 	RewriteRule ^courses/([^/]+)/work/(.*)$ main/work/download.php?file=work/$2&cDir=$1 [QSA,L]
-	RewriteRule ^courses/([^/]+)/upload/(.*)$ main/courses/$1/upload/$2 [QSA,L]
-	RewriteRule ^courses/([^/]+)/course-pic85x85.png$ main/courses/$1/course-pic85x85.png [QSA,L]
+	RewriteRule ^courses/([^/]+)/upload/(.*)$ app/courses/$1/upload/$2 [QSA,L]
+	RewriteRule ^courses/([^/]+)/course-pic85x85.png$ app/courses/$1/course-pic85x85.png [QSA,L]
 	RewriteRule ^courses/([^/]+)/course-pic.png$ app/courses/$1/course-pic.png [QSA,L]
+	RewriteRule ^main/upload/users/(.*)/(.*)/my_files/(.*)$ app/upload/users/$1/$2/my_files/$3 [QSA,L]
 	RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
     RewriteRule ^badge/(\d{1,})/user/(\d{1,}) main/badge/issued.php?skill=$1&user=$2 [L]
+	RewriteRule ^main/admin/$ main/admin/index.php [QSA,L]
     RewriteRule ^main/exercice/(.+)$ main/exercise/$1 [QSA,L]
     RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L]
+	RewriteRule ^courses/(.*)$ app/courses/$1 [QSA,L]
   &lt;/Directory&gt;
     </pre>
     <h3>Nginx</h3>
@@ -769,8 +819,7 @@ If you have issues with files taking a long time to download, make sure you reco
         You cannot, however, only allow .htaccess files in the main httpd.conf file, as OS X will override it with the
         domain-specific configuration file.
     </p>
-<hr style="width: 100%; height: 2px;" />
-    <hr style="width: 100%; height: 2px;" />
+
     <h2><a name="17._Git_Upgrade"></a>Upgrading from Git</h2>
     <p>If you have sufficient experience with Git and have installed your initial Chamilo portal
         from the Git version, you might want to upgrade from 1.9.x to 1.11.x using Git directly.<br />
@@ -794,7 +843,6 @@ If you have issues with files taking a long time to download, make sure you reco
   <br />
 </p>
 <hr />
-
 </div>
 
 <hr />

+ 52 - 18
documentation/installation_guide_es_ES.html

@@ -112,6 +112,33 @@ Nota:Esto se ha simplificado en gran medida desde la versión 1.9, ya que antes
     múltiples bases de datos y un modo obsoleto de una sola base de datos.
 </p>
 
+<h3><span style="font-weight: bold;">Redirecciones de Apache</span></h3>
+<p>
+    Desde su versión 1.10, Chamilo requiere del servidor web que pueda gestionar redirecciones. Es algo muy comunes entre todos los sistemas web (ya sean CMS, LMS, ERP, etc) que permite, entre otras cosas, el uso inteligente y amigable de las URLs.<br />
+    Si no usa Apache, debería consultar la sección "Configuraciones opcionales para Apache y Nginx" al fin de este documento.<br />
+    Si usa Apache, configurar las redirecciones consta de dos pasos:
+    <ul>
+        <li>Activar el módulo "rewrite" de Apache (en línea de comando con "<i>sudo a2enmod rewrite</i>")</li>
+        <li>Configurar el VirtualHost de Apache para que incluya el bloque siguiente, autorizando la interpretación de los archivos .htaccess</li>
+    </ul>
+    Para Apache <=2.2:
+    <pre>
+    &lt;Directory /&gt;
+        AllowOverride All
+        Order allow,deny
+        allow from all
+    &lt;/Directory&gt;
+    </pre>
+    y para Apache >=2.4:
+    <pre>
+    &lt;Directory /&gt;
+        AllowOverride All
+        Require all granted
+    &lt;/Directory&gt;
+    </pre>
+    <br />
+    Una vez configurada esta parte (que quizás ya esté configurada por su proveedor), basta con reiniciar el servidor web para activar el cambio.
+</p>
 
 <hr style="width: 100%; height: 2px;" />
 <h2><a name="2._Installation_of_Chamilo_LMS"></a><span style="font-weight: bold;">2. Instalación de Chamilo LMS</span></h2>
@@ -192,7 +219,7 @@ del clic derecho en ellos).
   <li><strong>Proteger su directorio de configuración: </strong> asegurarse que nadie pueda sobreescribirlo. Usted puede encontrar el directorio de configuración en (carpeta de chamilo)/main/inc/conf. Hacerlo de solo lectura (windows/xwindows: clic derecho en el archivo para editar las propiedades. linux/bsd/macosx: usar el comando chmod 0555). El archivo de configuración es creado por el servidor web (Apache + PHP, normalmente), por lo tanto usted necesita ser administrador para cambiar sus permisos.</li>
   <li><strong>Configurar su instalación de Chamilo: </strong>
 en la sección de administración de Chamilo, usted puede usar las Opciones de Configuración de Chamilo para ajustar el comportamiento de su instalación.</li>
-  <li>Consulte nuestra nueva <a href="security_guide.html">guia de seguridad</a> para más información.</li>
+  <li>Consulte nuestra nueva <a href="security.html">guia de seguridad</a> para más información.</li>
 </ul>
 </p>
 
@@ -281,25 +308,25 @@ tomar una copia de backup de estos cambios antes de actualizar.</p>
 NOTA: Esta versión de Chamilo sólo se puede utilizar para actualizar desde versiones inferiores de Chamilo 1.9.*. Por ejemplo, no puede utilizar los scripts de actualización normales de Chamilo 1.9 para actualizar desde Dok€oS 2.0. Si usted necesita esto, por favor póngase en contacto con uno de los proveedores oficiales de la Asociación Chamilo)
 </div>
 
-<h3>3.1 Actualizar desde Chamilo 1.10.x (actualización menor)</h3>
+<h3>3.1 Actualizar desde Chamilo 1.11.x (actualización menor)</h3>
 <p>
-Dado que se trata sólo de un cambio de versión menor  previa de Chamilo 1.10.*, lo único que tiene que hacer es:
+Dado que se trata sólo de un cambio de versión menor previa de Chamilo 1.11.*, lo único que tiene que hacer es:
 <ul>
 <li>Revisar que no ha dejado alguna hoja de estilo personalizada o imagen (si es que tiene, asegúrese de guardar una copia de respaldo)</li>
 <li>Descargar el paquete de instalación de Chamilo 1.9 desde la página de descarga de Chamilo</li>
 <li>Descomprimir los nuevos archivos de Chamilo 1.9 sobre los archivos de la versión anterior (o descomprimirlos en una nueva carpeta y después copiarlos sobre los archivos de la versión anterior)</li>
-<li>Editar el archivo main/inc/conf/configuration.php: hacia el final del archivo, localizar el número de la versión (p.e. ‘1.9.4’) y cambiarlo por la nueva versión (p.e.‘1.9.8’)</li>
+<li>Editar el archivo app/config/configuration.php: hacia el final del archivo, localizar el número de la versión (p.e. ‘1.9.4’) y cambiarlo por la nueva versión (p.e.‘1.9.8’)</li>
 <li>Ya está! Ningún otro procedimiento de actualización es requerido.</li>
 </ul>
 </p>
 
-<h3>3.2 Actualizar desde Chamilo 1.9.x</h3>
+<h3>3.2 Actualizar desde Chamilo 1.9.x p 1.10.x</h3>
 <ul>
   <li>Asegúrese que ninguna tabla de una versión anterior (a la 1.9) exista en su base de datos. Estas tablas pueden causar errores durante el proceso de actualización hacia versiones superiores. En particular, las tablas de versiones 1.8.* y anteriores podían repetirse una vez por curso, resultando en una gran cantidad de tablas que compartían el mismo prefijo. Solo las tablas sin prefijo o con un prefijo "c_" son legítimas en Chamilo 1.9 y siguientes. Asegúrese de que ninguna de estas antiguas tablas persista. Tóme una copia de seguridad de la base de datos (por si a caso) y luego borre estas tablas con prefijo (drop table ...).</li>
   <li>Compruebe que no ha dejado ninguna hoja de estilo o imagen personalizada (si la tuviera, asegúrese de realizar una copia de respaldo*)</li>
   <li>Descargue el paquete de instalación de Chamilo 1.9 desde la página de descarga de Chamilo</li>
   <li>Descomprima los nuevos ficheros de Chamilo 1.9 sobre los ficheros de la antigua versión ( o descomprima en una carpeta y luego copie los archivos en el directorio de la versión antigua)</li>
-  <li>Asegúrese *por completo* que el archivo .htaccess de la versión 1.10 ha sido copiado en la raíz también</li>
+  <li>Asegúrese *por completo* que el archivo .htaccess de la versión 1.11 ha sido copiado en la raíz también</li>
   <li>Asegúrese que "AllowOverride All" está presente en su configuración de Apache, ya que interpretar el archivo .htaccess es muy importante para que Chamilo funcione (ojo que la directiva Order-Allow ha sido remplazada por "Require all granted" en Apache 2.4)</li>
   <li>Escriba en su navegador web la URL de su portal + main/install/</li>
   <li>Elija su idioma y haga click sobre Actualizar desde 1.9.x</li>
@@ -320,7 +347,7 @@ Dado que se trata sólo de un cambio de versión menor  previa de Chamilo 1.10.*
 <br />
 
 <h3>3.3 Actualizar desde Chamilo o Dok€os 1.8.x</h3>
-Para actualizar desde una versión previa a la 1.9.0, deberá a partir de ahora primero actualizar a la versión 1.9.10.x, para luego actualizar de ahí a la 1.10.x.
+Para actualizar desde una versión previa a la 1.9.0, deberá a partir de ahora primero actualizar a la versión 1.9.10.x, para luego actualizar de ahí a la 1.11.x.
 Podrá encontrar una versión descargable de 1.9.10.x aquí: <a href="https://github.com/chamilo/chamilo-lms/releases">https://github.com/chamilo/chamilo-lms/releases</a>
 
 <h3>3.4 En ambos últimos casos</h3>
@@ -395,7 +422,7 @@ Distribuciones nuevas también permiten descargar rpms para los paquetes adicion
 
 <p><span>Nota:</span>El mecanismo de LDAP ha cambiado en 1,9. Como resultado, parte de la información siguiente puede no ser correcta. Por favor, compruebe los ajustes de configuración dentro de Chamilo para conocer los detalles.</p>
 <p>
-En (la carpeta de Chamilo)/main/inc/conf/configuration.php, aproximadamente en la line 90, se puede ver<br />
+En (la carpeta de Chamilo)/app/config/configuration.php, aproximadamente en la line 90, se puede ver<br />
 //for new login module<br />
 //uncomment these to activate ldap<br />
 //$extAuthSource['ldap']['login'] = "./main/auth/ldap/login.php";<br />
@@ -700,7 +727,8 @@ por ejemplo. El efecto debería ser inmediato.
   location / {
     rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
     rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last;
-    rewrite ^/badge/(\d+)/user/(\d+)$ /main/badge/issued.php?skill=$1&user=$2 last;
+    rewrite ^/skill/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last;
+    rewrite ^/badge/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last;
     try_files $uri @rewrite;
   }
 
@@ -716,6 +744,7 @@ por ejemplo. El efecto debería ser inmediato.
     rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
     rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last;
     rewrite ^/session/([^/]+)/about/?$ /main/session/about.php?session_id=$1 last;
+    rewrite ^/badge/([^/]+) /main/badge/issued.php?issue=$1 last;
     rewrite ^/main/exercice/(.+)$ /main/exercise/$1 last;
     rewrite ^/main/newscorm/(.+)$ /main/lp/$1 last;
 
@@ -748,15 +777,15 @@ por ejemplo. El efecto debería ser inmediato.
   }
 </pre>
 
-Apache2: La configuración para nuestro sitio de ejemplo my.chamilo10.net sería la siguiente:
+Apache2: La configuración para nuestro sitio de ejemplo my.chamilo.net sería la siguiente:
 
 <pre>
 &lt;VirtualHost *:80&gt;
   ServerAdmin root@localhost
-  DocumentRoot /var/www/my.chamilo10.net/www
-  ServerName my.chamilo10.net
-  ErrorLog  /var/log/apache2/my.chamilo10.net-error.log
-  CustomLog /var/log/apache2/my.chamilo10.net-access.log combined
+  DocumentRoot /var/www/my.chamilo.net/www
+  ServerName my.chamilo.net
+  ErrorLog  /var/log/apache2/my.chamilo.net-error.log
+  CustomLog /var/log/apache2/my.chamilo.net-access.log combined
 
   ErrorDocument 401 /public/error-401.html
   DirectoryIndex index.php index.html
@@ -772,22 +801,27 @@ Apache2: La configuración para nuestro sitio de ejemplo my.chamilo10.net sería
 	Options -Indexes
   &lt;/Directory&gt;
 
-  &lt;Directory "/var/www/my.chamilo10.net/www"&gt;
+  &lt;Directory "/var/www/chamilo"&gt;
 	RewriteEngine On
 	RewriteCond %{QUERY_STRING} ^id=(.*)$
 	RewriteRule ^([^/.]+)/?$ user.php?$1 [L]
 	RewriteRule ^certificates/$ certificates/index.php?id=%1 [L]
 	RewriteRule ^courses/([^/]+)/$ main/course_home/course_home.php?cDir=$1 [QSA,L]
 	RewriteRule ^courses/([^/]+)/index.php$ main/course_home/course_home.php?cDir=$1 [QSA,L]
+	RewriteRule ^courses/([^/]+)/document/certificates/(.*)$ app/courses/$1/document/certificates/$2 [QSA,L]
 	RewriteRule ^courses/([^/]+)/document/(.*)$ main/document/download.php?doc_url=/$2&cDir=$1 [QSA,L]
+	RewriteRule ^courses/([^/]+)/scorm/(.*)$ main/document/download_scorm.php?doc_url=/$2&cDir=$1 [QSA,L]
 	RewriteRule ^courses/([^/]+)/work/(.*)$ main/work/download.php?file=work/$2&cDir=$1 [QSA,L]
-	RewriteRule ^courses/([^/]+)/upload/(.*)$ main/courses/$1/upload/$2 [QSA,L]
-	RewriteRule ^courses/([^/]+)/course-pic85x85.png$ main/courses/$1/course-pic85x85.png [QSA,L]
+	RewriteRule ^courses/([^/]+)/upload/(.*)$ app/courses/$1/upload/$2 [QSA,L]
+	RewriteRule ^courses/([^/]+)/course-pic85x85.png$ app/courses/$1/course-pic85x85.png [QSA,L]
 	RewriteRule ^courses/([^/]+)/course-pic.png$ app/courses/$1/course-pic.png [QSA,L]
+	RewriteRule ^main/upload/users/(.*)/(.*)/my_files/(.*)$ app/upload/users/$1/$2/my_files/$3 [QSA,L]
 	RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
     RewriteRule ^badge/(\d{1,})/user/(\d{1,}) main/badge/issued.php?skill=$1&user=$2 [L]
+	RewriteRule ^main/admin/$ main/admin/index.php [QSA,L]
     RewriteRule ^main/exercice/(.+)$ main/exercise/$1 [QSA,L]
     RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L]
+	RewriteRule ^courses/(.*)$ app/courses/$1 [QSA,L]
   &lt;/Directory&gt;
 
   php_value display_errors Off
@@ -798,7 +832,7 @@ Apache2: La configuración para nuestro sitio de ejemplo my.chamilo10.net sería
   # E_ALL:  php_admin_value error_reporting 6143
   # E_ALL & ^E_NOTICE:
   php_admin_value error_reporting 6135
-  #php_admin_value session.save_path /var/www/my.chamilo10.net/sessions/
+  #php_admin_value session.save_path /var/www/my.chamilo.net/sessions/
   php_admin_value short_open_tag Off
   php_value session.cookie_httponly 1
 

+ 56 - 23
documentation/installation_guide_fr_FR.html

@@ -5,8 +5,6 @@
         <link rel="stylesheet" href="../web/assets/bootstrap/dist/css/bootstrap.css" type="text/css" media="screen,projection" />
         <link rel="stylesheet" href="default.css" type="text/css" media="screen,projection" />
         <link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" />
-        <link href="js/prettify.css" type="text/css" rel="stylesheet" />
-        <script src="js/prettify.js" type="text/javascript"></script>
 
     </head>
     <body>
@@ -138,6 +136,34 @@
                 et une installation obsolète sur une seule base. Ca a été clarifié et simplifié par l'usage d'une seule base de données.
             </span><br />
 
+            <h3><span style="font-weight: bold;">Redirections d'Apache</span></h3>
+            <p>
+                Depuis sa version 1.10, Chamilo exige que le serveur web puisse gérer les redirections. Il s'agit d'un pré-requis très commun de nos jours pour les applications web (autant CMS que LMS, ERP, etc) qui permet, entre autres, l'utilisation intelligente et user-friendly des URLs.<br />
+                Si vous utilisez un autre serveur web qu'Apache, dirigez-vous à la section "Configuration de la réécriture" en fin de ce document.<br />
+                Si vous utilisez Apache, la configuration des redirections se fait en deux étapes simples:
+            <ul>
+                <li>Activer le module "rewrite" d'Apache (en ligne de commande, faites simplement un "<i>sudo a2enmod rewrite</i>")</li>
+                <li>Configurer le VirtualHost d'Apache pour qu'il inclue le bloc suivant, ce qui permettra l'interprétation des fichiers .htaccess</li>
+            </ul>
+            Pour Apache <=2.2:
+            <pre>
+    &lt;Directory /&gt;
+        AllowOverride All
+        Order allow,deny
+        allow from all
+    &lt;/Directory&gt;
+    </pre>
+            et pour Apache >=2.4:
+            <pre>
+    &lt;Directory /&gt;
+        AllowOverride All
+        Require all granted
+    &lt;/Directory&gt;
+    </pre>
+            <br />
+            Une fois configurée cette partie (qui est peut-être déjà mise en place par votre fournisseur d'hébergement), il suffit de redémarrer le serveur web pour activer la modification.
+            </p>
+
             <hr style="width: 100%; height: 2px;" />
             <h2><a name="2._Installation_of_Chamilo_LMS"></a><span style="font-weight: bold;">2. Installation de Chamilo LMS</span></h2>
 
@@ -328,7 +354,7 @@
             sauvegarde de votre installation (répertoires et bases de données).
             Si vous ne savez pas comment faire, consultez votre fournisseur d'hébergement
             ou un administrateur système qualifié avant de continuer l'installation.<br /><br />
-            <em>Chamilo LMS 1.10 est livré avec une nouvelle structure de bases de données
+            <em>Chamilo LMS 1.10 (et donc 1.11) est livré avec une nouvelle structure de bases de données
                 en comparaison avec 1.8. Bien que le script de migration la prenne
                 complètement en charge, il pourrait générer une surcharge sur votre serveur
                 durant la mise à jour, et il changera la base de données de façon assez
@@ -340,7 +366,7 @@
                 votre système avant la mise à jour.</em>
             <br />
             <br />
-            Notez également que Chamilo LMS 1.10 agrège les fichiers du dossier
+            Notez également que Chamilo LMS 1.10 (et donc 1.11) agrège les fichiers du dossier
             main/lang en un fichier unique par langue. Si vous avez modifiez les fichiers de langue directement (plutôt que
             d'utiliser la méthode recommandée des sous-langages), vous devriez faire une copie
             des traductions modifiées avant la mise à jour. Les sous-langages nécessitent également
@@ -354,15 +380,15 @@
                 références ci-dessous).</div>
             <div class="text-muted">
                 NOTE: Cette version de Chamilo peut seulement être utilisée pour mettre à jour des versions antérieures de Chamilo ou de Dok€os.
-                Par exemple vous ne pouvez pas utiliser les scripts de mise à jour normaux de Chamilo 1.10 pour effectuer une mise à jour depuis Dok€os 2.0 (dont la sortie est ultérieure à celle de la création de Chamilo).
+                Par exemple vous ne pouvez pas utiliser les scripts de mise à jour normaux de Chamilo 1.11 pour effectuer une mise à jour depuis Dok€os 2.0 (dont la sortie est ultérieure à celle de la création de Chamilo).
                 Si vous avez besoin de   ce genre de choses, nous vous conseillons de contacter <a href="https://chamilo.org/providers">les fournisseurs officiels de l'Association Chamilo</a>)
             </div>
 
             <p></p>
 
-            <h3>3.1 Mettre à jour depuis Chamilo 1.10.x (upgrade mineure)</h3>
+            <h3>3.1 Mettre à jour depuis Chamilo 1.11.x (upgrade mineure)</h3>
             Comme cette version est une version mineure de Chamilo par rapport à une
-            quelconque version 1.10.*, les seuls pas à suivre sont:
+            quelconque version 1.11.*, les seuls pas à suivre sont:
             <ul>
                 <li> 
                     vérifier que vous n'avez pas créé une version modifiée d'une feuille de
@@ -370,27 +396,27 @@
                         écrasée par la mise à jour. Gardez-en une copie que vous renommerez au
                         moment de la replacer dans le répertoire main/css/)</span>
                 </li>
-                <li> téléchargez le paquet d'installation de Chamilo 1.10 depuis la
+                <li> téléchargez le paquet d'installation de Chamilo 1.11 depuis la
                     <a href="http://www.chamilo.org/download">page de téléchargement de Chamilo</a></li>
-                <li> dézippez les nouveaux fichiers de Chamilo 1.10 par dessus les fichiers de
+                <li> dézippez les nouveaux fichiers de Chamilo 1.11 par dessus les fichiers de
                     l'ancienne version (ou dézippez les fichiers dans un répertoire et copiez-les ensuite
                     là où se trouve votre version actuelle de Chamilo)</li>
-                <li> éditez le fichier main/inc/conf/configuration.php: à la fin du fichier,
-                    localisez le numéro de version antérieur (p.ex. '1.10.4') et remplacez-le
-                    par le numéro de la nouvelle version (p.ex. '1.10.8')</li>
+                <li> éditez le fichier app/config/configuration.php: à la fin du fichier,
+                    localisez le numéro de version antérieur (p.ex. '1.11.0') et remplacez-le
+                    par le numéro de la nouvelle version (p.ex. '1.11.2')</li>
                 <li> Videz votre dossier archive/ : faites une copie temporaire de index.html, supprimez touss les contenus *dans* ce dossier (ne supprimer pas le dossier, juste ses contenus). Vous pouvez également vider ce dossier depuis le lien "Vidange du répertoire archive" du bloc "Système" de l'interface d'administration.</li>
                 <li> fini! Il n'y a pas d'autre procédure requise</li>
             </ul>
 
             <br />
 
-            <h3>3.2 Mettre à jour depuis Chamilo 1.9.x</h3>
+            <h3>3.2 Mettre à jour depuis Chamilo 1.9.x ou 1.10.x</h3>
             <ul>
                 <li> assurez-vous qu'aucune table ne persiste d'une version antérieure de Chamilo. Ces tables peuvent en effet causer une erreur durant la mise à jour. En particulier, les tables des versions 1.8.* et antérieures pouvaient se répéter une fois par cours, résultant en un grand nombre de tables partageant le même préfixe. Seules les tables sans préfixe ou avec un préfixe "c_" sont légitimes dans les versions 1.9 et supérieures. Assurez-vous qu'aucune de ces anciennes tables ne persiste. Prenez une copie de sauvegarde de votre base de données (au cas où) puis supprimez-les (drop table ...).</li>
                 <li> vérifiez que vous n'avez pas laissé de feuille de style personnalisée ou d'image <span class="text-muted">(le cas échant, faites-en une sauvegarde*)</span></li>
-                <li> télécharger le paquet Chamilo 1.10 depuis la <a href="http://www.chamilo.org/download">page de téléchargement de Chamilo</a></li>
-                <li> décompressez les nouveaux fichiers de Chamilo 1.10 sur les fichiers de votre ancienne installation (ou décompressez les dans un nouveau dossier et copier les fichiers extraits sur les anciens fichiers).</li>
-                <li> vérifiez que le fichier .htaccess de la version 1.10 a bien été copié</li>
+                <li> télécharger le paquet Chamilo 1.11 depuis la <a href="http://www.chamilo.org/download">page de téléchargement de Chamilo</a></li>
+                <li> décompressez les nouveaux fichiers de Chamilo 1.11 sur les fichiers de votre ancienne installation (ou décompressez les dans un nouveau dossier et copier les fichiers extraits sur les anciens fichiers).</li>
+                <li> vérifiez que le fichier .htaccess de la version 1.11 a bien été copié</li>
                 <li> vérifiez que "AllowOverride All" est présent dans votre configuration Apache, car l'interprétation du fichier .htaccess est capitale pour le fonctionnement de Chamilo</li>
                 <li> accéder à l'adresse de votre portail URL + main/install </li>
                 <li> Choisissez votre langue et cliquez sur <span style="font-style: italic;">Mettre à jour depuis la version 1.8.x / 1.9.x</span></li>
@@ -422,7 +448,7 @@
 
             <h3>3.3 Mettre à jour depuis Chamilo 1.8.x</h3>
             Pour mettre à jour depuis une version antérieure à la 1.9.0, vous devrez commencer par la mettre à jour vers la version 1.9.10.x,
-            et seulement alors mettre à jours vers la 1.10.x.
+            et seulement alors mettre à jours vers la 1.11.x.
             Vous pouvez trouver une version téléchargeable de 1.9.10.x ici: <a href="https://github.com/chamilo/chamilo-lms/releases">https://github.com/chamilo/chamilo-lms/releases</a>
             <p></p>
             <h3>3.4 Dans les deux derniers cas</h3>
@@ -694,7 +720,7 @@ If you have issues with files taking a long time to download, make sure you reco
 
 <h2><a name="16._Rewrite"></a>Réécriture</h2>
 <p>
-    Chamilo LMS 1.10 est la première version nécessitant que le serveur web autorise les redirections d'url.<br />
+    Chamilo LMS 1.10 est la première version nécessitant que le serveur web autorise les redirections d'url (et donc 1.11 également).<br />
     Pour Apache, il s'agit d'active le module rewrite et d'autoriser l'utilisation des fichiers .htaccess ou d'ajouter une section spécifique dans le Virtual Host.<br />
     Pour Nginx, il s'agit de définir les règles de redirections dans le Virtual Host.<br /><br />
     Pour être certain que c'est à la portée de tous, nous recommandons le fichier de configuration ci-dessous pour vous aider dans les deux cas.
@@ -717,7 +743,7 @@ ou, si vous travaillez avec Apache 2.4, la syntaxe est légèrement différente
 </p>
 <h3>Apache RewriteRules</h3>
 <pre>
-          &lt;LocationMatch "/.git*"&gt;
+  &lt;LocationMatch "/.git*"&gt;
 	order deny,allow
 	deny from all
   &lt;/LocationMatch&gt;
@@ -734,15 +760,20 @@ ou, si vous travaillez avec Apache 2.4, la syntaxe est légèrement différente
 	RewriteRule ^certificates/$ certificates/index.php?id=%1 [L]
 	RewriteRule ^courses/([^/]+)/$ main/course_home/course_home.php?cDir=$1 [QSA,L]
 	RewriteRule ^courses/([^/]+)/index.php$ main/course_home/course_home.php?cDir=$1 [QSA,L]
+	RewriteRule ^courses/([^/]+)/document/certificates/(.*)$ app/courses/$1/document/certificates/$2 [QSA,L]
 	RewriteRule ^courses/([^/]+)/document/(.*)$ main/document/download.php?doc_url=/$2&cDir=$1 [QSA,L]
+	RewriteRule ^courses/([^/]+)/scorm/(.*)$ main/document/download_scorm.php?doc_url=/$2&cDir=$1 [QSA,L]
 	RewriteRule ^courses/([^/]+)/work/(.*)$ main/work/download.php?file=work/$2&cDir=$1 [QSA,L]
-	RewriteRule ^courses/([^/]+)/upload/(.*)$ main/courses/$1/upload/$2 [QSA,L]
-	RewriteRule ^courses/([^/]+)/course-pic85x85.png$ main/courses/$1/course-pic85x85.png [QSA,L]
+	RewriteRule ^courses/([^/]+)/upload/(.*)$ app/courses/$1/upload/$2 [QSA,L]
+	RewriteRule ^courses/([^/]+)/course-pic85x85.png$ app/courses/$1/course-pic85x85.png [QSA,L]
 	RewriteRule ^courses/([^/]+)/course-pic.png$ app/courses/$1/course-pic.png [QSA,L]
+	RewriteRule ^main/upload/users/(.*)/(.*)/my_files/(.*)$ app/upload/users/$1/$2/my_files/$3 [QSA,L]
 	RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L]
-    RewriteRule "^badge/(\d{1,})/user/(\d{1,})$" main/badge/issued.php?skill=$1&user=$2 [L]
+    RewriteRule ^badge/(\d{1,})/user/(\d{1,}) main/badge/issued.php?skill=$1&user=$2 [L]
+	RewriteRule ^main/admin/$ main/admin/index.php [QSA,L]
     RewriteRule ^main/exercice/(.+)$ main/exercise/$1 [QSA,L]
     RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L]
+	RewriteRule ^courses/(.*)$ app/courses/$1 [QSA,L]
   &lt;/Directory&gt;
 </pre>
 <h3>Nginx</h3>
@@ -769,7 +800,8 @@ Ce sont uniquement les redirections à placer dans un bloc server{}, comme les a
   location / {
     rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
     rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last;
-    rewrite ^/badge/(\d+)/user/(\d+)$ /main/badge/issued.php?skill=$1&user=$2 last;
+    rewrite ^/skill/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last;
+    rewrite ^/badge/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last;
     try_files $uri @rewrite;
   }
 
@@ -785,6 +817,7 @@ Ce sont uniquement les redirections à placer dans un bloc server{}, comme les a
     rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last;
     rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last;
     rewrite ^/session/([^/]+)/about/?$ /main/session/about.php?session_id=$1 last;
+    rewrite ^/badge/([^/]+) /main/badge/issued.php?issue=$1 last;
     rewrite ^/main/exercice/(.+)$ /main/exercise/$1 last;
     rewrite ^/main/newscorm/(.+)$ /main/lp/$1 last;
 

+ 1 - 2
documentation/installation_guide_it_IT.html

@@ -5,8 +5,6 @@
   <link rel="stylesheet" href="../web/assets/bootstrap/dist/css/bootstrap.css" type="text/css" media="screen,projection" />
   <link rel="stylesheet" href="default.css" type="text/css" media="screen,projection" />
   <link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" />
-  <link href="js/prettify.css" type="text/css" rel="stylesheet" />
-  <script src="js/prettify.js" type="text/javascript"></script>
 
 </head>
 <body>
@@ -37,6 +35,7 @@
 
 <div class="container">
 <h1>Guida di installazione di Chamilo LMS 1.9</h1>
+  <p class="p1"><span class="s1">For more up-to-date guides, please check the <a href="installation_guide.html">english version of this guide</a></span></p>
 <p class="p1"><span class="s1">Grazie per aver scaricato Chamilo</span></p>
 <ul>
   <li class="li2"><span class="s1">Testa le funzionalità di Chamilo nel <a href="http://campus.chamilo.org/"><span class="s2">Free Campus</span></a></span></li>

+ 2 - 3
index.php

@@ -115,9 +115,8 @@ if (!api_is_anonymous()) {
     }
 }
 
-$hot_courses = null;
-$announcements_block = null;
-
+$hot_courses = '';
+$announcements_block = '';
 
 // Display the Site Use Cookie Warning Validation
 $useCookieValidation = api_get_setting('cookie_warning');

+ 1 - 1
main/admin/access_url_add_courses_to_url.php

@@ -8,7 +8,7 @@
 *	@author Julio Montoya <gugli100@gmail.com>
 */
 $cidReset = true;
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 
 $this_section=SECTION_PLATFORM_ADMIN;
 

+ 1 - 1
main/admin/access_url_add_usergroup_to_url.php

@@ -8,7 +8,7 @@
 *	@author Julio Montoya <gugli100@gmail.com>
 */
 $cidReset = true;
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 $this_section = SECTION_PLATFORM_ADMIN;
 
 api_protect_global_admin_script();

+ 1 - 1
main/admin/access_url_add_users_to_url.php

@@ -8,7 +8,7 @@
 *	@author Julio Montoya <gugli100@gmail.com>
 */
 $cidReset = true;
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 $this_section = SECTION_PLATFORM_ADMIN;
 
 api_protect_global_admin_script();

+ 1 - 1
main/admin/access_url_check_user_session.php

@@ -6,7 +6,7 @@
 */
 /*		INIT SECTION */
 $cidReset = true;
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 
 // setting the section (for the tabs)
 $this_section = SECTION_PLATFORM_ADMIN;

+ 4 - 4
main/admin/access_url_edit.php

@@ -5,7 +5,7 @@
  * 	@author Julio Montoya <gugli100@gmail.com>
  */
 $cidReset = true;
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 $this_section = SECTION_PLATFORM_ADMIN;
 
 api_protect_global_admin_script();
@@ -24,10 +24,10 @@ if ($form->validate()) {
         $url_array = $form->getSubmitValues();
         $url = Security::remove_XSS($url_array['url']);
         $description = Security::remove_XSS($url_array['description']);
-        $active = intval($url_array['active']);
-        $url_id = $url_array['id'];
+        $active = isset($url_array['active']) ? intval($url_array['active']) : 0;
+        $url_id = isset($url_array['id']) ? intval($url_array['id']) : 0;
         $url_to_go = 'access_urls.php';
-        if ($url_id != '') {
+        if (!empty($url_id)) {
             //we can't change the status of the url with id=1
             if ($url_id == 1) {
                 $active = 1;

+ 1 - 1
main/admin/access_url_edit_course_category_to_url.php

@@ -8,7 +8,7 @@
 // resetting the course id
 $cidReset = true;
 
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 
 $xajax = new xajax();
 $xajax->registerFunction(array('searchCourseCategoryAjax', 'UrlManager', 'searchCourseCategoryAjax'));

+ 1 - 1
main/admin/access_url_edit_courses_to_url.php

@@ -7,7 +7,7 @@
 // resetting the course id
 $cidReset = true;
 
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 
 $xajax = new xajax();
 $xajax->registerFunction(

+ 1 - 1
main/admin/access_url_edit_usergroup_to_url.php

@@ -7,7 +7,7 @@
 // resetting the course id
 $cidReset = true;
 
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 
 $xajax = new xajax();
 $xajax->registerFunction(array('searchUserGroupAjax', 'UserGroup', 'searchUserGroupAjax'));

+ 1 - 1
main/admin/access_url_edit_users_to_url.php

@@ -7,7 +7,7 @@
 // resetting the course id
 $cidReset = true;
 
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 $xajax = new xajax();
 $xajax->registerFunction(array('search_users', 'Accessurledituserstourl', 'search_users'));
 

+ 1 - 1
main/admin/access_urls.php

@@ -8,7 +8,7 @@
  */
 
 $cidReset = true;
-require_once '../inc/global.inc.php';
+require_once __DIR__.'/../inc/global.inc.php';
 $this_section = SECTION_PLATFORM_ADMIN;
 
 //api_protect_admin_script();

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